Как устранить проблемы с производительностью с помощью оператора SQL SQL - PullRequest
5 голосов
/ 19 сентября 2008

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

Обе схемы имеют 99% одинаковую структуру. Несколько столбцов имеют немного разные имена, кроме того, что они одинаковы. Операторы вставки практически одинаковы. План объяснения для одного дает стоимость 6, план объяснения для другого дает стоимость 7. Таблицы, включенные в оба набора операторов вставки, имеют абсолютно одинаковые индексы. Статистика была собрана для обеих схем.

Один оператор вставки вставляет 12 000 записей за 5 секунд.

Другой оператор вставки вставляет 25 000 записей за 4 минуты 19 секунд.

Количество вставляемых записей правильное. Меня смущает огромное неравенство во времени исполнения. Учитывая, что в плане объяснения ничего не выделяется, как бы вы определили причину этого несоответствия во время выполнения?

(я использую Oracle 10.2.0.4 на коробке Windows).

Редактировать: В результате проблема оказалась неэффективным планом запроса, включающим декартово слияние, которое не нужно было выполнять. Разумное использование индексных подсказок и подсказок хеш-соединения решило проблему. Теперь это занимает 10 секунд. Sql Trace / TKProf дал мне направление, поскольку я показал, сколько секунд занял каждый шаг в плане, и сколько строк генерировалось. Так TKPROF показал мне: -

Rows     Row Source Operation
-------  ---------------------------------------------------
  23690  NESTED LOOPS OUTER (cr=3310466 pr=17 pw=0 time=174881374 us)
  23690   NESTED LOOPS  (cr=3310464 pr=17 pw=0 time=174478629 us)
2160900    MERGE JOIN CARTESIAN (cr=102 pr=0 pw=0 time=6491451 us)
   1470     TABLE ACCESS BY INDEX ROWID TBL1 (cr=57 pr=0 pw=0 time=23978 us)
   8820      INDEX RANGE SCAN XIF5TBL1 (cr=16 pr=0 pw=0 time=8859 us)(object id 272041)
2160900     BUFFER SORT (cr=45 pr=0 pw=0 time=4334777 us)
   1470      TABLE ACCESS BY INDEX ROWID TBL1 (cr=45 pr=0 pw=0 time=2956 us)
   8820       INDEX RANGE SCAN XIF5TBL1 (cr=10 pr=0 pw=0 time=8830 us)(object id 272041)
  23690    MAT_VIEW ACCESS BY INDEX ROWID TBL2 (cr=3310362 pr=17 pw=0 time=235116546 us)
  96565     INDEX RANGE SCAN XPK_TBL2 (cr=3219374 pr=3 pw=0 time=217869652 us)(object id 272084)
      0   TABLE ACCESS BY INDEX ROWID TBL3 (cr=2 pr=0 pw=0 time=293390 us)
      0    INDEX RANGE SCAN XIF1TBL3 (cr=2 pr=0 pw=0 time=180345 us)(object id 271983)

Обратите внимание на строки, в которых выполняются операции MERGE JOIN CARTESIAN и BUFFER SORT. На это я обратил внимание на количество сгенерированных строк (более 2 миллионов!) И количество времени, затрачиваемого на каждую операцию (по сравнению с другими операциями).

Ответы [ 9 ]

4 голосов
/ 19 сентября 2008

Используйте средство трассировки SQL и TKPROF .

2 голосов
/ 19 сентября 2008

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

Я видел системы, где они сбрасывают индексы перед массовыми вставками и перестраивают в конце - и это быстрее.

1 голос
/ 22 сентября 2008

Я составил общий список проверяемых вещей, чтобы улучшить производительность в ответ на другой вопрос:

Любимые трюки настройки производительности

... Это может быть полезно в качестве контрольного списка, даже если он не специфичен для Oracle.

1 голос
/ 19 сентября 2008

