大家好,我有几个关于报告的查询需要翻译,每个查询都从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
目前我只在开发服务器上测试过这个查询,我发现获取结果需要一定的时间。这35个以上的表之间没有任何关联,这是我能想到的获取所有所需数据的唯一方式。
有更好的方法来执行这种查询吗?
如果这是执行此类查询的唯一方法,如何通过进行任何可能的更改来提高此查询的性能?
我的观点
在此报告中,我不介意使用一些脏读取。我正在考虑使用查询提示 with nolock
或将事务隔离级别
设置为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
这是最好的方法吗?还是有其他建议?