【问题标题】:Check if records exist in a table检查表中是否存在记录
【发布时间】:2013-10-09 09:42:44
【问题描述】:

我正在尝试检查我的表中是否存在记录。我发现最有效的方法是使用 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 不是主键并且没有索引。

【问题讨论】:

  • “方法2”更有效。
  • 我们不能说不知道您拥有哪些主键和唯一键。
  • @HardikVinzava 方法 1 选择表中的所有记录,而方法 2 仅选择第一条记录。我知道方法 2 更有效,但为什么我得到相同的执行时间?
  • 因为你是用主键查询的。 Oracle 知道,如果有匹配项,无论如何它只会匹配 1 行。
  • 但我并没有只在 where 子句中使用主键

标签: sql oracle


【解决方案1】:

假设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 &gt; n...

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2013-05-29
      • 1970-01-01
      • 2015-01-21
      • 2012-08-13
      • 2015-01-02
      相关资源
      最近更新 更多