尽管行数是

时间:2017-03-27 12:38:05

标签: sql sql-server sql-server-2008 query-optimization

我有两个(几乎)相同的查询:

;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列。

知道这里发生了什么,或者我如何加快查询速度?

1 个答案:

答案 0 :(得分:0)

如我所见,差异在“WHERE fs.LinkedToTemplate = 0”条件下。

  

根据SQL执行计划,他们都花费相同的时间。第一个处理45行,第二个处理~17000行。这使我认为在两个查询中都选择了许多行并将其转换为xml。

看起来你没有 LinkedToTemplate 列的表索引,所以对于这两个查询都需要full table scan。 因此,为了提高性能,您应该通过 LinkedToTemplate 列创建索引。