如何获取查询sql Oracle DB的每个表中访问的行数

问题描述

我必须在 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> begin
  2    dbms_stats.gather_table_stats('SCOTT','EMP');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL>
,

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

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

SQL 内容存储在 V$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,CARDINALITY,LAST_OUTPUT_ROWS
FROM V$SQL_PLAN_STATISTICS_ALL

你可以展示它

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

附加,您可以在

中查看
SELECT *
FROM SYS.DBA_HIST_SQLTEXT

SELECT SQL_ID,CARDINALITY
FROM SYS.DBA_HIST_SQL_PLAN

SELECT SQL_ID,LAST_OUTPUT_ROWS
FROM SYS.DBA_SQLSET_PLANS;