DECLARE @PersonId int = 111111,
@BeginDate int = 0
DECLARE @UpdateDate AS TABLE
(
[FlowId] [int] NOT NULL PRIMARY KEY,
[UpateDate] [int] NOT NULL,
[RowId] [int] NOT NULL INDEX Idx_RowId
)
BEGIN
INSERT @UpdateDate ([FlowId], [UpateDate], RowId)
SELECT FlowId, UpdateDate, ROW_NUMBER() OVER (ORDER BY FlowId ASC) FROM
(
SELECT UpdateDate, MAX(FlowId) AS FlowId
FROM [_DetailIndex] WHERE PersonId = @PersonId
GROUP BY UpdateDate
) a
-- 執行到這 @UpdateDate表有20條記錄左右
END
DECLARE @Pool AS TABLE(PersonId int,WeId int, BeginDate int, EndDate int)
INSERT INTO @Pool (PersonId ,WeId , BeginDate , EndDate) --如果注掉這個insert,執行會很快,不注掉執行時間增加10倍
SELECT @PersonId as PersonId,
A.WeId,
B.UpateDate,
ISNULL(C.UpateDate, 99991231)
FROM _WePool A
INNER JOIN @UpdateDate B ON A.FlowId = B.FlowId
LEFT JOIN @UpdateDate C ON B.RowId+1 = C.RowId
WHERE ISNULL(C.UpateDate, 99991231) > @BeginDate AND A.PersonId = @PersonId
--_WePool 里面有幾千萬條資料,與@PersonId相關的資料有30w條, 用PersonId和FlowId做關鍵字
現在向@Pool插入資料執行效率特別慢,大概要花費16秒以上,對_WePool 的邏輯讀取次數達到900w次,但是如果把insert 注掉,花費時間1秒不到,_WePool 的邏輯讀取次數只有30w次,不知道這是什么原因。
如果把@Pool換成一個臨時表,不會有這個問題。
如果去掉最后LEFT JOIN @UpdateDate C ON B.RowId+1 = C.RowId 也不會有這個問題,求大神指點下
uj5u.com熱心網友回復:
一點不詭異, 表變數不適合大量資料。用臨時表能解決就算了, 不要糾結
uj5u.com熱心網友回復:
肯定不是大量資料的問題 ,我向表變數插入幾十萬條資料都毫無壓力,這個篩選結果也就幾萬條而已,這個是join的先后順序問題,但是不知道為什么會有這個問題。uj5u.com熱心網友回復:
頂貼。。。。uj5u.com熱心網友回復:
臨時表相對而言表變數主要是多了I/O時間,但少了對記憶體資源的占用。資料量較大的時候,由于對記憶體資源的消耗較少,使用臨時表比表變數有更好的性能。
使用標準就是少資料量(幾千潭訓更少)用表變數, 大資料量用臨時表。
你的記憶體本身就比較小吧?
uj5u.com熱心網友回復:
服務器記憶體沒問題,但是sql server 在鏈接的方式上有很大的差異,我看了下,沒有insert的時候,用的是hash match,但是有insert 的時候用的是 nested loops,不太懂為什么會在優化的方式上不一樣uj5u.com熱心網友回復:
INSERT INTO @Pool (PersonId ,WeId , BeginDate , EndDate) --如果注掉這個insert,執行會很快,不注掉執行時間增加10倍
SELECT @PersonId as PersonId,
A.WeId,
B.UpateDate,
ISNULL(C.UpateDate, 99991231)
FROM _WePool A
INNER JOIN @UpdateDate B ON A.FlowId = B.FlowId
LEFT JOIN @UpdateDate C ON B.RowId+1 = C.RowId
WHERE ISNULL(C.UpateDate, 99991231) > @BeginDate AND A.PersonId = @PersonId
OPTION(RECOMPILE)
最后一句, 在最后面添加 OPTION(RECOMPILE) 試下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/44589.html
標籤:疑難問題
上一篇:動態sql求和
