维护SQL表的统计信息

时间:2018-04-11 12:01:18

标签: sql usage-statistics

我在SQL数据库中有几个表,我希望有另一个表(比如Stats),它将保存这些表的一些统计数据(平均值,计数等)

每次修改一个表时,我都可以对X进行更新,如下所示:

INSERT INTO Things VALUES (x, y, z);

UPDATE Stats
    SET AverageX = (SELECT avg(x) FROM Things WHERE Things.y="identifier")
    WHERE Stats.y="identifier";

但这似乎有点低效(每次平均)。此外,Stats可能不包含与Stats.y="identifier"匹配的记录,因此我可能需要检查此内容并可能首先创建记录。

所以,问题是:体面的人如何做这样的事情?

1 个答案:

答案 0 :(得分:1)

评论太长了。

您可以通过在要保留数据的所有表上使用触发器(插入,删除和更新)来自动执行此操作。您可能不希望将平均值存储在统计信息表中。相反,你想要总和和数。

但是,如果满足以下条件,您应该只这样做:

  • 与修改基础表相比,您更频繁地引用统计信息。
  • 基础表格足够大,因此动态计算统计数据非常昂贵。

如果不满足这些条件并且您的表格相对较小,那么拥有一个可以即时计算统计数据的视图就足够了。

请注意,使用索引计算某些统计信息的速度非常快 - 尤其是MIN()MAX()

维护触发器并非易事。并且保持不同表之间的一致性是棘手的(考虑bulk inserttruncate table不执行触发器。)