1

试图找出表 X 中是否使用了 id2。使用“计数”的最简单方法:

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

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

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

4

4 回答 4

3

如果您使用:

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

然后,如果没有找到任何行,您将获得 0,如果找到单行,您将获得 1。

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

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

于 2013-07-22T07:31:08.660 回答
2
SELECT * FROM X WHERE id1 = :1 AND id2 = :2 LIMIT 1;
于 2013-07-22T05:52:46.033 回答
2

在这种情况下,您只需要存在一行,因此请尝试:

select 1 from dual where EXISTS(SELECT id1 FROM X WHERE id1 = :1 AND id2 = :2) 
于 2013-07-22T05:56:22.203 回答
0

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

于 2013-07-22T05:56:04.477 回答