我有兩個(幾乎)相同的查詢:查詢的同時運行,儘管有300倍之多行
;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列。
任何想法這裏發生了什麼事情或我如何加快我的查詢?
執行計劃通常不顯示計時= P您可能意味着成本?是的,有一個鏈接,但沒有它不是一回事。您需要單獨運行和計算每個查詢,或者使用SQL Plan Explorer之類的東西來獲取有關如何運行的視圖,並且即使這樣您只能獲得整個查詢的計時,而不是構成整個操作的每個「部分」。另外,@ table-variables在有大量數據時非常糟糕(在這種情況下17k行很多)。而是使用#temp-tables,因爲它們具有適當的統計處理並且還可以進行索引。優化器會很感激=) – deroby
使用臨時表做出了一個huuuuge的區別!現在查詢很快。還運行它作爲存儲過程幫助 –