2017-02-02 7 views
0

Я пытаюсь ускорить время выполнения моей хранимой процедуры. Одно внутреннее соединение, в частности, занимает около 5 секунд для выполнения. Я посмотрел на план исполнения, и казалось, что горло бутылки было на внутренней стороне.Как я могу улучшить производительность этой хранимой процедуры?

Я попытался создать несколько некустеризованных индексов, так как было 65% затрат на поиск индекса (некластеризованный).

Простите меня, если я не предоставил достаточную информацию, поскольку я не настолько привык к использованию индексов в sql.

Вот запрос, который занимает ~ 5 секунд для выполнения, как таблицы содержат много данных:

INSERT INTO TBL_1(TBL2.COLA, TBL4.COLA, TBL4.COLB, TBL4.COLC, TBL3.COLA) 
SELECT TBL2.COLA, TBL4.COLA, TBL4.COLB, TBL4.COLC, TBL2.COLB 
FROM TBL_2 TBL2 with(index(idx_tbl2IDX)) 
    INNER JOIN TBL_3 TBL3 with(index(idx_tbl3IDX)) 
     ON TBL2.COLB = TBL3.COLB 
    INNER JOIN TBL_4 TBL4 with(index(idx_tbl4IDX)) 
     ON TBL3.COLA = TBL4.COLD 
      AND TBL4.COLA % 1000 = TBL3.COLC 
      AND TBL4.COLE = 0 
WHERE TBL2.COLC = 1 

А вот мои индексы (я первоначально только создал один для TBL_4 так как именно там самый большой Стоимость в плане исполнения было, но я в конечном итоге создать один для каждой таблицы, чтобы увидеть, если он сделал никакой разницы, что он не сделал

CREATE NONCLUSTERED INDEX [idx_tbl4IDX] 
ON [dbo].TBL_4(COLD, COLA, COLE) 
INCLUDE (COLB, COLC); 

CREATE NONCLUSTERED INDEX [idx_tbl3IDX] 
ON [dbo].TBL_3 (COLB, COLA, COLC) 

CREATE NONCLUSTERED INDEX [idx_tbl2IDX] 
ON [dbo].TBL_2(COLB, COLC) 
INCLUDE (COLA); 

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

+0

Я голосую, чтобы закрыть как не по теме, поскольку в коде отсутствует «ошибка», она просто медленнее, чем желания OP. Я думаю, что этот вопрос лучше подходит для dba.stackexchange.com. На их странице справки говорится, что в тематические вопросы входят «Администрирование базы данных, включая настройку и резервное копирование/восстановление, расширенный запрос, включая оконные функции, динамический sql и производительность запросов», – DeanOC

ответ

0

Возможно разместить фактический план выполнения, но вполне вероятно, что это

AND TBL4.COLA % 1000 = TBL3.COLC 

вызывает медлительность. Порядок столбцов в индексе также может играть в этом, в зависимости от того, насколько большой ваш набор данных. Попробуйте упорядочить их от большинства до наименее избирательных. Например, если TBL4.COLE является значением 1/0, и их очень мало, то, возможно, сделайте первый столбец в вашем индексе.

0

Не зная количества строк, избирательности и т. Д., Действительно сложно сказать что-либо. Я хотел бы предложить

  1. Удалить все те with(index... (и никогда не возвращать их обратно)
  2. Обновление статистики для всех таблиц (например, UPDATE STATISTICS TBL_2 С FULLSCAN)
  3. Добавить все возможные индексы. Есть 6 для таблиц TBL_3 и TBL_4 и два для TBL_2.
  4. Запустите запрос, посмотрите, какие индексы используются и какое время.

Если время в порядке, вы можете просто удалить индексы, которые вам не нужны. Если это не так, вам, вероятно, нужно будет что-то сделать с % 1000. Вместо этого вы можете сделать расчетный упорный столбец и индекс.