试图找出表 X 中是否使用了 id2。使用“计数”的最简单方法:
SELECT COUNT(*) FROM X WHERE id1 = :1 AND id2 = :2 ;
如果X 是一个包含超过 90,00,000 条数据的大表,则上述查询会对性能产生严重影响。有没有性能更好的替代品?
注意:两列在表 X 中都有索引。
试图找出表 X 中是否使用了 id2。使用“计数”的最简单方法:
SELECT COUNT(*) FROM X WHERE id1 = :1 AND id2 = :2 ;
如果X 是一个包含超过 90,00,000 条数据的大表,则上述查询会对性能产生严重影响。有没有性能更好的替代品?
注意:两列在表 X 中都有索引。
如果您使用:
SELECT COUNT(*)
FROM X
WHERE id1 = :1 AND
id2 = :2 AND
ROWNUM = 1;
然后,如果没有找到任何行,您将获得 0,如果找到单行,您将获得 1。
查询将在找到第一行时停止执行,如果没有找到行,您将不必处理 NO_DATA_FOUND 异常。
为此,您确实可以在两列上使用复合索引,因为组合索引可能效率不高。但是,如果其中一个谓词非常有选择性,则可以有效地跳过索引组合并访问表以检查另一列的值。
SELECT * FROM X WHERE id1 = :1 AND id2 = :2 LIMIT 1;
在这种情况下,您只需要存在一行,因此请尝试:
select 1 from dual where EXISTS(SELECT id1 FROM X WHERE id1 = :1 AND id2 = :2)
可能是该表在时间/正在进行的事务中正在使用。您可以添加 WITH (NOLOCK) 并查看是否有任何改进。