Как использовать план объяснения для оптимизации запросов? - PullRequest
19 голосов
/ 24 октября 2008

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

Что это означает, и как я должен использовать это как руководство. Низкие числа лучше? Высоко лучше? Любой вклад будет принята с благодарностью.

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

Ответы [ 4 ]

8 голосов
/ 24 октября 2008

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

7 голосов
/ 25 октября 2008

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

Далее следуют несколько советов:

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

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

В частности, ищите фразу «Декартово соединение» в плане объяснения. Если вы видите это там, очень велики шансы, что вы нашли непреднамеренное декартово соединение. Обычный шаблон для непреднамеренного декартового объединения состоит в том, что в предложении 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 минут, потому что оптимизатор смог использовать индекс с хорошим преимуществом. Я спросил программистов приложений, почему они не указали страну в критериях, и это был их ответ: они знали, что все адреса имеют страну, равную «США», поэтому они решили, что могут ускорить запрос, оставив этот критерий!

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

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

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

6 голосов
/ 25 октября 2008

У тебя пушистый конец леденца.

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

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

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

Получите книгу Тома Кайта об архитектуре базы данных Oracle и арендуйте домик в лесу на несколько недель.

4 голосов
/ 25 октября 2008

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...