Я также предполагаю, что вы используете Oracle. И я также рекомендую вам проверить веб-страницу плана объяснения для стартеров. Существует много оптимизаций, но его можно узнать.
Несколько советов следовать:
Во-первых, когда кто-нибудь задачи, оптимизировать, они почти всегда ищут приемлемую производительность, а не конечной производительности. Если вы можете сократить время выполнения запроса с 3 минут до 3 секунд, не потейте, уменьшая его до 2 секунд, пока вас не попросят.
Во-вторых, выполните быструю проверку, чтобы убедиться, что запросы, которые вы оптимизируете, логически правильны. Это звучит абсурдно, но я не могу сказать вам, сколько раз меня просили совета по медленному запросу, только чтобы узнать, что он иногда давал неправильные ответы! И, как оказалось, отладка запроса часто также ускоряла его.
В частности, ищите фразу «Cartesian Join» в плане объяснения. Если вы видите это, шансы ужасно хорошие, что вы нашли непреднамеренное декартовое соединение. Обычным шаблоном для непреднамеренного декартового объединения является то, что предложение FROM отображает таблицы, разделенные запятой, и условия соединения находятся в предложении WHERE. За исключением того, что отсутствует одно из условий соединения, так что у Oracle нет выбора, кроме как выполнить декартовое соединение. С большими таблицами это катастрофа производительности.
Можно увидеть картезианскую вставку в плане объяснения, где запрос логически корректен, но я ассоциирую это со старыми версиями Oracle.
Также ищите неиспользуемый составной индекс. Если первый столбец составного индекса не используется в запросе, Oracle может использовать индекс неэффективно или вообще не использовать. Позвольте мне привести пример:
Запрос был:
select * from customers
where
State = @State
and ZipCode = @ZipCode
(СУБД не Oracle, поэтому синтаксис был другим, и я забыл оригинальный синтаксис).
Быстрый просмотр в индексах показал индекс для клиентов со столбцами (Страна, штат, ZipCode) в указанном порядке. Я изменил запрос читать
select * from customers
where Country = @Country
and State = @State
and ZipCode = @ZipCode
и теперь он побежал в течение примерно 6 секунд, а не около 6 минут, потому что оптимизатор мог использовать индекс для хорошего преимущества. Я спросил программистов о том, почему они не указали страну из критериев, и это был их ответ: они знали, что все адреса имеют страну равную «США», поэтому они решили, что могут ускорить запрос, оставив этот критерий!
К сожалению, оптимизация поиска базы данных на самом деле не такая же, как микросекунда для бритья от вычислительного времени. Это предполагает понимание дизайна базы данных, особенно индексов, и, по крайней мере, обзор того, как оптимизатор выполняет свою работу.
Как правило, вы получаете лучшие результаты от оптимизатора, когда научитесь сотрудничать с ним, а не пытаетесь перехитрить его.
Удача при достижении скорости при оптимизации!
Я ценю вам помощь, и особенно ссылки. Сейчас это делается для меня. Спасибо еще раз за помощь. –
Объединяется, не используя индексы, может быть плохо, они могут быть абсолютно лучшими.Все это зависит. не делайте этого, не пытайтесь устранить каждое полное сканирование таблицы с помощью индексов. –