【发布时间】:2013-11-03 19:49:03
【问题描述】:
大家好,我对一些报告有几个查询,其中每个查询都从 35 个以上的表中提取数据。每个表都有近 10 万条记录。例如,所有查询都是 Union ALL
;With CTE
AS
(
Select col1, col2, col3 FROM Table1 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table2 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table3 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table4 WHERE Some_Condition
.
.
. And so on
)
SELECT col1, col2, col3 FROM CTE
ORDER BY col3 DESC
到目前为止,我只在 Dev Server 上测试了这个查询,我可以看到它需要一些时间才能得到结果。所有这些 35+ 表都彼此不相关,这是我能想到的在结果集中获取所有所需数据的唯一方法。
有没有更好的方法来进行这种查询?
如果这是进行此类查询的唯一方法,我该如何 通过进行任何更改来提高此查询的性能,如果 可能的??
我的看法
我不介意在这份报告中有一些脏读。我正在考虑使用 查询提示 with nolock 或 Transaction Isolation Level 设置为 READ UNCOMMITED。
这些有帮助吗???
编辑
每个表都有 5-10 位列和每个位列对应的日期列,我对每个 SELECT 语句的条件类似于
WHERE BitColumn = 1 AND DateColumn IS NULL
同行建议
过滤索引
CREATE NONCLUSTERED INDEX IX_Table_Column
ON TableName(BitColumn)
WHERE BitColum = 1
包含列的过滤索引
CREATE NONCLUSTERED INDEX fIX_IX_Table_Column
ON TableName(BitColumn)
INCLUDE (DateColumn)
WHERE DateColumn IS NULL
这是最好的方法吗?或者有什么建议吗???
【问题讨论】:
-
为什么需要这种查询?
-
您确定这些表不相关吗?很难理解如何合并完全不相关的数据。
-
您查看过查询的执行计划吗? 35+ 表中的每一个都有适当的索引吗?
-
从不同的表格中收集有关缺失数据的信息并提示案例处理人员获取该信息并填写表格上的字段,因为他们有一定的时间限制来获取每个客户的所有信息。此查询检查所有客户的 35 多个表单中的多个字段中的缺失数据。
-
对我来说听起来像是次优设计,但如果你真的需要检查 35 个表中的一个条件,我真的不知道你会怎么做。条件总是一样吗?也许您可以创建一个与谓词匹配的过滤索引。否则,耸耸肩。 Also, please don't ping people on one question to go look at another question。对于本网站的大多数用户来说,这有点破坏了整个工作流程。
标签: sql-server sql-server-2008 tsql sql-server-2008-r2 query-performance