2012-11-29 80 views
0

我正在執行一個SQL查詢,它可以掃描包含數百萬行的幾個表。 我想實現的是我的選擇查詢應該只返回結果,如果結果集只包含一行。 我知道這兩個approches做到這一點:通過Oracle select:獲取總行數的最快方法

1)使用組,然後 '具有COUNT(*)' '上計數(*)'

2)使用內部查詢,其進一步的用途

但這兩種認可都會妨礙表現。 我想知道,如果有其他更快的方法來做到這一點。如果您需要更多信息,請告訴我。 謝謝。

+0

我假設你想只是SQL,而不是PL/SQL(如select into from)將滿足這個2+行= TOO_MANY_ROWS異常。 – DazzaL

回答

1

像這樣純粹的SQL方式。

select * 
    from (select c.*, count(*) over() cnt 
      from (select * from table where x = 'a' etc) c 
     where rownum <= 2) 
where cnt = 1; 
當然

,如果您的查詢通過有秩序,就必須掃描結果集反正(正確索引+也許第一行暗示將幫助,如果是這樣的話。)

+0

如果您的查詢已排序,請將其刪除。既然你只需要一行(或者什麼都不需要),就沒有必要對任何東西進行排序。 – Thilo

+0

Dazzal,你查詢的技巧:)但我想等待更多的答案,以選擇最佳答案。但是,您的解決方案非常好! – user613114

0

最快的方法是選擇帶有一個停止鍵的前兩行(如果有多個行,客戶端或通過將其包裝到另一個SELECT中,則丟棄結果)。

喜歡的東西

SELECT * from (
    SELECT * from 
    THE_MASSIVE_QUERY_WITH_ALL_SORTING_REMOVED_BECAUSE_YOU_DONT_NEED_IT 
) WHERE rownum < 3 

這樣,你告訴Oracle停止一旦發現第二排。無需確定實際計數(可能需要很長時間)。

相關問題