2011-03-22 53 views
0

下面是該查詢:想知道是否有另外其他的方式來增加indicies使下面的SQL查詢更高效

SELECT DISTINCT patientid.acct 
FROM patientid, 
     doc_table 
WHERE patientid.acct = doc_table.acct 
     AND patientType IN ('I', '1', 'T') 
     AND fid IN ('023') 
     AND (dischargedate IS NULL 
       OR dischargedate = '' 
       OR dischargedate < '19000101') 
     AND dbcreate_date > DATEADD(hh, -24, GETDATE()); 

我們將增加對indicies patientType,FID dischargedate和dbcreate_date。但是我想知道查詢本身是否可以用不同的方式編寫,以提高效率。

謝謝的

+0

(我回滾到我的編輯,因爲它修復了原始查詢有點分心智能引號)。什麼是'dischargedate'的數據類型?爲什麼不是'date'或'datetime'數據類型? – 2011-03-22 14:02:56

回答

0

使用WHERE EXISTS代替JOIN和獲得與DISTINCT

0

有一件事你應該考慮去掉重複的:修正值列dischargedate,並選擇一個值,該值表示null or '' or < '19000101'所以你可以擺脫or:a)花費時間和b)數據庫不應該是一團糟。

1

沒有更多的信息很難硬性規定,但一般:

1 - 你確定你需要DISTINCT?對於大型數據集,這可能是一項昂貴的操作。運行沒有它的查詢來查看結果是否不同。如果他們這樣做,你可能想改變結構以消除重複。

2 - 先將限制性最強的條件放在您的WHERE條款中,然後按限制的降序排列。例如,如果您的patienttype篩選器將結果降至50%,但fid篩選器將其降至20%,請首先使用fid篩選器。

3 - 對於索引,請確保您的JOIN鍵索引爲:patientid.acctdoc_table.acct這可能會對性能產生最大影響。

作爲一個方面,使用明確的JOIN語法,它更容易閱讀和維護,特別是在較長的查詢。修改後的版本將是:

SELECT DISTINCT patientid.acct 
FROM patientid 
INNER JOIN doc_table 
    ON patientid.acct = doc_table.acct 
WHERE patientType IN ('I', '1', 'T') 
... 
+0

SQL Server不使用短路評估,如第2點所暗示的那樣。它會根據它認爲合適的情況自動重新排列條件。 – 2011-03-22 14:18:18

+0

@Martin - 在某些情況下它很重要,我已經提高了長時間運行的查詢的性能。通常情況下,只有在涉及'EXISTS'時,請參閱:http://bradsruminations.blogspot.com/2010/04/looking-under-hood.html – JNK 2011-03-22 14:21:38

+0

我只會添加使用GROUP BY而不是DISTINCT作爲最後一個替代。 – MatBailie 2011-03-22 14:22:02

相關問題