Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Veterok
- Сообщения: 10
- Зарегистрирован: 30 мар 2005, 10:47
Сообщение
Veterok » 30 мар 2005, 10:58
Всем привет
Нарвался на нездоровую вещь: есть две таблицы и view
CREATE TABLE A (
CODE_A INTEGER NOT NULL,
NAME_A VARCHAR (70),
CONSTRAINT ID_A PRIMARY KEY(CODE_A));
CREATE TABLE B (
CODE_B INTEGER NOT NULL,
NAME_B VARCHAR (70),
CONSTRAINT ID_B PRIMARY KEY(CODE_B));
CREATE VIEW V_A_AND_B(
CODE,
NAME)
AS
SELECT CODE_A,
NAME_A
FROM A
UNION ALL
SELECT CODE_B,
NAME_B
FROM B;
Нездоровая вещь в том, что при выполнении запроса
SELECT *
FROM V_A_AND_B
WHERE CODE = 1
оптимизатор не берет индексы ID_A и ID_B, хотя должен, как это делает Oracle. Куда бежать, кого стрелять?

-
McArty
- Сообщения: 56
- Зарегистрирован: 14 янв 2005, 09:31
Сообщение
McArty » 30 мар 2005, 15:31
Veterok писал(а):Всем привет
Нарвался на нездоровую вещь: есть две таблицы и view
CREATE TABLE A (
CODE_A INTEGER NOT NULL,
NAME_A VARCHAR (70),
CONSTRAINT ID_A PRIMARY KEY(CODE_A));
CREATE TABLE B (
CODE_B INTEGER NOT NULL,
NAME_B VARCHAR (70),
CONSTRAINT ID_B PRIMARY KEY(CODE_B));
CREATE VIEW V_A_AND_B(
CODE,
NAME)
AS
SELECT CODE_A,
NAME_A
FROM A
UNION ALL
SELECT CODE_B,
NAME_B
FROM B;
Нездоровая вещь в том, что при выполнении запроса
SELECT *
FROM V_A_AND_B
WHERE CODE = 1
оптимизатор не берет индексы ID_A и ID_B, хотя должен, как это делает Oracle. Куда бежать, кого стрелять?

Попробуй так
CREATE VIEW V_A_AND_B(
CODE,
NAME)
AS
SELECT CODE_A,
NAME_A
FROM A
where CODE_A >0
UNION ALL
SELECT CODE_B,
NAME_B
FROM B
where CODE_B >0;
Вроде как можно заставить использовать индексы
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 30 мар 2005, 15:35
я бы не сказал, что это вещь нездоровая, т.к. where на view накладывается снаружи, то есть к результату выполнения запроса view. а результат этот получен операцией union all, то есть, является виртуальным результатом слияния двух таблиц (запросов).
То есть, ситуация похожая на выборку из процедуры, когда для сервера процедура это черный ящик. И фильтрация результата процедуры может быть произведена только снаружи.
Хотя, в этом плане в FB 2.0 определенные подвижки есть (насчет view).
-
Veterok
- Сообщения: 10
- Зарегистрирован: 30 мар 2005, 10:47
Сообщение
Veterok » 30 мар 2005, 15:40
McArty писал(а):Veterok писал(а):Всем привет
Нарвался на нездоровую вещь: есть две таблицы и view
CREATE TABLE A (
CODE_A INTEGER NOT NULL,
NAME_A VARCHAR (70),
CONSTRAINT ID_A PRIMARY KEY(CODE_A));
CREATE TABLE B (
CODE_B INTEGER NOT NULL,
NAME_B VARCHAR (70),
CONSTRAINT ID_B PRIMARY KEY(CODE_B));
CREATE VIEW V_A_AND_B(
CODE,
NAME)
AS
SELECT CODE_A,
NAME_A
FROM A
UNION ALL
SELECT CODE_B,
NAME_B
FROM B;
Нездоровая вещь в том, что при выполнении запроса
SELECT *
FROM V_A_AND_B
WHERE CODE = 1
оптимизатор не берет индексы ID_A и ID_B, хотя должен, как это делает Oracle. Куда бежать, кого стрелять?

