Cuối cùng tôi đã tìm ra logic cho một truy vấn, bây giờ tôi cần tăng tốc nó lên ... đáng kể, nếu có thể (nó chạy trong 40 phút +/-). Nó nằm trên hai cái bàn, một cái chỉ có vài trăm hàng ( tblTradingDays
) và cái kia có hơn một triệu ( tblDailySMA
). Nó trả về 48 triệu hàng.
Logic cơ bản của tôi là: Tôi trả về một hàng cho mỗi kết hợp ký hiệu, ngày giao dịch và giá trị thời gian, tạo ra một cặp giai đoạn "chậm v nhanh". Vì vậy, trong bảng gốc, có một biểu tượng, ngày giao dịch, khoảng thời gian (5,10,20, ...) và giá trị thực tế cho sự kết hợp đó. Tôi muốn so sánh các giá trị cho tất cả các kết hợp của các khoảng thời gian (ngoại trừ khoảng thời gian p1 = thời gian p2). Tôi đang đánh số các hồ sơ sẽ được sử dụng để xử lý thêm. Hy vọng rằng có ý nghĩa.
Tôi đã thử các chỉ mục và kết hợp khác nhau của các lĩnh vực liên quan đến các phép nối và vị từ. Trong kế hoạch thực hiện ước tính, có vẻ như một loại là hoạt động tốn kém nhất. Chỉ mục duy nhất tblDailySMA
xuất hiện trong kế hoạch, mặc dù tôi thêm những người khác là không Symbol, TradeDate, Period
bao gồm , duy nhất, trên : , và bao gồm Value
. Nó được quét. Các truy vấn dưới đây, hy vọng ai đó có thể giúp tôi ra. Cảm ơn trước..
SELECT
ROW_NUMBER() OVER
(
ORDER BY t1.Symbol, t1.Period, t2.Period, t.TradingDate DESC
) RowNum,
t1.Symbol, t.TradingDate, t1.Period, t2.Period, t1.Value FastValue,
t2.Value SlowValue, (t1.Value - t2.Value) SlowFastDiff,
ChgSign = CASE WHEN t1.Value < t2.Value THEN 0
WHEN t1.Value >= t2.Value THEN 1
WHEN t1.Value IS NULL OR t2.Value IS NULL THEN NULL
END
FROM
tblTradingDays t
RIGHT JOIN
tblDailySMA t1 ON t.TradingDate = t1.TradeDate
INNER JOIN
tblDailySMA t2 ON t1.Symbol = t2.Symbol AND t1.TradeDate = t2.TradeDate
WHERE
t1.Period < t2.Period
Đây là kế hoạch thực hiện:
|--Compute Scalar(DEFINE:([Expr1007]=[Market].[dbo].[tblDailySMA].[Value] as [t1].[Value]-[Market].[dbo].[tblDailySMA].[Value] as [t2].[Value], [Expr1008]=CASE WHEN [Market].[dbo].[tblDailySMA].[Value] as [t1].[Value]<[Market].[dbo].[tblDailySMA].[Value] as [t2].[Value] THEN (0) ELSE CASE WHEN [Market].[dbo].[tblDailySMA].[Value] as [t1].[Value]>=[Market].[dbo].[tblDailySMA].[Value] as [t2].[Value] THEN (1) ELSE NULL END END))
|--Sequence Project(DEFINE:([Expr1006]=row_number))
|--Segment
|--Parallelism(Gather Streams, ORDER BY:([t1].[Symbol] ASC, [t1].[Period] ASC, [t2].[Period] ASC, [t].[TradingDate] DESC))
|--Sort(ORDER BY:([t1].[Symbol] ASC, [t1].[Period] ASC, [t2].[Period] ASC, [t].[TradingDate] DESC))
|--Hash Match(Right Outer Join, HASH:([t].[TradingDate])=([t1].[TradeDate]), RESIDUAL:([Market].[dbo].[tblTradingDays].[TradingDate] as [t].[TradingDate]=[Market].[dbo].[tblDailySMA].[TradeDate] as [t1].[TradeDate]))
|--Parallelism(Distribute Streams, Hash Partitioning, PARTITION COLUMNS:([t].[TradingDate]))
| |--Index Scan(OBJECT:([Market].[dbo].[tblTradingDays].[PK_tblTradingDays] AS [t]))
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([t1].[TradeDate]))
|--Merge Join(Inner Join, MANY-TO-MANY MERGE:([t1].[Symbol], [t1].[TradeDate])=([t2].[Symbol], [t2].[TradeDate]), RESIDUAL:([Market].[dbo].[tblDailySMA].[Symbol] as [t1].[Symbol]=[Market].[dbo].[tblDailySMA].[Symbol] as [t2].[Symbol] AND [Market].[dbo].[tblDailySMA].[TradeDate] as [t1].[TradeDate]=[Market].[dbo].[tblDailySMA].[TradeDate] as [t2].[TradeDate] AND [Market].[dbo].[tblDailySMA].[Period] as [t1].[Period]<[Market].[dbo].[tblDailySMA].[Period] as [t2].[Period]))
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([t1].[Symbol], [t1].[TradeDate]), ORDER BY:([t1].[Symbol] ASC, [t1].[TradeDate] ASC))
| |--Index Scan(OBJECT:([Market].[dbo].[tblDailySMA].[IX_tblDailySMA_Noncl_SymbTrDatePer] AS [t1]), ORDERED FORWARD)
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([t2].[Symbol], [t2].[TradeDate]), ORDER BY:([t2].[Symbol] ASC, [t2].[TradeDate] ASC))
|--Index Scan(OBJECT:([Market].[dbo].[tblDailySMA].[IX_tblDailySMA_Noncl_SymbTrDatePer] AS [t2]), ORDERED FORWARD)
tblTradingDays
gì? Hình như nó không làm gì cả. Hoặc có thể bạn muốn LEFT JOIN
thay vì RIGHT JOIN
?