【问题标题】:How to see the actual optimized SQL query in a database如何查看数据库中实际优化的 SQL 查询
【发布时间】:2011-05-23 06:56:24
【问题描述】:

数据库通常在执行查询之前对其进行优化。对于使用 JDBC 或命令行客户端发出的查询,可以查看数据库执行的实际优化查询。我正在使用 Oracle 数据库。

【问题讨论】:

    标签: sql database oracle optimization jdbc


    【解决方案1】:

    我认为您误解了 - EXPLAIN PLAN 向您展示了优化器看到的内容的摘要,而不是事实上的查询:

    Rows      Execution Plan
    --------  ----------------------------------------------------
          12  SORT AGGREGATE
           2   SORT GROUP BY
       76563    NESTED LOOPS
       76575     NESTED LOOPS
          19      TABLE ACCESS FULL CN_PAYRUNS_ALL
       76570      TABLE ACCESS BY INDEX ROWID CN_POSTING_DETAILS_ALL
       76570       INDEX RANGE SCAN (object id 178321)
       76563     TABLE ACCESS BY INDEX ROWID CN_PAYMENT_WORKSHEETS_ALL
    11432983      INDEX RANGE SCAN (object id 186024)
    

    优化器所做的决定是基于所涉及的表和任何索引的统计信息。如果事情发生了足够的变化,刷新统计数据可能会发生巨大变化。

    【讨论】:

    • 绝对准确 - DBMS 经常重写查询(通过删除过时的部分,如 WHERE TRUEWHERE a = 1 AND TRUE 等)。但实际上,我也认为 OP 只是误解了EXPLAIN
    • 如果我在 select 查询中请求连接,但连接表的所有列均未请求,并且 where 子句仅出于有效执行连接的目的而包含连接列的列,该怎么办?使加入变得不必要。是否仍会执行联接?
    • “有效执行连接的目的,使连接变得不必要”——您为什么这么认为?即使您没有从联接表中选择任何字段,INNER JOIN 子句也可以更改结果集。这不是 DBMS 业务 - 为您考虑:如果您不需要加入,只需自行删除。
    • @iamrohitbanga:恕我直言,这是一个不同的问题。但假设语法有效,则始终应用 JOIN ——结果集反映了这一点。如果没有数据支持该标准,您将一无所获。这不是优化器问题 - 只能查看优化器 EXPLAIN 输出以加快查询速度。
    • @zerkms:实际上,Oracle 会从查询中删除一个表,如果它可以保证没有它的结果集是相同的。
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多