2010-05-28 167 views
0

哪些查詢更有效?哪些查詢更高效?

select 1 as newAndClosed 
    from sysibm.sysdummy1 
    where exists (
     select 1 
      from items 
      where new = 1 
     ) 
     and not exists (
      select 1 
       from status 
       where open = 1 
     ) 


select 1 as newAndClosed 
    from items 
    where new = 1 
     and not exists (
      select 1 
       from status 
       where open = 1 
     ) 
+2

這些查詢是否有效?他們是真的嗎?你有沒有檢查計劃/解釋?我不知道你在做什麼,但你應該加入你的桌子。 – Konerak 2010-05-28 17:25:57

+0

@Konerak:表聯合比EXISTS子句更昂貴,以便爲引擎運行。 – 2010-05-28 17:32:22

+0

@Konerak:你爲什麼覺得有必要加入表格?如果需要檢查此時是否有任何「新項目」(bug)和沒有人(其他非相關實體)處於「打開狀態」(bug-resolver),請執行某些操作(對客戶說不 - 現在將被分配到此錯誤) – ony 2010-05-28 17:36:55

回答

1

查看解釋計劃和/或分析器輸出。另外,測量它。使用綁定變量和重複運行來衡量它。

0

我個人會說第二個查詢。

首先,它直接查詢表Items,並使用WHERE子句過濾該表的字段。

其次,它只使用另一個子查詢,而不是兩個。

最後,第二個例子結束時只做了兩個查詢,當第一個例子有三個時。

許多查詢總是比用於管理數據庫引擎的查詢更少。除非您執行EXISTS驗證而不是表格關節。一個聯合比一個EXISTS子句更昂貴。

0

我覺得第二個是速度更快,因爲上違背了第一個,SYSIBM.SYSDUMMY1表並不需要解析

0

從一個簡單的角度,我期望查詢2跑得更快,因爲它涉及的查詢次數較少,但漢克指出,通過Profiler運行它是確保最好的方法。

0

如果items包含多個元素new = 1,它們將產生不同的結果。 exists只會檢查符合條件的第一條記錄。所以我會爲第一個變體投票,如果在實際查詢中你沒有itemsstatus之間的關係(如你的例子)。

P.S.通常我只用SELECT 1 WHERE 2==2當我只需要一個結果。如果我需要更多SELECT 1 UNION SELECT 2