Попробуй так
CREATE VIEW V_A_AND_B(
CODE,
NAME)
AS
SELECT CODE_A,
NAME_A
FROM A
where CODE_A >0
UNION ALL
SELECT CODE_B,
NAME_B
FROM B
where CODE_B >0;
Вроде как можно заставить использовать индексы
Спасибо за ответ, но хотелось бы не наколоть оптимизатор, а реально заставить запрос работать при этих условиях быстро
-
Veterok
- Сообщения: 10
- Зарегистрирован: 30 мар 2005, 10:47
Сообщение
Veterok » 30 мар 2005, 15:45
kdv писал(а):я бы не сказал, что это вещь нездоровая, т.к. where на view накладывается снаружи, то есть к результату выполнения запроса view. а результат этот получен операцией union all, то есть, является виртуальным результатом слияния двух таблиц (запросов).
То есть, ситуация похожая на выборку из процедуры, когда для сервера процедура это черный ящик. И фильтрация результата процедуры может быть произведена только снаружи.
Хотя, в этом плане в FB 2.0 определенные подвижки есть (насчет view).
Готов поспорить, что вещь эта все-таки нездоровая. Скорее всего спорить надо с разработчиками, т.к. имеет смысл сначала ограничить все объединенные запросы, а потом их объединять (что и делают другие СУБД). А что за подвижки насчет view в FB 2.0?
-
McArty
- Сообщения: 56
- Зарегистрирован: 14 янв 2005, 09:31
Сообщение
McArty » 30 мар 2005, 15:47
Что в FB 2 ?
p.s. Чаго ждать? Качаем,ставим и тестим.
-
McArty
- Сообщения: 56
- Зарегистрирован: 14 янв 2005, 09:31
Сообщение
McArty » 30 мар 2005, 16:06
Если интересно, то FB2 индексы с View и UNION ALL - использует как надо.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 30 мар 2005, 16:51
Скорее всего спорить надо с разработчиками, т.к. имеет смысл сначала ограничить все объединенные запросы, а потом их объединять
это не интерпретатор, а компилятор. запрос во View исполняется уже в скомпилированном виде. То есть сервер должен сконструировать blr из имеющегося во view и прилепленного снаружи.
тем более что про FB 2 я уже написал. Прежде чем спорить с разработчиками надо сначала ознакомиться с предметом, иметь представление о методах доступа в РСУБД, об архитектуре сервера (в части BLR) и знать об операциях над множествами.
-
Veterok
- Сообщения: 10
- Зарегистрирован: 30 мар 2005, 10:47
Сообщение
Veterok » 30 мар 2005, 17:23
kdv писал(а):Скорее всего спорить надо с разработчиками, т.к. имеет смысл сначала ограничить все объединенные запросы, а потом их объединять
это не интерпретатор, а компилятор. запрос во View исполняется уже в скомпилированном виде. То есть сервер должен сконструировать blr из имеющегося во view и прилепленного снаружи.
тем более что про FB 2 я уже написал. Прежде чем спорить с разработчиками надо сначала ознакомиться с предметом, иметь представление о методах доступа в РСУБД, об архитектуре сервера (в части BLR) и знать об операциях над множествами.
согласен
спасибо
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 31 мар 2005, 00:38
"не корысти ради...", и не в отношении конкретного вопроса. Но уж очень часто бывает, когда "почему оно не делает так, как я хочу". А оно "не делает" просто потому, что не существует математических способов осуществить подобное...
тем не менее, лично я сомневался, что для view подобное сделать можно. Ан нет, сотворили....
-
dimitr
- Разработчик Firebird
- Сообщения: 888
- Зарегистрирован: 26 окт 2004, 16:20
Сообщение
dimitr » 31 мар 2005, 09:17
Оптимизируется всегда уже готовый BLR, будь то вьюха или обычный клиентский запрос. Вернее, дерево исполнения, построенное на основании парсинга этого BLR. И это дерево может корректироваться компилятором и оптимизатором.
Внешние условия над простыми view/derived table дописываются к их WHERE-кляузе. Внешние условия над UNION дописываются к WHERE всех подзапросов. Внешние условия над GROUP BY пропихиваются внутрь группировки, если применены к полям группировки, и т.п.