【发布时间】:2019-04-17 05:12:00
【问题描述】:
我需要提高查询时间过长的性能。查询在源任务的 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 亿行
TableA 在idA 上有一个非聚集索引,TableB 在idB 上有一个非聚集索引。执行计划使用TableA 的索引并对TableB 执行全表扫描,这需要98% 的工作量。我试图在TableB 的列idB 上创建一个非聚集索引,包括Type 列。我不得不在一小时后终止创建查询,因为它被 CXPACKET 等待类型挂起。可能它正在等待读取所有数据,但我的 SSIS 流不能浪费这么多时间的资源。然后我尝试在 tableB 列类型上创建一个聚集索引,我认为这会花费更少的时间。计划是使用这样的 cte 修改查询:
;with tmp as
(
select *
from tableB
where type = 'Type_A'
)
select xa.*, s.idA
from tableA s
inner join tmp xa on s.idA = xa.idB
使用此查询,我将在 tmp 表中只有 200k 行,并且我将避免全表扫描以利用所有可用索引过滤 tableB,因此我认为它将合理地提高速度
但是,我不得不终止创建查询,因为它需要超过 1 小时(再次暂停,再次 CXPACKET)。所以我的问题是:是否可以加快索引创建过程?是否可以估计创建索引所需的时间?
【问题讨论】:
-
所以问题不在于改进查询,而在于如何在大表上创建索引? this 有帮助吗?
-
我建议您使用
type = 'type_A'创建一个 filtered 索引,因为这在您的查询中是硬编码的。如果过滤器是选择性的,它很可能会创建得更快,因为它必须加载更少的行。当然,它仍然必须首先找到它们
标签: sql performance sql-server-2008