2012-06-15 48 views
-2

我想知道下面的查詢是否被優化?簡化查詢以提高執行時間

select 
    SUM(payments.paid_amt) as paid_amt, 
    SUM(payments.copay_amt) as copay_amt, 
    SUM(payments.CO_INSURANCE_AMT) as co_ins_amt, 
    payor_group.PAYOR_GROUP as payor_group, 
    DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month, 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year 

    from 
    [F_PAYOR_PAYMENTS_monthly] payments 

    join D_PAYOR payor 
    on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID 

    join D_PAYOR_GROUP payor_group 
    on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY 

    join F_ACCESSION_DAILY accession 
    on accession.ACCESSION_ID=payments.ACCESSION_ID 

    group by payor_group.PAYOR_GROUP, DATEPART(MM,accession.XIFIN_LOAD_DATE), 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) 

現在它已經執行了大約1.5個小時。沒有任何表格上的索引!

每個表格都有大約10,000,000行。

有沒有什麼辦法可以簡化這個查詢來提高執行時間?

非常感謝您的指導和時間。

+2

你需要指數!!!!! – zebediah49

+0

是的絕對,但在我把這些之前,我想知道我的查詢是否可以改進 –

+0

我不完全知道你爲什麼要做嵌套選擇,而不是同時做所有的分組。使其成爲單個查詢可能有幫助,也可能無幫助。 – zebediah49

回答

1

爲什麼要用一個With?

select 
    SUM(payments.paid_amt) as paid_amt, 
    SUM(payments.copay_amt) as copay_amt, 
    SUM(payments.CO_INSURANCE_AMT) as co_ins_amt, 
    payor_group.PAYOR_GROUP as payor_group, 
    DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month, 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year 

    from 
    [F_PAYOR_PAYMENTS_monthly] payments 

    join D_PAYOR payor 
    on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID 

    join D_PAYOR_GROUP payor_group 
    on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY 

    join F_ACCESSION_MONTHLY accession 
    on accession.ACCESSION_ID=payments.ACCESSION_ID 

    group by payor_group.PAYOR_GROUP, DATEPART(MM,accession.XIFIN_LOAD_DATE), 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) 
+0

非常感謝這工作! –

2

每行10m的表上沒有索引最有可能會導致您的性能下降。任何運行一小時的查詢都沒有進行優化,需要注意。大多數查詢應該在幾秒鐘內運行。

我建議您開始在您的關鍵列(payor.payor_id ,, payments.payment_payor_id,payor.payor_group_key,paygor_group.payor_group_key,payments.accession_id)上添加索引。之後,嘗試使用「包括實際執行計劃」選項在SSMS中運行查詢(在查詢文件菜單下)。運行你的查詢,它會向你建議額外的索引,你應該考慮應用。

您的表是否受到來自其他進程的大量負載?他們是否接受大量傳入數據?

在您將注意力放在更改查詢語法或進行任何「其他」優化之前,您需要應用索引。在獲取索引後,查詢以正常速率執行(< 1分鐘),您可以查看其他索引調整或在需要時添加表/查詢提示。

+0

謝謝。 WITH NO LOCK做什麼?我們在LOAD過程中每天僅接收一次傳入數據 –

+5

請不要給這樣的nolock建議。 nolock很少需要而且很危險。另外,這裏不是問題。 – usr

+1

WITH(READPAST)'可能是一個更好的主意。它避免了鎖(像'WITH(NOLOCK)')並且不會導致髒讀(*不像*'WITH(NOLOCK)')。 –

1

在您的第一個查詢中,您將按accession.XIFIN_LOAD_DATE進行分組,而不是該日期的月/年,這就是您需要第二個分組的原因。如果你解決這個問題,那麼這只是一個查詢。這應該會提高性能,但索引將是最大的幫助。