【问题标题】:How to get number of rows accessed in each table of a query sql Oracle DB如何获取查询sql Oracle DB的每个表中访问的行数
【发布时间】:2021-07-18 19:40:00
【问题描述】:

我必须在 sql 查询 - oracle db 中获取每个表中访问的行数。例如:

select *
from a inner join b on  a.t = b.t
where a.x in (1,2,3)

result expect:
table a: 5 rows
table b: 10 rows

我用过

EXPLAIN PLAN FOR ...

然后

SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY);

但行数似乎并不准确。结果是解释计划。我该如何解决。谢谢

【问题讨论】:

    标签: sql database oracle sql-execution-plan explain


    【解决方案1】:

    我做到了。找出在解释中访问的行。我这样做

    解释计划 选择 ... 从 ... 哪里...

    V$SQL 中的 SQL 内容存储。结果解释明文存储在 V$SQL_PLAN 中

    SELECT SQL_ID, OPERATION, OPTIONS, OBJECT_NAME, OBJECT_TYPE, CARDINALITY
    FROM V$SQL_PLAN
    

    你可以显示它

    SELECT *
    FROM TABLE(DBMS_XPLAN.DISPLAY());
    

    找出执行计划中访问的行。我这样做

    -- ALTER SESSION SET STATISTICS_LEVEL = ALL;
    SELECT /*+ gather_plan_statistics TEST_PLAN*/ *
    from ...
    where ...
    

    结果解释明文存储在 V$SQL_PLAN_STATISTICS_ALL 中

    SELECT SQL_ID, OPERATION, OPTIONS, OBJECT_NAME, OBJECT_TYPE, CARDINALITY, LAST_OUTPUT_ROWS
    FROM V$SQL_PLAN_STATISTICS_ALL
    

    你可以显示它

    SELECT *
    FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('sqlid',0,'ALLSTATS LAST'));
    

    附加的,你可以在里面查看

    SELECT *
    FROM SYS.DBA_HIST_SQLTEXT
    
    SELECT SQL_ID, OPERATION, OPTIONS, OBJECT_NAME, OBJECT_TYPE, CARDINALITY
    FROM SYS.DBA_HIST_SQL_PLAN
    
    SELECT SQL_ID, OPERATION, OPTIONS, OBJECT_NAME, OBJECT_TYPE, CARDINALITY, LAST_OUTPUT_ROWS
    FROM SYS.DBA_SQLSET_PLANS;
    

    【讨论】:

      【解决方案2】:

      似乎统计信息不是最新的。

      收集两个表的统计信息,然后再次运行解释计划。如何?像这样:

      SQL> begin
        2    dbms_stats.gather_table_stats('SCOTT', 'EMP');
        3  end;
        4  /
      
      PL/SQL procedure successfully completed.
      
      SQL>
      

      【讨论】:

      • Explain 显示 E 行,但实际计划和行数可能不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2015-06-21
      • 2014-06-06
      相关资源
      最近更新 更多