rownum在特定值之后非常慢

时间:2016-05-31 13:41:10

标签: oracle rownum

我在Oracle SQL开发人员中运行查询,如下所示:

从dummy_table中选择*,其中col1< 10和col2< 20和col3< 40 和 rownum< = x

如果x的值是< = 12。

,查询大约需要3秒钟并返回x行

但是如果将x替换为大于12的任何值,则查询将花费超过7秒并且仅返回12个结果(换句话说,只有12行满足where子句)。

为什么rownum表现得像这样?如果x的值从12更改为13,我期望此查询几乎占用相同的时间。

编辑:我注意到的另一件事是col1,col2和col3上有一个复合索引。如果我删除索引(或使用提示禁用它),查询运行得非常快。

1 个答案:

答案 0 :(得分:4)

如果不知道表格结构,索引等,很难给出完整的解释。

但是,为了简单起见,如果您的表只有12行符合您的条件,那么要求前12行意味着Oracle只查找12行并返回它们,无论行数与您的行不匹配条件。

如果你要求13行,Orace需要扫描整个表,检查是否存在第13行。

因此,如果没有索引和提示,要求前12行只存在12行可能需要全表扫描,这可能会很慢。

请将此视为非常简化的解释,而不是考虑索引,缓存,提示。例如,我们不会考虑通过简单地运行查询来检查查询的性能可能会产生误导,因为Oracle可能会使用缓存,并且您可以在第一次运行后获得更好的性能。

相关问题