количество строк в большой таблице - PullRequest
2 голосов
/ 21 апреля 2011
SELECT COUNT(*) FROM BigTable_1

Какой способ использовать для получения количества строк в таблице, если у меня более 1 миллиарда строк?

ОБНОВЛЕНИЕ: Например, если у нас есть «проблема тайм-аута» с запросом выше, есть ли способ его оптимизировать? Как это сделать быстрее?

Ответы [ 8 ]

4 голосов
/ 21 апреля 2011

Очень быстрая ОЦЕНКА:

выберите количество (*) из таблицы

Но не казни! Выделите код, нажмите ctl-l, чтобы вызвать план запроса. Затем наведите курсор на крайнюю левую стрелку. Появится желтое поле с приблизительным количеством строк.

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

:)

4 голосов
/ 21 апреля 2011

Если вам нужен точный счет, вы должны использовать COUNT (*)

Если вы в порядке с приблизительным подсчетом, вы можете использовать сумму строк в разделах

SELECT SUM (Rows)
FROM sys.partitions
WHERE 1=1
And index_id IN (0, 1)
And OBJECT_ID = OBJECT_ID('Database.schema.Table');

Если вы хотите быть смешным с вашим COUNT, вы можете сделать следующее

`select COUNT (1/0) from BigTable_1`
2 голосов
/ 21 апреля 2011

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

CREATE TABLE TABLE_COUNTS(TABLE_NAME VARCHAR, R_COUNT BIGINT DEFAULT 0); 
INSERT INTO TABLE_COUNTS('BigTable_1', 0); 

(для краткости я опущу добавление ключа и т. Д.)

Теперь настройте триггеры.

CREATE TRIGGER bt1count_1 AFTER INSERT ON BigTable_1 FOR EACH ROW 
BEGIN 
UPDATE TABLE_COUNTS SET R_COUNT=R_COUNT+1 WHERE TABLE_NAME='BigTable_1';
END;

Соответствующий декремент запускается на DELETE.Теперь вместо COUNT вы запрашиваете таблицу TABLE_COUNT.В случае незавершенных транзакций ваш результат будет незначительным, но вы можете с этим смириться.И стоимость амортизируется по всем операциям INSERT и DELETE;получить количество строк, когда вам это нужно, быстро.

2 голосов
/ 21 апреля 2011

Вы можете использовать sys.dm_db_partition_stats .

select sum(row_count)
from sys.dm_db_partition_stats
where object_id = object_id('TableName') and  index_id < 2
1 голос
/ 21 апреля 2011

Попробуйте:

select sum(P.rows) from sys.partitions P with (nolock)      
join sys.tables T with (nolock) on P.object_id = T.object_id        
where T.Name = 'Table_1' and index_id = 1

это должно быть намного быстрее.Получил это отсюда: ВЫБЕРИТЕ СЧЕТЧИК (*) ДЛЯ БОЛЬШОГО СТОЛА

0 голосов
/ 21 апреля 2011

если у вас есть первичный ключ, вы можете сделать это:

выберите количество (PrimaryKey) из таблицы_1

0 голосов
/ 21 апреля 2011

Существует только 1 [точный] способ подсчета строк в таблице: count(*). sp_spaceused или просмотр статистики не обязательно даст вам [a?] Правильный ответ.

0 голосов
/ 21 апреля 2011

Ваш запрос получит количество строк независимо от количества.Попробуйте использовать запрос, указанный в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...