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