gpt4 book ai didi

SQL Server 计数速度慢

转载 作者:行者123 更新时间:2023-12-01 18:48:42 25 4
gpt4 key购买 nike

统计数据量大的表可能会很慢,有时需要几分钟;它还可能在繁忙的服务器上产生死锁。我想显示真实值,NOLOCK 不是一个选项。

我使用的服务器是 SQL Server 2005 或 2008 Standard 或 Enterprise - 如果有的话。我可以想象 SQL Server 维护每个表的计数,如果没有 WHERE 子句,我可以很快获得该数字,对吗?

例如:

SELECT COUNT(*) FROM myTable

应该立即返回正确的值。我需要依赖统计数据来更新吗?

最佳答案

非常接近的近似值(忽略任何正在进行的交易)将是:

SELECT SUM(p.rows) FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON s.[schema_id] = t.[schema_id]
WHERE t.name = N'myTable'
AND s.name = N'dbo'
AND p.index_id IN (0,1);

这将比 COUNT(*) 更快地返回,并且如果您的表变化得足够快,那么它的准确度也不会降低 - 如果您的表在您开始 COUNT 之间发生了变化(并且获取了锁)以及何时返回(当锁被释放并且所有等待的写事务现在都被允许写入表时),它是否更有值(value)?我不这么认为。

如果您想要计算表的某些子集(例如,WHERE some_column IS NULL),您可以在该列上创建一个过滤索引,并以一种方式构造 where 子句或其他,取决于它是异常(exception)还是规则(因此在较小的集合上创建过滤索引)。所以这两个索引之一:

CREATE INDEX IAmTheException ON dbo.table(some_column)
WHERE some_column IS NULL;

CREATE INDEX IAmTheRule ON dbo.table(some_column)
WHERE some_column IS NOT NULL;

然后您可以使用以下方法以类似的方式获取计数:

SELECT SUM(p.rows) FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON s.[schema_id] = t.[schema_id]
INNER JOIN sys.indexes AS i
ON p.index_id = i.index_id
WHERE t.name = N'myTable'
AND s.name = N'dbo'
AND i.name = N'IAmTheException' -- or N'IAmTheRule'
AND p.index_id IN (0,1);

如果您想知道相反的情况,只需从上面的第一个查询中减去即可。

关于SQL Server 计数速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12479677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com