2013-10-09 167 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一找到第一个匹配行就停止查找”。