2010-05-11 6 views
0

У меня есть простой вопрос с двумя вариантами получения количества строк на SQL-сервере (2005). Я использую VS 2005. Есть два варианта, чтобы получить количество:Подсчитывать строки против таблицы SQL Server (2005)?

SELECT id FROM Table1 WHERE dt >= startDt AND dt < endDt;; 

получить список идентификаторов из выше вызова в кэше, а затем я получаю подсчитываю List.Count. Другой вариант:

SELECT COUNT(*) FROM Table1 WHERE dt >= startDt AND dt < endDt; 

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

Я смущен тем, что Count () занимает больше времени, чем получение всех строк (это правда?). Не уверен, что вызов агрегации с Count () заставит SQL-сервер создавать временную таблицу или кеш на стороне сервера, и это приведет к низкой производительности, если таблица слишком велика? Я не уверен, что лучший способ получить счет?

ответ

1

Вы должны add an index на колонке dt, то это должно быть очень быстро.

CREATE INDEX ix_Table1_dt ON Table1 (dt) 

Создание индекса может занять много времени, если у вас много строк (и я предполагаю, что вы это делаете).

0

Как указывает Марк, добавьте индекс, а затем используйте COUNT (*). Вы передаете ОГРОМНОЕ количество данных в варианте 1, чтобы пересчитать его, а затем выбросить.

+0

В начало страницы ГДЕ dt> = startDt И dt TomTom

+0

не должно быть потому, что между ними должно быть WHERE dt> = startDt AND dt <= endDt; Взгляните на http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-does-between-work-with-dates-in-sql- почему он не умеет использовать между датами – SQLMenace

+0

I означает, что он НЕ должен, между включенным – SQLMenace

1

Помещенные индексы на вашем dt поле и использовать COUNT(id) (это предполагает, что идентификатор устанавливается как NOT NULL)

SELECT COUNT(id) FROM Table1 WHERE dt >= startDt AND dt < endDt; 

Кроме того, COUNT(id) против COUNT(*) должны на самом деле не имеет значения, в вашем случае.

+0

Между не совпадает с> = и <. it is > = и <= .. вы получите значение полуночи правого диапазона. Взгляните на http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-does-between-work-with-dates-in-sql- почему он не умеет использовать между датами – SQLMenace

+0

I дать согласие. Исправлена. –

1

Что происходит, когда вы делаете это

SELECT COUNT(id) FROM Table1 WHERE dt >= startDt AND dt < endDt; 

просто помните, что COUNT (ID) не учитывает значения NULL в то время как COUNT (*) делает

у вас есть индекс по столбцам в вашем ГДЕ статья?

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