我正在尝试优化使用冗余查询块的查询的速度。我正在尝试使用下面的查询在sql server 2008中进行逐行连接。
Select * from
(<complex subquery>) cq
join table1 t1 on (cq.id=t1.id)
union
Select * from
<complex subquery> cq
join table2 t2 on (cq.id=t2.id)
<complex subquery>
在union子查询部分上完全相同,除了我们需要将它与多个不同的表连接以获得相同的列数据。
有没有什么方法可以重写查询,使其更快,而不使用临时表来缓存结果?
答案 0 :(得分:3)
为什么不使用临时表并查看是否可以改善执行统计数据?
在某些情况下,查询优化器会自动将一个假脱机添加到缓存子查询的计划中,但这基本上只是一个临时表。
您是否检查了当前的计划以确保查询实际上被多次评估?
答案 1 :(得分:1)
如果没有具体的例子,很难提供帮助,但尝试使用WITH语句,例如:
WITH csq(x,y,z) AS (
<complex subquery>
)
Select * from
csq
join table1 t1 on (cq.id=t1.id)
union
Select * from
csq
join table2 t2 on (cq.id=t2.id)
它有时会把事情推迟到最后
答案 2 :(得分:0)
查询的性质是否允许您反转它?而不是“(加入,加入)联盟”,做“(联合)加入”?像:
Select * from
(<complex subquery>) cq
join (
Select * from table1 t1
union
Select * from table2 t2
) ts
on cq.id=ts.id
我不确定您对复杂查询的双重评估是否实际上是错误的。但是,根据您的问题,这将是一种查询形式,它将鼓励SQL仅评估<complex query>
一次。