我正在執行一個SQL查詢,它可以掃描包含數百萬行的幾個表。 我想實現的是我的選擇查詢應該只返回結果,如果結果集只包含一行。 我知道這兩個approches做到這一點:通過Oracle select:獲取總行數的最快方法
1)使用組,然後 '具有COUNT(*)' '上計數(*)'
2)使用內部查詢,其進一步的用途
但這兩種認可都會妨礙表現。 我想知道,如果有其他更快的方法來做到這一點。如果您需要更多信息,請告訴我。 謝謝。
我正在執行一個SQL查詢,它可以掃描包含數百萬行的幾個表。 我想實現的是我的選擇查詢應該只返回結果,如果結果集只包含一行。 我知道這兩個approches做到這一點:通過Oracle select:獲取總行數的最快方法
1)使用組,然後 '具有COUNT(*)' '上計數(*)'
2)使用內部查詢,其進一步的用途
但這兩種認可都會妨礙表現。 我想知道,如果有其他更快的方法來做到這一點。如果您需要更多信息,請告訴我。 謝謝。
像這樣純粹的SQL方式。
select *
from (select c.*, count(*) over() cnt
from (select * from table where x = 'a' etc) c
where rownum <= 2)
where cnt = 1;
當然
,如果您的查詢通過有秩序,就必須掃描結果集反正(正確索引+也許第一行暗示將幫助,如果是這樣的話。)
如果您的查詢已排序,請將其刪除。既然你只需要一行(或者什麼都不需要),就沒有必要對任何東西進行排序。 – Thilo
Dazzal,你查詢的技巧:)但我想等待更多的答案,以選擇最佳答案。但是,您的解決方案非常好! – user613114
最快的方法是選擇帶有一個停止鍵的前兩行(如果有多個行,客戶端或通過將其包裝到另一個SELECT中,則丟棄結果)。
喜歡的東西
SELECT * from (
SELECT * from
THE_MASSIVE_QUERY_WITH_ALL_SORTING_REMOVED_BECAUSE_YOU_DONT_NEED_IT
) WHERE rownum < 3
這樣,你告訴Oracle停止一旦發現第二排。無需確定實際計數(可能需要很長時間)。
我假設你想只是SQL,而不是PL/SQL(如select into from)將滿足這個2+行= TOO_MANY_ROWS異常。 – DazzaL