维护 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 insert
或 truncate table
)。
我在 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 insert
或 truncate table
)。