Oracle检查大表中是否存在行

时间:2013-07-22 05:46:31

标签: sql oracle count indexing query-performance

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

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

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

  

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

4 个答案:

答案 0 :(得分:3)

如果您使用:

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

如果没有找到行,则会得到0,如果找到一行,则得到1。

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

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

答案 1 :(得分:2)

SELECT * FROM X WHERE id1 = :1 AND id2 = :2 LIMIT 1;

答案 2 :(得分:2)

此条件只需要存在一行,请尝试:

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

答案 3 :(得分:0)

可能是该表在正在进行的时间/正在进行的交易中使用。您可以添加WITH(NOLOCK)并查看是否可以改善任何内容。