簡體   English   中英

SQL Server自身交叉應用+交叉應用性能問題

[英]SQL Server Cross Apply on itself + Cross Apply performance issues

我有以下內容:

CREATE TABLE #MASTER_POSANDTRANS (ID CHAR(30), 
                                  QUANTITY INT, 
                                  START_OR_TRADE_DATE DATE) 

VALUES 
    ('APPLES ','150000','20150501'), ('PEARS','220000','20150501'), 
    ('APPLES ','-75000','20150506'), ('APPLES ','-65000','20150508'), 
    ('APPLES ','10000','20150516'),  ('APPLES ','-20000','20150519'
    ('PEARS','-110000','20150506'),  ('PEARS','-100000','20150519')

我想說“一開始我有15萬個蘋果,所以我的整體蘋果排名很高”

這是我目前解決這個小難題的方式:

SELECT 
    MPT.ID, 
    MPT.QUANTITY, 
    MPT.START_OR_TRADE_DATE, 
    APPLY_RES.QUANTITY as 'FIRST AVAILABLE  QUANTITY', 
    CASE 
       WHEN APPLY_RES.QUANTITY > 0 
         THEN 'LONG' 
         ELSE 'SHORT' 
    END as 'L/S Indicator'
FROM 
    #MASTER_POSANDTRANS as MPT 
CROSS APPLY
    (SELECT TOP 1 
         MPT_APPLY.QUANTITY 
     FROM 
         #MASTER_POSANDTRANS as MPT_APPLY
     WHERE 
         MPT_APPLY.ID = MPT.ID) APPLY_RES

提供的表格簡化了多個查詢和並集的結果,並在大約3秒鍾內吐出了大約387行。 但是,當我嘗試將解決方案應用於這387行結果時,我的查詢返回了正確的結果,但需要21秒而不是3秒。

有什么改進建議嗎?

還有一點難題:

  1. 第一個可用的“交易”決定我是多頭還是空頭

  2. 另一個更復雜的問題(對於那些喜歡拼圖的人)是采用平均加權持倉來決定在此期間我是多頭還是空頭。 例如,假設在19日進行了最后一次蘋果交易后,我還剩下0個蘋果,然后又賣出了100萬個蘋果。 這意味着從5月19日至5月31日,我缺席100萬。 (31-19)* -1,000,000 <(19-1)*(該月售出/購買的蘋果的平均數量),因此我當月持有的蘋果被認為是空頭。 如果兩者在任何時候平衡,我將取第1點的值。

您交叉應用選擇缺少訂購依據(日期?)。 它不是確定性的,並且不能保證您確實會獲得第一個記錄。

對於您的樣本數據,此查詢具有更好的查詢計划:

SELECT
    MPT.ID,
    MPT.QUANTITY,
    MPT.START_OR_TRADE_DATE
    , APPLY_RES.QUANTITY as 'FIRST AVAILABLE  QUANTITY',
    CASE
    WHEN APPLY_RES.QUANTITY > 0
        THEN 'LONG'
    ELSE 'SHORT'
    END as 'L/S Indicator'
From MASTER_POSANDTRANS AS MPT
Inner Join (
    Select ID, QUANTITY, N = ROW_NUMBER() over (Partition by ID order by START_OR_TRADE_DATE)
    From MASTER_POSANDTRANS
) as APPLY_RES on APPLY_RES.ID = MPT.ID
Where APPLY_RES.N = 1
--Order By MPT.ID, MPT.START_OR_TRADE_DATE 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM