根据主题,我正在寻找一种快速的方法来计算表中的记录,而没有表扫描的条件
答案 0 :(得分:2)
简单地说,确保为where条件正确索引表。
如果您担心这种性能,那么方法是创建包含相关字段的索引,例如,如果您的表包含 foo 的主键,则字段 bar , parrot 和灌木丛你知道你需要使用基于灌木丛的条件定期撤回记录只需要来自此字段的数据,您应该设置[灌木, foo ]的复合索引。这样rdbms只需要查询索引而不是表。作为树结构的索引比表本身查询要快得多。
rdbms需要多少实际活动取决于rdbms本身以及它放入索引的确切信息。例如,在未使用where条件的未索引表上的选择计数()*将在大多数rdbms上立即返回,因为记录计数保持在表级别并且不需要表扫描。类似的考虑可能适用于索引访问。
请注意,索引确实会带来维护开销,因为如果更新字段,rdbms也必须更新包含该字段的所有索引。这可能是也可能不是一个重要的考虑因素,但是通常会看到读取大多数活动的表并且插入/更新/删除活动的重要性不高,这些表在各种表字段组合上都有大量索引,因此大多数查询只会使用索引而不是触及实际的表数据本身。
ADDED:如果您在具有重要IUD活动的表上使用索引访问,那么只需确保安排定期维护。树结构,即索引,在平衡时效率最高,并且需要进行大量的UID活动,需要定期维护以保持这种方式。
答案 1 :(得分:2)
有不同的方法,最可靠的方法是
Select count(*) from table_name
但除此之外,您还可以使用以下其中一种
select sum(1) from table_name
select count(1) from table_name
select rows from sysindexes where object_name(id)='table_name' and indid<2
exec sp_spaceused 'table_name'
DBCC CHECKTABLE('table_name')
最后2个需要更新系统索引,运行以下命令来实现这一点,如果你不更新它们很可能会给你错误的结果,但是对于近似它们可能实际上有效。
DBCC UPDATEUSAGE ('database_name','table_name') WITH COUNT_ROWS.
编辑:抱歉,我没有阅读有关按某个条款计算的部分。我同意Cruachan,你的问题的解决方案是正确的索引。
答案 2 :(得分:2)
以下页面列出了4种获取表格中行数的方法,其中包括准确性和速度的评论。
这是Management Studio使用的一个:
SELECT CAST(p.rows AS float)
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int)
AND p.index_id=idx.index_id
WHERE ((tbl.name=N'Transactions'
AND SCHEMA_NAME(tbl.schema_id)='dbo'))