大表中的行数

时间:2011-04-21 17:08:08

标签: sql sql-server tsql

SELECT COUNT(*) FROM BigTable_1

如果行数超过10亿,我应该使用哪种方式获取表中的行数?

更新:例如,如果我们在上面的查询中遇到“超时问题”,有什么方法可以对其进行优化吗?怎么做得更快?

8 个答案:

答案 0 :(得分:4)

如果您需要精确计数,则必须使用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`

答案 1 :(得分:4)

非常快的ESTIMATE:

从表中选择count(*)

但是不要执行!突出显示代码,按ctl-l以显示查询计划。然后将鼠标悬停在最左边的箭头上。将出现一个黄色框,其中包含估计的行数。

您可以查询系统表以获取相同的数据,但这很难记住。这种方式对旁观者来说更令人印象深刻。

:)

答案 2 :(得分:2)

您可以使用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

答案 3 :(得分:2)

根据您的并发性,速度和准确度要求,您可以使用触发器获得近似答案。创建一个表

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操作中摊销;在需要时获取行数很快。

答案 4 :(得分:1)

试试这个:

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

它应该快得多。从这里得到它:SELECT COUNT(*) FOR BIG TABLE

答案 5 :(得分:0)

无论数量多少,您的查询都会获得行数。尝试使用您在问题中列出的查询。

答案 6 :(得分:0)

只有一种[准确]方法来计算表格中的行:count(*)sp_spaceused或查看统计信息并不一定会给你[a?]正确答案。

答案 7 :(得分:-2)

如果您有主键,则应该可以执行此操作:

从table_1中选择count(PrimaryKey)