【发布时间】:2012-10-27 22:53:13
【问题描述】:
请考虑以下情况(为了问题而简化):
我在 SQL Server 2012 数据库中有以下表:
Parent_Table
Id | Parent table fields
----+--------------------
1 | ...
2 | ...
3 | ...
...
Child_Table
Id | ParentId | Child table fields
----+----------+-------------------
1 | 2 | ...
2 | 1 | ...
3 | 1 | ...
4 | 3 | ...
5 | 2 | ...
...
Big_Table
Id | ChildId | Value | Status | Other fields
--------+----------+--------|---------------------
1 | 12 | 672 | Closed |
2 | 23 | 133 | Closed |
3 | 7 | 2611 | Open |
4 | 14 | 84 | Closed |
...
1295769 | 23 | 458 | Closed |
1295770 | 18 | 1046 | Open |
1295771 | 7 | 8 | Open |
子表和父表相对较小(每个父表大约有 100 个父条目和 5 个子条目),并且它们的条目每天只插入或删除几次。
另一方面,“大表”正在快速增长(为了讨论,每秒 100 个条目),并且行的状态在一段时间后变为 Closed(想想客户端会话,这实际上是这里的情况)。
我需要定期(每隔几秒)提供 Big_Table 行数和 Big_Table.Value 列的总和指定的 Parent.Id - 每次都不同。
我怀疑直接实现(使用内部连接等)可能效率极低,更好的解决方案可能包括附加表、某种计数器表,或者我应该在我的服务代码中实现它(?!)并以某种方式处理持久性。
实现上述内容的“正确”(效率方面)方式是什么?处理额外级别的父母/孩子的解决方案将是最好的解决方案。
【问题讨论】:
-
确保表上有正确的索引,也许对它进行分区,然后使用连接。如果您的数据库设计正确,SQL 可以轻松处理大量行。
-
@cadrell0 - 显然索引是必须的(尽管插入时会产生额外费用),但我不确定在这种情况下是否足够。
-
你考虑过索引视图吗?
-
@Max - 是的,我有,但我仍然认为它需要“太多”的 SQL 资源,而引擎将非常忙于处理其他请求。
-
只要你在视图定义中使用 NOLOCK,我不会太在意阻塞。 SQL 优化器很有可能会意识到您在做什么并帮助您(缓存结果等)。我建议尝试一下并查看执行计划和资源利用率。如果查询确实太昂贵,请向业务层添加一些缓存逻辑。但请记住,您必须处理缓存失效、保持缓存与数据库同步等问题。
标签: sql-server tsql inner-join