Страница 1 из 1

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

Добавлено: 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)

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

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

Добавлено: 22 дек 2004, 20:35
dimitr
Насчет выполнения подзапросов все было хорошо описано на krista.ru, с тех пор ничего существенно не изменилось в плане подзапросов.

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

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

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

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