Oracle

如何在不掃描整個表的情況下檢查 Oracle 中的存在?

  • September 30, 2020

通常,要檢查 Oracle 中的存在,我會這樣做:

SELECT COUNT(1)
FROM foo
WHERE bar = 'baz'

但是,如果foo表包含多行 where bar='baz',則此查詢不必要地掃描整個表以報告總計數。

如何快速檢查表中的列是否包含至少一個具有指定值的行,並使查詢短路,以便一旦檢測到該值存在,查詢將停止並返回,而不是掃描整個表?

理想情況下,無論表中有多少行包含該值,我都希望此查詢返回一個標量值。


以下解決方案似乎是短路的(與 相比SELECT COUNT(1),這對於大表來說要快得多),但是如果值存在,它將返回 1,或者如果值不存在,則根本不返回任何行。如果總是返回一行會更好。

SELECT 1
FROM DUAL
WHERE EXISTS (
   SELECT 1
   FROM foo
   WHERE bar = 'baz'
)

只需將兩者結合起來:

SELECT count(*)
FROM DUAL
WHERE EXISTS (
   SELECT 1
   FROM foo
   WHERE bar = 'baz'
)

除了 Balazs 對您的查詢的自然改進之外,以下內容應該有效

select count(*)
from foo
where bar='baz'
and rownum=1

引用自:https://dba.stackexchange.com/questions/276352