维护 SQL 个表的统计信息

Maintaining statistics over SQL tables

我在 SQL 数据库中有几个 table,我想要另一个 table(比如 Stats)来保存一些统计数据那些 tables(平均值、计数等)

每次我的 table 之一被修改时,我都可以在 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" 的记录,因此我可能需要检查这一点并可能先创建一条记录。

所以,问题是:体面的人是怎么做到这种事的?

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

但是,只有在满足以下条件时才应执行此操作:

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

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

请注意,使用索引可以非常快速地计算某些统计信息 -- 特别是 MIN()MAX()

维护触发器 non-trivial。在不同的 table 之间保持一致性是很棘手的(考虑不执行触发器的 bulk inserttruncate table)。