1

我正在尝试检查我的表中是否存在记录。我发现最有效的方法是使用 DUAL 表。但是,我不能 100% 确定这种方法是如何工作的。我有一个包含数千条记录(几乎一百万条)的表。这两种方法之间是否有任何重大区别,请记住表中存在很多记录:

方法一:

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

方法二:

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

4

2 回答 2

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......

于 2013-10-09T10:03:53.510 回答
0

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

于 2013-10-09T12:23:48.933 回答