SQL Server中的MAX(someAttribute)或SELECT COUNT(*)FROM table_name?

时间:2011-05-05 01:05:11

标签: sql-server-2008 count

我有一个包含大量行(超过5,000,000,000)的表,我想获得确切的行数,但由于该表有一个名为ID的属性,如:

    ID              someAtt someAtt2  someAtt3  
-----------------------------------------------  
    1               32      DOWN      45
    ...
    ...
    (lots of rows)
    ...
    ...   
    5,000,000,000   25      MOVE      40

获得确切数字(这里是5,000,000,000)的最佳方法是什么? 使用max(ID)SELECT COUNT(*) FROM table_name

5 个答案:

答案 0 :(得分:2)

使用COUNT(*)。如果一行被删除,MAX(ID)将给您一个不准确的计数,而COUNT则不会。如果使用COUNT(*)而不是特定的列名,数据库服务器将决定使用哪个列来优化操作。

答案 1 :(得分:2)

如果您可以使用可能稍微过时的计数,您还可以查看SQL Server中的系统目录视图。特别是在像你这样的大型桌子上,这个值的检索速度明显快于在桌面上实际执行COUNT(*)的速度 - 但它可能不是100%准确:

SELECT 
    t.NAME AS TableName,
    p.rows AS RowCount
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
WHERE 
    t.NAME = 'YourLargeTableNameHere'
    AND i.index_id <= 1

答案 2 :(得分:1)

尝试两者并比较性能,但我默认使用COUNT方法,因为它更明显且不太可能给出错误的结果。

答案 3 :(得分:1)

定义一个COUNT(*),因为这些ID在将来可能会有空白,并且在编码时,建议不要做未来可能发生变化的事情以避免难以发现的细微故障(那些小假设是那些之后更难调试。

答案 4 :(得分:1)

我可能会使用COUNT(*) - 请参阅Ken Whites的答案。

如果我想要替代方案,我会考虑更新统计数据并使用行数来查看此SQL Hacks page

由于其他人提供的原因(ID序列中的空白)我不会使用MAX(ID)),这也可能导致全表扫描,因为计数(*)可能,但没有优势精度。