假设已经制定了索引,并且没有必要的绝对计数准确性(可以使用一两个)可以使用:可以使用:

选项A。

select count(*) 
  from Table 
 where Property = @Property

vs

选项b

update PropertyCounters
   SET PropertyCount = PropertyCount + 1  
 where Property = @Property

然后做:

select PropertyCount 
  from PropertyCounters 
 where Property = @Property

随着表格成千上万的记录,我可以合理地期望获得多少性能降解?

有帮助吗?

解决方案

除了真实数据之外,保留单独的计数列是一个非正式化。有理由您可能需要进行性能,但是直到您真正需要之前,您不应该去那里。它使您的代码更加复杂,并有更多不一致的机会蔓延。

对于简单的情况,查询确实只是 SELECT COUNT(property) FROM table WHERE property=..., ,没有理由不可分割的;您可以通过在 property 柱子。

其他提示

您没有指定平台,但是由于您使用t-sql语法@variables,我会冒险一个SQL Server平台特定答案:

count(*), ,或严格地说是 count_big(*), ,是可以在索引视图中使用的表达式,请参阅 设计索引视图.

create view vwCounts
with schembinding
as select Property, count_big(*) as Count
from dbo.Table
group by Property;

create unique clustered index cdxCounts on vwCounts(Property);

select Count 
from vwCount with (noexpand)
where Property = @property;

在企业版上,优化器甚至将使用索引视图作为您的原始查询:

select count_big(*)
from Table
where Property = @property;

因此,最终您也得到了蛋糕并食用:该物业已被汇总和维护,并由发动机免费维护。价格是更新必须维护索引视图(他们将 不是 不过,重新计算汇总计数),并且聚合将创建热点以进行争夺(表上的单独行上的锁定将在索引视图上进行相同的计数(*)更新)。

如果您说自己不需要绝对的准确性,那么选项B是一种奇怪的方法。如果选项A变得太重(即使在添加索引之后),则可以在内存中或其他表(您的属性表)中缓存选项A的输出,并定期刷新它。

这不是一般SQL术语可以回答的内容。除了有关索引的普通警告之外,在影响查询方面,这也是平台之间有很大不同的地方。

我敢打赌,从SQL Server比Postgres上的性能更好,以至于我会在Postgres而不是SQL Server上更快地考虑后一种方法。但是,由于部分索引设置恰好适合匹配标准,我敢打赌,Postgres击败了SQL Server。不过,这就是我敢打赌的奖金,无论哪种方式,我都会测试是否需要真实考虑。

如果您确实采用后一种方法,请用扳机或类似方法执行它,以免变得不准确。

在SQL Server上,如果您不需要绝对准确的计数,也可以检查目录视图。这要容易得多 - 您不必保持自己的数量 - 对系统的征税要少得多。毕竟,如果您需要计算表中的所有行,则需要以一种或另一种方式扫描该表格 - 无法解决。

在此处,使用此SQL语句,您将在数据库中获取所有表格及其行计数,如SQL Server所保留的:

SELECT 
    t.NAME AS TableName,
    SUM(p.rows) AS RowCounts
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 NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
    OBJECT_NAME(i.object_id) 

我找不到有关这些数字的最新情况的任何文件,但根据我自己的经验,它们通常在现场(除非您在做一些散装加载之类的东西 - 但是在这种情况下,您不会' t想不断扫描桌子以获取确切的计数)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top