1

我在 Oracle Database 11g 上使用 Oracle PL/SQL Developer。我最近写了一个带有一些奇怪行为的视图。当我运行下面的简单查询而不获取查询的最后一页时,查询时间约为 0.5 秒(缓存时为 0.2)。

select * from covenant.v_status_covenant_tuning where bankkode = '4210';

但是,如果我在 PL/SQL Developer 中获取最后一页,或者如果我从 Java 代码运行查询(即我运行一个检索所有行的查询),视图会发生某些事情并且查询时间会增加到大约 20-30秒。

在我重新编译之前,该视图无法再次正常工作。解释计划前后完全一样。分析所有索引和表。我不知道它是否相关,但该视图使用了一些分析表达式,例如 rank() over (partition by .....)、lag()、lead() 等。

因为我是新来的,所以我无法发布解释计划的图片(需要 10 的声誉),但总的来说优化器有效地使用了索引,并且由于分析功能,它做了一些排序。

4

1 回答 1

1

如果计划涉及某种完整扫描,则查询将在表中的最后一个块被读取之前完成。

想象一个表,在表的前几个块中有很多匹配的行,而其余部分没有匹配的行。如果要检查大量块,则查询可能会很快返回结果的前几页,因为它会在表的前几个块中找到它们。但是在它可以将最终的“没有更多结果”返回给客户端之前,它必须检查表的每个最后一个块 - 它不知道表的最后一个块中是否可能还有一个结果,所以它有等到它读完最后一个块。

如果您需要更多帮助,请发布您的查询计划。

于 2013-09-03T05:11:00.220 回答