[SQL] Имеет ли смысл оптимизировать запросы?
Однако тут есть свои подводные камни. Дело в том, что ЛЮБОЙ запрос будет распарсен так и только в той последовательности, как решит внутренний оптимизатор. (читай "как лягут звезды" ).
Несмотря на это, некоторая свобода действий все же остается. К примеру, мы можем вырубить использование индекса (если это даст ускорение в производительности конечно) простым применением некоторой фиктивной функции, вроде прибавления нуля или пустой строки.
У Оракла есть механизм просмотра плана выполнения запроса (аналог EXPLAIN в постгрес постарайся чаще им пользоваться
Однако тут есть свои подводные камни. Дело в том, что ЛЮБОЙ запрос будет распарсен так и только в той последовательности, как решит внутренний оптимизатор. (читай "как лягут звезды" ).
Про hints ты, конечно, не слышал ничего
Но во-первых, это только РЕКОМЕНДАЦИИ для оракла (т.е. просто увеличивается удельный вес сответствующей ветки дерева, правда на докуя а во вторых "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)
Я лично видел, как использование хинтов позволило сократить время выполнения запроса на несколько порядков (с оценочного времени в ~8 часов для сложного запроса на таблице с ~30.000.000 записями до ~20 секунд). Так что без них, ИМХО, никак!
Это есть величина, извлекаемая алхимическим образом из статистических данных по запросам, больше чем в половине случаев не совпадающая с реальным временем.
Вот пример из жизни одного оптимизатора:
query1 : cost=0.000001
query2 : cost=0.000001
При этом время работы query1 = 0.2 сек., а query2 = 6552 сек.
query1 и query2 - один и тот же запрос, с использоваинем индекса(query2) и без испольщования(query1).
А потом сидишь и думаешь, почему запрос тормозит...
Ну а по поводу вырубания индексов и прочего тюнинга я уже говорил.
Оставить комментарий
ifani
Уже сколько времени пишу на PL/SQL, но до сих пор толком не могу понять, имеет ли смысл (да и вообще возможно ли это) пытаться оптимизировать запросы? Я имею ввиду не количество джойнов - понятно, что чем меньше, тем лучше - имеется виду, например, запросы такого типа:Например в данном запросе в первых двух строчках проверяется наличие записи о главе в двух сторонних таблицах. Как Оракл проведёт запрос? Он будет брать каждую главу и проверять, есть ли она в таблице? Или он, всё таки догадается, что можно взять только те главы, записи о которых есть в этих таблицах (это всё-таки меньше а затем для них проверить всё остальное? Можно было переписать запрос без exist'ов, явно указав порядок джойнов, но было бы плохо читаемо...
У кого какие мысли?
Или это я уже фигнёй страдаю?:о)