2012-08-16 3 views
0

Мне задали следующий вопрос: что бы вы изучили, если хотите улучшить производительность хранимой процедуры? Хранимая процедура возвращает некоторое значение и имеет три объединения. Кроме того, чтобы убедиться, что соединения хорошо написаны, что можно сделать, чтобы сделать его лучше? Это был общий вопрос, и код не был предоставлен. Любые идеи?Производительность SQL для возвращаемой хранимой процедуры

ответ

0

Есть много вещей, которые вы можете сделать, чтобы оптимизировать процедуры, но это звучит как ваш SQL заявление довольно просто. Некоторые вещи, на которые следует обратить внимание:

  • Встроенные функции. Это может заставить SQL выполнить оценку строки за строкой и замедлить работу
  • Преобразование данных в операторы объединения. Они могут запретить использование индексов.
  • Убедитесь, что колонки соединены в/в, где индексируется положение (для больших наборов данных)

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

SQL Optimizations School

+0

встроенные функции отличаются от курсоров правильно? курсоры также строят ряд за строкой. спасибо за сайт, это отличный источник – sheidaei

+0

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

2

Проверьте индексы на таблицах, используемых в соединениях. В частности, столбцы, используемые в индексированных соединениях?

Пример -

SELECT  * 
FROM  SomeTable a 
    JOIN SomeOtherTable b on a.ItemId = b.ItemId 

Если эти таблицы большие, индексирование ItemId в обеих таблицах, как правило, помогает производительности много.

Вы должны сделать то же самое для любых столбцов, которые используются в предложении WHERE, если в вашем запросе есть один.

WHERE a.ProductId = @SomeVariableYouPassedToTheStoredProc 

Индексирование ProductId может помочь в этом случае.

Производительность запроса - это то, что вы могли бы войти в отверстие кролика, но это логичное (и быстрое) место для начала.

+0

спасибо индекса, за исключением, что я не могу думать ни о чем в общем, все они запрос конкретным, как с помощью TINYINT вместо Int и так далее, не так ли? – sheidaei

0

Тот факт, что это хранимая процедура, имеет мало общего с ней. Оптимизируйте sql внутри.

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

Скопируйте sql из proc в подходящий инструмент, приставьте его Explain, чтобы узнать, что происходит.

+0

, так что это не имеет ничего общего с возвращаемыми значениями, верно? вы говорите о sql в самой хранимой процедуре. – sheidaei

+0

Да, ну sql внутри него. По сути, все хранимые процедуры - это именованный и предварительно скомпилированный кусок sql с некоторыми обрезками для передачи значений внутри и снаружи. –

0

Предполагаю, что есть другие варианты. Например: 1. Каждое из этих объединений может использовать условия ограничения, которые выглядят как 'и permited_used_name = (выберите user_name из user_list where)'. Значение может быть получено один раз во время запуска процедуры (я имею в виду первую строку процедуры), чтобы не перегружать БД многими подобными запросами. 2. Начиная с Oracle11, вы можете объявить функцию как функцию с кешированными результатами (т. Е. Функция вычисляется один раз и не пересчитывается каждый раз при ее вызове), определяя набор таблиц, который изменяет недействительный кеш.

В любом случае вопрос в основном зависит от БД.

+0

Полезно знать о кешировании в Oracle11, можете ли вы сослаться на хороший пример этого онлайн? – sheidaei

0

Запустите анализатор запросов на утверждение SQL

+0

Спасибо, это может быть хорошей идеей, не подумал об этом – sheidaei

Смежные вопросы