【问题标题】:oracle does full table scan but returns resutls so quicklyoracle 进行全表扫描,但返回结果如此之快
【发布时间】:2012-10-15 14:20:23
【问题描述】:

当我打开 TOAD 并执行 select * from table 时,结果(前 500 行)几乎立即返回。但是解释计划显示全表扫描并且表非常巨大。 怎么这么快就出结果了?

【问题讨论】:

    标签: oracle11g toad full-table-scan


    【解决方案1】:

    一般来说,Oracle 在开始返回数据之前不需要物化整个结果集(当然,在某些情况下,Oracle 必须物化结果集以便在开始返回数据之前对其进行排序) .假设您的查询不需要实现整个结果集,Oracle 将开始将数据返回到客户端进程,无论该客户端进程是 TOAD 还是 SQL*Plus 还是您编写的 JDBC 应用程序。当客户端请求更多数据时,Oracle 将继续执行查询并返回下一页结果。这允许 TOAD 相对较快地返回前 500 行,即使 Oracle 最终需要花费数小时来执行整个查询并将最后一行返回给客户端。

    【讨论】:

    • 谢谢。但是我看到,如果我通过在表上执行 select * 创建一个视图,然后执行 :select * from view 则需要更长的时间。这是为什么呢?
    • @Kaushik - 应该没有区别。您是否看到不同的查询计划所涉及的视图?任一查询是否都有谓词(WHERE 子句)?
    • 对不起,我错了。视图有一些复杂的谓词,这就是问题所在。
    【解决方案2】:

    Toad 仅返回前 500 行以提高性能,但如果您通过 Oracle 接口(例如 JDBC)运行该查询,它将返回整个结果。我最好的猜测是,解释计划会在没有获得记录子集的情况下向您显示结果;这就是我使用它的方式。除了我自己的经验之外,我没有其他来源。

    【讨论】:

    • 谢谢。但我的问题是,即使它只返回 500 行,结果怎么这么快?它不会获取整个记录集然后从中获取 500 行吗?
    • 很好的区分,对不起,我误解了。上面的答案解释了它。
    猜你喜欢
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多