Некоррелиремые скалярные подзапросы

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
Самохвалов Григорий

Некоррелиремые скалярные подзапросы

Сообщение Самохвалов Григорий » 22 дек 2004, 12:56

Используя FB1.5 обнаружил, что некоррелируемые скалярные подзапросы вычисляются не единожды, а так часто, как к ним происходит обращение.

Тесты делались на запросе:

SELECT J1.ID FROM TS_OPERATIONS J1 WHERE J1.SUMALL=
(SELECT MAX(J3.SUMALL*J4.SUMMA) FROM TS_OPERATIONS_DOP J4 JOIN TS_OPERATIONS J3 ON J4.IDLINK=J3.ID)

где в таблице TS_OPERATIONS 7 записей, а в TS_OPERATIONS_DOP - 14. Статистика выдала 98 чтений из TS_OPERATIONS_DOP, 56 из TS_OPERATIONS, т.е. как я понимаю

7 раз по TS_OPERATIONS + 7 * (14 по TS_OPERATIONS_DOP и 7 по TS_OPERATIONS)

Вопрос, будет ли это устрено в какой-нибудь в ближайшей перспективе или лучше не мучатся и разбивать такие запросы?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 дек 2004, 16:07

лучше хранить промежуточные агрегаты (суммы). я бы MAX/MIN вообще запретил.
однако, я смутно понимаю (скорее не понимаю) запрос.
Хранятся некие числа (суммы). Потом берем другую таблицу, перемножаем в ней 2 столбца, и ищем, где максимальному числу соответствует конкретная сумма???

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 22 дек 2004, 20:35

Насчет выполнения подзапросов все было хорошо описано на krista.ru, с тех пор ничего существенно не изменилось в плане подзапросов.

Если под "ближайшей перспективой" подразумевается FB2, то ответ отрицательный.

Самохвалов Григорий

Сообщение Самохвалов Григорий » 22 дек 2004, 22:14

kdv писал(а):однако, я смутно понимаю (скорее не понимаю) запрос.
Правильно что не понимаешь. Он "от балды". Я бы мог привести какой-нибудь запрос попроще, но просто смутно надеялся, что все дело в конкретном подзапросе. Теперь надежды отпали и некоррелированные подзапросы использовать не буду.

Самохвалов Григорий

Сообщение Самохвалов Григорий » 22 дек 2004, 22:24

dimitr писал(а):Насчет выполнения подзапросов все было хорошо описано на krista.ru, с тех пор ничего существенно не изменилось в плане подзапросов.
Читал... Вот только в этой статье говорится что скалярные подзапросы выполняются единократно. Цитата: "...В скалярном контексте InterBase действительно принимает во внимание, коррелированный подзапрос, или нет. Если нет, то запрос вызывается единожды, результат (одно значение) запоминается, и используется при отработке внешнего запроса примерно так же, как обычный параметр...". Может так и действительно было на предыдущих версиях Interbase, просто такая фича где-нибудь потерялась?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 10 янв 2005, 21:18

Просто хотел заметить, что вопрос пока что остается открытым. Ближайшее время нет возможности этим серъезно заняться, но как только дойду до этого, вернусь сюда и доложу результаты.

Ответить