【问题标题】:Oracle checking for existence of rows in a large tableOracle 检查大表中是否存在行
【发布时间】:2013-07-22 05:46:30
【问题描述】:

尝试查找表X中是否使用了id2。使用'count'的最简单方法:

SELECT COUNT(*) FROM X WHERE id1 = :1 AND id2 = :2 ;

如果 X 是一个包含超过 90,00,000 条数据的大表,则上述查询会对性能产生严重影响。有没有性能更好的替代品?

注意:两列在表 X 中都有索引。

【问题讨论】:

  • 怎么样Select First Row

标签: sql oracle count indexing query-performance


【解决方案1】:

如果你使用:

SELECT COUNT(*)
FROM   X
WHERE  id1 = :1 AND
       id2 = :2 AND
       ROWNUM = 1;

如果没有找到行,则为 0,如果找到单行,则为 1。

查询将在找到第一行时停止执行,如果没有找到行,您将不必处理 NO_DATA_FOUND 异常。

您确实可以为此在两列上使用复合索引,因为组合索引可能效率不高。但是,如果其中一个谓词非常有选择性,则可以有效地跳过索引组合并访问表以检查另一列的值。

【讨论】:

    【解决方案2】:
    SELECT * FROM X WHERE id1 = :1 AND id2 = :2 LIMIT 1;
    

    【讨论】:

    【解决方案3】:

    在这种情况下你只需要存在一行,所以试试:

    select 1 from dual where EXISTS(SELECT id1 FROM X WHERE id1 = :1 AND id2 = :2) 
    

    【讨论】:

      【解决方案4】:

      可能是该表在当时/正在进行的事务中正在使用。您可以添加 WITH (NOLOCK) 并查看是否有任何改进。

      【讨论】:

      • 这与 Oracle 无关。作家不会阻止读者。
      猜你喜欢
      • 2010-12-27
      • 2021-10-27
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2021-11-11
      • 2016-01-01
      相关资源
      最近更新 更多