Предложения по улучшению производительности подсчета для SQL-запроса? - PullRequest
2 голосов
/ 22 декабря 2009

У меня запрос, который выполняется очень долго из-за выбора, похожего на:

SELECT 
Count( Distinct t1.v1),
Count (Distinct 
Case t2.v1 When 'blah' then t1.v1
Else null
End ),
....
FROM t1
LEFT JOIN t2 ON t1.v3 = t2.v3
WHERE t1.myDate BETWEEN @start and @end
AND t2.v5 = @id

Кто-нибудь может предложить какие-нибудь хорошие методы для улучшения этой производительности?

Ответы [ 4 ]

3 голосов
/ 22 декабря 2009

Поскольку в этом запросе есть предикаты предложения No Where (без фильтров), он будет включать полное сканирование таблицы или сканирование индекса независимо от того, что вы делаете (если только внутреннее объединение не ограничивает набор результатов ...).

Таким образом, единственное улучшение, которое вы можете получить, это, возможно, повлиять на то, какой тип соединения выполняется. Чтобы повысить производительность объединения, убедитесь, что в столбцах t1.v3 и t2.v3 есть индекс ....

1 голос
/ 22 декабря 2009

Ваше левое соединение на t2 с фильтром на t2.v5 = @id меняет это на внутреннее соединение. Вам понадобится ...LEFT JOIN t2 ON t1.v3 = t2.v3 AND t2.v5 = @id...

Далее, какие у вас индексы? На основании того, что я вижу

  • t1: (mydate, v3) ВКЛЮЧИТЬ (v1)
  • t2: (v3, v5) ВКЛЮЧИТЬ (v1)

Вы также можете попробовать поменять расположение клавиш

Наконец, убедитесь, что все типы данных являются правильными и совпадают (даже во втором счетчике). Неявные преобразования снижают производительность.

1 голос
/ 22 декабря 2009

Сложно сказать без общей картины, чего вы пытаетесь достичь и т.д.

Но самое непосредственное, что нужно проверить на основе этого, - это индексы - есть ли у вас подходящие индексы (например, для t1.v3 / t2.v3)? Если у вас есть соответствующие индексы, они фрагментированы / статистика устаревшая?

Что говорит план выполнения?

0 голосов
/ 22 декабря 2009

Вы, вероятно, получаете 1 сканирование в t1 и 1 сканирование в t2, если вы получаете что-то еще, либо индексы не установлены надлежащим образом, либо вы не предоставили нам достаточно информации.

Если вы получаете 1 сканирование в t1 и 1 сканирование в t2, и вы думаете, что этот запрос близок к соответствующему решению (например, вы не можете получить нужную информацию из более быстрого запроса, который не похож на этот), может иметь оптимальный план.

...