Первое, что нужно понять, это то, что, как указано в в документации , отображаемая стоимость относится к одному из планов запроса. Затраты на 2 разных объяснения не сопоставимы. Во-вторых, затраты основаны на внутренней оценке. Как ни старался Oracle, эти оценки не точны. Особенно не тогда, когда оптимизатор плохо себя ведет. Ваша ситуация предполагает, что есть два плана запросов, которые, согласно Oracle, очень близки по производительности. Но которые, на самом деле, работают совсем по-другому.

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

Что дальше? Ну, есть множество стратегий, чтобы настроить плохие высказывания. Первый вариант, который я бы предложил, если вы работаете в Oracle 10g, - это попробовать их советник по настройке SQL , чтобы увидеть, покажет ли более детальный анализ ошибки Oracle в своих действиях. Затем он может сохранить этот план, и вы будете использовать более эффективный план.

Если вы не можете этого сделать или если это не сработает, вам нужно заняться такими вещами, как предоставление подсказок к запросам, наброски сохраненных вручную запросов и тому подобное. Это сложная тема. Вот где это помогает иметь настоящий DBA. Если вы этого не сделаете, тогда вы захотите начать читать документацию , но имейте в виду, что есть чему поучиться. (У Oracle также есть класс настройки SQL, который является или, по крайней мере, был очень хорошим. Хотя это не дешево.)

0 голосов
/ 27 декабря 2013

Когда производительность оператора SQL не соответствует ожидаемой / желаемой, я сначала проверяю план выполнения.

Хитрость в том, чтобы проверять вещи, которые не соответствуют ожиданиям. Например, вы можете найти сканирование таблицы, где вы думаете, что сканирование индекса должно быть быстрее или наоборот.

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

С помощью двух операторов для сравнения вы можете явно сравнить два плана выполнения, чтобы увидеть, чем они отличаются.

Из этого анализа я придумываю план выполнения, который, по моему мнению, должен подходить лучше. Это не точный план выполнения, а лишь некоторые важные изменения, которые я нашел, например: он должен использовать Index X или Hash Join вместо вложенного цикла.

Далее нужно выяснить, как заставить Oracle использовать этот план выполнения. Часто с помощью подсказок или создания дополнительных индексов, иногда меняя оператор SQL. Тогда конечно проверьте, что изменилось утверждение

а) все еще делает то, что должен

б) на самом деле быстрее

С b очень важно убедиться, что вы тестируете правильный вариант использования. Типичным падением ямы является разница между возвратом первого ряда и возвращением последнего ряда. Большинство инструментов показывают первые результаты, как только они становятся доступны, без прямого указания на то, что предстоит проделать дополнительную работу. Но если ваша фактическая программа должна обработать все строки, прежде чем она перейдет к следующему этапу обработки, это почти не имеет значения, когда появляется первая строка, это имеет значение только тогда, когда последняя строка доступна.

Если вы найдете лучший план выполнения, последний шаг - заставить вашу базу данных фактически использовать ее в реальной программе. Если вы добавили индекс, это будет часто работать из коробки. Подсказки являются опцией, но могут быть проблематичными, если библиотека создает оператор SQL, те из них часто не поддерживают подсказки. В крайнем случае вы можете сохранить и исправить планы выполнения для конкретных операторов SQL. Я бы избегал такого подхода, потому что его легко забыть, и через год какой-нибудь бедный разработчик поцарапает себе голову, почему заявление работает таким образом, что могло бы быть уместно с данными год назад, но не с нынешними данные ...

0 голосов
/ 30 апреля 2009

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

0 голосов
/ 23 сентября 2008

Еще одним хорошим справочником, представляющим общий метод настройки запросов, является книга SQL Tuning , написанная Дэном Тау.

0 голосов
/ 23 сентября 2008

SQL Trace и tkprof хороши, только если у вас есть доступ к этим инструментам. Большинство крупных компаний, в которых я работаю, не позволяют разработчикам получать доступ к чему-либо под Oracle Unix ID.

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

0 голосов
/ 19 сентября 2008

Я согласен с предыдущим постером, что SQL Trace и tkprof - хорошее место для начала. Я также настоятельно рекомендую книгу Оптимизация производительности Oracle , в которой рассматриваются аналогичные инструменты для отслеживания выполнения и анализа результатов.

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