我有两个(几乎)相同的查询:
;with cteMasterCreateExecAsXml as (
SELECT guid, CAST(ExecutionOrder AS xml) as x
FROM (SELECT guid, ExecutionOrder
FROM @StrategiesToCreate sc
JOIN InFusion_Data.dbo.compare_FoxStrategy fs ON fs.Guid = sc.MasterGuid
WHERE fs.LinkedToTemplate = 0) k
) -- selects ~45 rows
SELECT MasterBIV.StrategyTagname, MasterBIV.Tagname, MasterBIV.Name,
b.blk.value('for $i in . return count(../*[. << $i]) + 1', 'int') as ExecOrder
INTO #MasterCreateExecOrder
FROM cteMasterCreateExecAsXml
CROSS APPLY x.nodes('//ExecutionOrder/Block') as b(blk)
JOIN InFusion_Data.dbo.compare_BlockInfoView MasterBIV ON MasterBIV.BlockGuid = b.blk.value('@Id', 'uniqueidentifier')
和
;with cteMasterExecAsXml as (
SELECT guid, CAST(ExecutionOrder AS xml) as x
FROM (SELECT guid, ExecutionOrder FROM @StrategiesToCompare sc
JOIN InFusion_Data.dbo.compare_FoxStrategy fs ON fs.Guid = sc.MasterGuid) k
) -- selects ~17000 rows
SELECT MasterBIV.StrategyTagname, MasterBIV.Tagname, MasterBIV.Name,
b.blk.value('for $i in . return count(../*[. << $i]) + 1', 'int') as ExecOrder
INTO #MasterExecOrder
FROM cteMasterExecAsXml
CROSS APPLY x.nodes('//ExecutionOrder/Block') as b(blk)
JOIN InFusion_Data.dbo.compare_BlockInfoView MasterBIV ON MasterBIV.BlockGuid = b.blk.value('@Id', 'uniqueidentifier')
根据SQL执行计划,他们都花费相同的时间。第一个处理45行,第二个处理~17000行。这使我认为在两个查询中都选择了许多行并将其转换为xml。
不幸的是,因为我需要跨服务器进行查询,所以我不能在架构中使用XML列。
知道这里发生了什么,或者我如何加快查询速度?
答案 0 :(得分:0)
如我所见,差异在“WHERE fs.LinkedToTemplate = 0”条件下。
根据SQL执行计划,他们都花费相同的时间。第一个处理45行,第二个处理~17000行。这使我认为在两个查询中都选择了许多行并将其转换为xml。
看起来你没有 LinkedToTemplate 列的表索引,所以对于这两个查询都需要full table scan。 因此,为了提高性能,您应该通过 LinkedToTemplate 列创建索引。