检查表中是否存在记录

时间:2013-10-09 09:42:44

标签: sql oracle

我正在尝试检查表格中是否存在记录。我发现最有效的方法是使用DUAL表。但是,我不能100%确定这种方法的工作原理。我有一张包含数千条记录(近五十万)的表格。这两种方法之间是否存在重大差异,请记住表中存在大量记录:

方法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不是主键且没有索引。

2 个答案:

答案 0 :(得分: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也可以,但我总是将rownum上的支票写为小于或等于一个值,以提醒我永远不会rownum > n。 ..

答案 1 :(得分:0)

我终于在another question找到了答案。由于正在使用EXISTS子句,因此上述问题中的两种方法都是相同的。正如Justin Cave在附带的问题中所解释的那样,“EXISTS子句允许Oracle在找到第一个匹配的行时立即停止查找”。