我正在尝试检查表格中是否存在记录。我发现最有效的方法是使用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
不是主键且没有索引。
答案 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在找到第一个匹配的行时立即停止查找”。