[SQL] Имеет ли смысл оптимизировать запросы?

ifani

Уже сколько времени пишу на PL/SQL, но до сих пор толком не могу понять, имеет ли смысл (да и вообще возможно ли это) пытаться оптимизировать запросы? Я имею ввиду не количество джойнов - понятно, что чем меньше, тем лучше - имеется виду, например, запросы такого типа:


select qsts.id as qs
from chapter_version cv, node n, question_set qsts
where
-- Все главы курca
exists (select * from chapter_version_in_coursev where id_course_version=p_id_course and id_chapter_version=cv.id)
-- Kоторые включены в план
and exists (select * from plan_component where id_plan=p_id_plan and id_chapter_version=cv.id)
-- В которых есть тесты начальных знаний
and cv.id_node_for_pr_testing is not null
and cv.id_node_for_pr_testing=n.id
and n.node_type=2
-- Собственно, получаем этот тест
and qsts.id_node=n.id


Например в данном запросе в первых двух строчках проверяется наличие записи о главе в двух сторонних таблицах. Как Оракл проведёт запрос? Он будет брать каждую главу и проверять, есть ли она в таблице? Или он, всё таки догадается, что можно взять только те главы, записи о которых есть в этих таблицах (это всё-таки меньше а затем для них проверить всё остальное? Можно было переписать запрос без exist'ов, явно указав порядок джойнов, но было бы плохо читаемо...
У кого какие мысли?
Или это я уже фигнёй страдаю?:о)

skvoria

Фигней ты по крайней мере точно не страдаешь. Оптимизация запросов - отдельная широкая область, о которой начинаешь задумываться почему-то только тогда, когда БД вырастает до офигенных размеров
Однако тут есть свои подводные камни. Дело в том, что ЛЮБОЙ запрос будет распарсен так и только в той последовательности, как решит внутренний оптимизатор. (читай "как лягут звезды" ).
Несмотря на это, некоторая свобода действий все же остается. К примеру, мы можем вырубить использование индекса (если это даст ускорение в производительности конечно) простым применением некоторой фиктивной функции, вроде прибавления нуля или пустой строки.
У Оракла есть механизм просмотра плана выполнения запроса (аналог EXPLAIN в постгрес постарайся чаще им пользоваться

puare

Однако тут есть свои подводные камни. Дело в том, что ЛЮБОЙ запрос будет распарсен так и только в той последовательности, как решит внутренний оптимизатор. (читай "как лягут звезды" ).

Про hints ты, конечно, не слышал ничего

skvoria

Приколись, слышал
Но во-первых, это только РЕКОМЕНДАЦИИ для оракла (т.е. просто увеличивается удельный вес сответствующей ветки дерева, правда на докуя а во вторых "using Oracle hints can be very complicated and Oracle developers only use hints as a last resort, preferring to alter the statistics to change the execution plan." (C)

puare

Естессно... Но без хинтов на больших базах смерть!
Я лично видел, как использование хинтов позволило сократить время выполнения запроса на несколько порядков (с оценочного времени в ~8 часов для сложного запроса на таблице с ~30.000.000 записями до ~20 секунд). Так что без них, ИМХО, никак!

skvoria

Не слишком доверяй оценочному времени
Это есть величина, извлекаемая алхимическим образом из статистических данных по запросам, больше чем в половине случаев не совпадающая с реальным временем.
Вот пример из жизни одного оптимизатора:
query1 : cost=0.000001
query2 : cost=0.000001
При этом время работы query1 = 0.2 сек., а query2 = 6552 сек.
query1 и query2 - один и тот же запрос, с использоваинем индекса(query2) и без испольщования(query1).
А потом сидишь и думаешь, почему запрос тормозит...
Ну а по поводу вырубания индексов и прочего тюнинга я уже говорил.
Оставить комментарий
Имя или ник:
Комментарий: