2013-10-09 169 views
1

我想檢查我的表中是否存在記錄。我發現最有效的方法是使用DUAL表格。但是,我不能100%確定這種方法的工作原理。我有一張包含數千條記錄(差不多50萬)的表格。有這兩種方法之間的主要區別,牢記了很多紀錄都存在於表:檢查表中是否存在記錄

方法1:

SELECT 1 
FROM DUAL 
WHERE EXISTS(SELECT * 
      FROM MY_TABLE 
      WHERE MY_COLUMN_PK = 'MY_VALUE' 
      AND MY_COLUMN = 'MY_VALUE') 

方法2:

SELECT 1 
FROM DUAL 
WHERE EXISTS(SELECT * 
      FROM MY_TABLE 
      WHERE MY_COLUMN_PK = 'MY_VALUE' 
      AND MY_COLUMN = 'MY_VALUE' 
      AND ROWNUM=1) 

我已經在我的數據庫客戶端軟件中執行了兩個查詢,並且這兩個查詢的執行時間都差不多。

說明:MY_COLUMN_PK是我的表的主鍵,而MY_COLUMN不是主鍵,也沒有索引。

+0

「方法2」更有效。 –

+0

我們不能不知道你有哪些主要和唯一的密鑰。 –

+0

@HardikVinzava方法1選擇表中的所有記錄,而方法2僅選擇第一條記錄。我知道方法2更有效,但我爲什麼獲得相同的執行時間? – user1135357

回答

2

假設my_column形成唯一或主鍵,

select 1 
from my_table 
where my_column = 'my_value'; 

就足夠了。

如果要檢查的列不唯一,那麼您只需檢查是否存在1行。在這種情況下:

select /*+ first_rows */ 1 
from my_table 
where my_column = 'my_value' 
and rownum <= 1; 

是最好的。在老版本的Oracle中,使用first_rows提示是必需的,但現在可能不需要。它告訴優化器我們想優化以儘可能快地返回行(因爲我們只需要1行)。

此外,rownum = 1是OK,但我卻總是寫我的rownum檢查其是否小於或等於值來提醒我,我永遠做不到rownum > n ...

0

我終於找到了答案在another question。由於使用了EXISTS子句,因此上述問題中的兩種方法都是相同的。正如Justin Cave在附帶問題中所解釋的那樣,「EXISTS子句允許Oracle一找到第一個匹配行就停止查找」。