Подтвердить что ты не робот

Как использовать Explain Plan для оптимизации запросов?

Мне поручено оптимизировать некоторые sql-запросы на работе. Все, что я нашел, указывает на использование Explain Plan для выявления проблемных областей. Проблема, которую я не могу точно определить, что объясняет мне план объяснения. Вы получаете Cost, Cardinality и байты.

Что это значит, и как я должен использовать это в качестве руководства. Являются ли низкие цифры лучше? Чуть лучше? Любой вход был бы весьма признателен.

Или, если у вас есть лучший способ оптимизировать запрос, мне было бы интересно.

4b9b3361

Ответ 1

Вы получаете больше, чем на самом деле, в зависимости от того, что вы делаете. Ознакомьтесь с этой объясните план. Я немного предполагаю, что вы используете Oracle и знаете, как запустить script, чтобы отобразить вывод плана. Что может быть более важно для начала, это смотреть на левую сторону для использования определенного индекса или нет и как этот индекс используется. Вы должны видеть такие вещи, как "(Полный)", "(по индексу Rowid)" и т.д., Если вы делаете объединения. Стоимость будет следующей вещью, на которую следует обратить внимание, при этом более низкие затраты будут лучше, и вы заметите, что если вы делаете соединение, которое не использует индекс, вы можете получить очень большую стоимость. Вы также можете прочитать подробности о столбцах .

Ответ 2

Я также предполагаю, что вы используете Oracle. И я также рекомендую вам проверить веб-страницу плана объяснения для стартеров. Существует много возможностей для оптимизации, но его можно узнать.

Несколько советов:

Во-первых, когда кто-то задачи вам нужно оптимизировать, они почти всегда ищут приемлемую производительность, а не конечную производительность. Если вы можете сократить время выполнения запроса с 3 минут до 3 секунд, не потейте, уменьшая его до 2 секунд, пока вас не попросят.

Во-вторых, выполните быструю проверку, чтобы убедиться, что запросы, которые вы оптимизируете, логически правильны. Это звучит абсурдно, но я не могу сказать вам, сколько раз меня просили совета по медленному запросу, только чтобы узнать, что он иногда давал неправильные ответы! И, как оказалось, отладка запроса часто также ускоряла его.

В частности, ищите фразу "Cartesian Join" в плане объяснения. Если вы видите это, шансы ужасно хорошие, что вы нашли непреднамеренное декартовое соединение. Обычным шаблоном для непреднамеренного декартового объединения является то, что предложение FROM отображает таблицы, разделенные запятой, и условия соединения находятся в предложении WHERE. За исключением того, что отсутствует одно из условий соединения, так что у Oracle нет выбора, кроме как выполнить декартовое соединение. С большими таблицами это катастрофа производительности.

Можно увидеть декартову Присоединиться в плане объяснения, где запрос логически корректен, но я сопоставляю это со старыми версиями Oracle.

Также найдите неиспользуемый составной индекс. Если первый столбец составного индекса не используется в запросе, Oracle может использовать индекс неэффективно или вообще не использовать. Позвольте мне привести пример:

Запрос:

select * from customers    
where
     State = @State
     and ZipCode = @ZipCode

(СУБД не был Oracle, поэтому синтаксис был другим, и я забыл оригинальный синтаксис).

Быстрый просмотр в индексах показал индекс для клиентов с колонками (Country, State, ZipCode) в указанном порядке. Я изменил запрос, чтобы прочитать

  select * from customers
   where Country = @Country
      and State = @State
      and ZipCode = @ZipCode

и теперь он длился около 6 секунд, а не около 6 минут, потому что оптимизатор смог использовать индекс для хорошего преимущества. Я спросил программистов о том, почему они не указали страну из критериев, и это был их ответ: они знали, что все адреса имеют страну равную "США", поэтому они решили, что могут ускорить запрос, оставив этот критерий!

К сожалению, оптимизация поиска базы данных на самом деле не такая же, как микросекунда для бритья от вычислительного времени. Это предполагает понимание дизайна базы данных, особенно индексов, и, по крайней мере, обзор того, как оптимизатор выполняет свою работу.

Как правило, вы получаете лучшие результаты от оптимизатора, когда вы научитесь сотрудничать с ним, а не пытаетесь перехитрить его.

Удачи в скорости при оптимизации!

Ответ 3

У вас есть нечеткий конец леденца.

Нет абсолютно никакого способа изолировать, без лишней информации и опыта, взглянуть на план объяснений и определить, что (если что-либо) вызывает менее оптимальную производительность. Если настройка запроса может быть уменьшена до 10-ступенчатого процесса, это будет сделано автоматическим процессом. Я собирался перечислить все, что вам нужно понять, чтобы быть эффективными в этом, но это был бы очень длинный список.

единственный короткий ответ, о котором я могу думать... - это поиск шагов в плане, которые проходят через больше байтов, чем вы предполагали. Затем подумайте о том, как вы можете уменьшить это число... с помощью индекса или разбиения.

Серьезно, возьмите книгу Джонатана Льюиса об основанных на стоимости Oracle Fundementals

Получите книгу Tom Kyte по базе данных Oracle. Архитектура и арендовать каюту в лесу в течение нескольких недель.

Ответ 4

Это обширная область знаний (ака черное искусство).

Обычно я использую такой подход:

  • Запустите запрос SQL,
  • Получить реальный план (посмотрите dbms_xplan),
  • Сравните оценочное количество строк (мощность) и фактическое количество строк. Большая разница указывает на необходимость исправления проблемы (например, индекс, гистограмма).
  • Рассмотрим, можете ли вы создать индекс для ускорения части процесса (обычно, когда вы концептуально думаете, что план должен идти первым). Попробуйте некоторые индексы.

Вам нужно понять влияние O() разных индексов в контексте того, что вы запрашиваете в базе данных. Это поможет вам понять структуры данных, такие как b-деревья, хэш-таблицы и т.д. Затем создайте индекс, который может работать и повторять процесс.

Если Oracle решит не использовать ваш индекс, примените подсказку INDEX() и посмотрите на новый план. Стоимость будет больше, чем план, который он выбрал - вот почему он не выбрал ваш индекс. Предполагаемый план может привести к некоторому пониманию того, почему ваш индекс не очень хорош.

Ответ 5

Этот вопрос и последующие ответы были очень полезны для меня в настройке моих запросов! Очень ценю сообщество :) Я бы определенно потратил время на чтение следующих книг (как предложил Марк Брейди в своем ответе): книга Джонатана Льюиса об основанных на стоимости основах Oracle и книга Tom Kyte по базе данных Oracle Architecture