我需要提高花费太长时间的查询的性能。该查询在源任务的SSIS数据流中使用。它是较长查询的一部分,但这是导致问题的原因,因此我将其缩小范围如下:
select xa.*, s.idA
from tableA s
inner join tableB xa on s.idA = xa.idB
where xa.type = 'type_A'
TableA
在idA
上具有非聚集索引,而TableB
在idB
上具有非聚集索引。执行计划使用索引TableA
并对TableB
执行全表扫描,这需要98%的工作。我尝试在TableB
的{{1}}列(包括列idB
)上创建非聚集索引。一个小时后,我不得不终止create查询,因为它被CXPACKET等待类型挂起了。可能是它在等待读取所有数据,但是我的SSIS流无法承受这么长时间的资源浪费。然后,我尝试在tableB列类型上创建聚簇索引,我认为这将花费更少的时间。计划是使用像这样的cte修改查询:
Type
使用此查询,我在tmp表中将只有20万行,并且我将避免使用所有可用索引对表B进行全表扫描以筛选出表B,因此我认为它将合理地提高速度
但是,我不得不终止创建查询,因为它花费了超过1个小时的时间(再次暂停,再次CXPACKET)。所以我的问题是:是否可以加快索引创建过程?是否可以估计创建索引所需的时间?
答案 0 :(得分:2)
将条件移动到子查询(CTE)并不是解决方案。您应该使用SQL来告诉DBMS要获得什么,而不是如何获得它。找到最佳计划是DBMS的任务。因此,请编写尽可能可读的查询,并通过提供适当的索引来帮助DBMS。
您应为查询使用以下索引:
create index idx1 on tableB ( type, idB ); -- to find B quickly and have the ID ready for the join
create index idx2 on tableA ( idA );
(您加入idA = idB看起来很奇怪,但是我想这只是示例中的内容,对吧?)