SELECT COUNT(*) FROM BigTable_1
如果行数超过10亿,我应该使用哪种方式获取表中的行数?
更新:例如,如果我们在上面的查询中遇到“超时问题”,有什么方法可以对其进行优化吗?怎么做得更快?
答案 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)