2012-03-12 5 views
0

Просто пытайтесь оптимизировать SQL-запрос.Оптимизация запроса GROUP BY

SELECT Code, COUNT(*) 
FROM  tblData 
WHERE ListID = 380 
GROUP BY Code 

В таблице содержится 10 миллионов записей. Таким образом, запрос обычно занимает 4-5 секунд, чтобы найти запись в SQL SERVER 2008 R2. Я нашел другой способ выразить это:

SELECT a.Code, COUNT(*) 
FROM ( SELECT * 
      FROM tblData 
      WHERE ListID = 380 
     ) a 
GROUP BY a.Code 

Хотя в моих тестах он дает результаты в одно и то же время. Но я задаюсь вопросом, быстрее ли это предыдущий или наоборот. Есть идеи?

+2

Что вы проиндексировали и что скажет вам планировщик/анализатор запросов? – YXD

+0

Кстати, нет таких вещей, как * SQL Server 2010 *. Вы имели в виду * SQL Server 2008 R2 * (который был выпущен в 2010 году)? –

+0

Да, я имею в виду это. Я действительно путаюсь с его версией 10.50..lol Спасибо за исправление. –

ответ

4

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

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

+0

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

+2

Может быть, что индекс '(ListID, Code)', предложенный @Mitch, поможет. Кроме того, я не вижу, как его улучшить. Если у вас мало значений «ListID», и вы готовы физически разделить 'tblData' на несколько таблиц и запросить их самостоятельно, чтобы вы избежали предложения' where' (отказ от ответственности: это уродливо!) – cornuz

+0

Okak, хотя я имеют индекс по обоим полям отдельно, но я создаю третий индекс для комбинации кода и ListID. Это оптимизирует мой запрос, чтобы занять меньше секунды. –

0

В студии управления выберите оба запроса и нажмите «Показать примерный план выполнения». Как только одна стоимость запроса отличается от 50%, у вас есть победитель (и более слабый).

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

3

Как сказано в сообщении @cornuz и @Wim, эти два запроса должны быть эквивалентными.

Однако, вы можете обнаружить, что с индексом два столбца (на ListId затем код) будет улучшить производительность совсем немного, потому что

  1. база данных будет просто посетить индекс, а не таблицы; и
  2. индекс не должен был бы делать дополнительный сорт, чтобы объединить строки, которые нужно учитывать вместе.
Смежные вопросы