我有一个包含大量行(超过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
答案 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)),这也可能导致全表扫描,因为计数(*)可能,但没有优势精度。