我有一個歷史記錄表,其中包含每次記錄更改時的快照。我試圖用原始捕獲日期返回某個歷史記錄行。我目前正在使用這個此刻:查找結果的第一行
select
s.Description,
h.CaptureDate OriginalCaptureDate
from
HistoryStock s
left join
(select
StockId,
CaptureDate
from
HistoryStock
where
HistoryStockId in (select MIN(HistoryStockId) from HistoryStock group by StockId)
) h on s.StockId = h.StockId
where
s.HistoryStockId = @HistoryStockId
這工作,但有1萬條記錄其對慢側,我不知道如何優化這個查詢。
此查詢如何優化?
UPDATE:
WITH OriginalStock (StockId, HistoryStockId)
AS (
SELECT StockId, min(HistoryStockId)
from HistoryStock group by StockId
),
OriginalCaptureDate (StockId, OriginalCaptureDate)
As (
SELECT h.StockId, h.CaptureDate
from HistoryStock h join OriginalStock o on h.HistoryStockId = o.HistoryStockId
)
select
s.Description,
h.OriginalCaptureDate
from
HistoryStock s left join OriginalCaptureDate h on s.StockId = h.StockId
where
s.HistoryStockId = @HistoryStockId
我已經更新到使用CTE的代碼,但我沒有更好的性能明智的,只有微小的性能提升。有任何想法嗎?
只是另一個說明,我需要查看StockId的歷史記錄表中的第一條記錄,而不是最早的捕獲日期。
您正在使用HistoryStockId限制最終查詢,我認爲它只限於一個StockId,但看起來您將加入所有歷史記錄以獲得此結果。您是否嘗試過使用參數@HistoryStockId限制CTE?發佈查詢的執行計劃將有所幫助。 – Tony 2010-11-10 13:38:50
您能向我們展示「HistoryStock」所有相關列的列架構嗎? (這裏是唯一的表格,對嗎?) – AakashM 2010-11-10 13:48:35
您似乎有一個額外的CTE,它是多餘的,據我所見,OriginalCaptureDate是不必要的 - 爲什麼不根據它進行最終選擇並選擇您感興趣的字段?。如果INNER JOIN適合,您也正在執行LEFT JOIN。如上所述,您還可以在聲明的最後一點對historystockid進行過濾 - 爲什麼不首先對此進行過濾以減少正在檢查的數據集? – JamWheel 2010-11-16 09:05:58