提高3亿行表的查询性能

时间:2018-11-14 09:24:28

标签: sql performance sql-server-2008

我需要提高花费太长时间的查询的性能。该查询在源任务的SSIS数据流中使用。它是较长查询的一部分,但这是导致问题的原因,因此我将其缩小范围如下:

select xa.*, s.idA 
from tableA s 
inner join tableB xa on s.idA = xa.idB
where xa.type = 'type_A'
  • TableA = 8000万行
  • TableB = 3.4亿行

TableAidA上具有非聚集索引,而TableBidB上具有非聚集索引。执行计划使用索引TableA并对TableB执行全表扫描,这需要98%的工作。我尝试在TableB的{​​{1}}列(包括列idB)上创建非聚集索引。一个小时后,我不得不终止create查询,因​​为它被CXPACKET等待类型挂起了。可能是它在等待读取所有数据,但是我的SSIS流无法承受这么长时间的资源浪费。然后,我尝试在tableB列类型上创建聚簇索引,我认为这将花费更少的时间。计划是使用像这样的cte修改查询:

Type

使用此查询,我在tmp表中将只有20万行,并且我将避免使用所有可用索引对表B进行全表扫描以筛选出表B,因此我认为它将合理地提高速度

但是,我不得不终止创建查询,因为它花费了超过1个小时的时间(再次暂停,再次CXPACKET)。所以我的问题是:是否可以加快索引创建过程?是否可以估计创建索引所需的时间?

1 个答案:

答案 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看起来很奇怪,但是我想这只是示例中的内容,对吧?)