Sql Oracle相当于Postgres解释分析

Sql Oracle相当于Postgres解释分析,sql,oracle,sql-execution-plan,Sql,Oracle,Sql Execution Plan,类似于 我想在Oracle(10g)中获得详细的查询计划和实际执行,类似于PostgreSQL中的解释分析。是否有一种等效的方法?最简单的方法是sql*plus中的自动跟踪 SQL> set autotrace on exp SQL> select count(*) from users ; COUNT(*) ---------- 137553 Execution Plan ----------------------------------------------

类似于


我想在Oracle(10g)中获得详细的查询计划和实际执行,类似于PostgreSQL中的解释分析。是否有一种等效的方法?

最简单的方法是sql*plus中的自动跟踪

SQL> set autotrace on exp
SQL> select count(*) from users ;

  COUNT(*)
----------
    137553


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=66 Card=1)
   1    0   SORT (AGGREGATE)
   2    1     INDEX (FAST FULL SCAN) OF 'SYS_C0062362' (INDEX (UNIQUE)
          ) (Cost=66 Card=137553)
或者,oracle确实有一个
explain plan
语句,您可以执行该语句,然后查询各种计划表。最简单的方法是使用
DBMS\u XPLAN
包:

SQL> explain plan for select count(*) from users ;

Explained.
SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);

--------------------------------------------------------------
| Id  | Operation             | Name         | Rows  | Cost  |
--------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |     1 |    66 |
|   1 |  SORT AGGREGATE       |              |     1 |       |
|   2 |   INDEX FAST FULL SCAN| SYS_C0062362 |   137K|    66 |
--------------------------------------------------------------
如果您是老派,您可以自己查询计划表:

SQL> explain plan set statement_id = 'my_statement' for select count(*) from users;

Explained.

SQL> column "query plan" format a50
SQL> column object_name format a25
SQL> select lpad(' ',2*(level-1))||operation||' '||options "query plan", object_name
from plan_table
start with id=0 and statement_id = '&statement_id'
connect by prior id=parent_id 
  and prior statement_id=statement_id
Enter value for statement_id: my_statement
old   3: start with id=0 and statement_id = '&statement_id'
new   3: start with id=0 and statement_id = 'my_statement'

SELECT STATEMENT
  SORT AGGREGATE
    INDEX FAST FULL SCAN                           SYS_C0062362
Oracle过去提供的实用程序文件
utlxpls.sql
包含该查询的更完整版本。在
$ORACLE\u HOME/rdbms/admin
下进行检查


对于这些方法中的任何一种,您的DBA都必须已经设置了相应的计划表。

我认为这与查询sys.v$sql\u plan或sys.v$sql\u plan\u统计数据有关,但最好运行实际的sql以正确获取这些视图。我已经多年没有使用Oracle了,但是你查过收集计划统计信息吗?请参见第10-11页:请参见如何获取实际执行计划:要获得Postgres显示的相同数量的详细信息,您需要跟踪Oracle会话并查看tkprof生成的输出。@a_horse_与_no_同名,那么您会运行查询,然后运行“从表中选择”(dbms_xplan.DISPLAY_CURSOR(null,null,'ALLSTATS LAST');”接近?如果你想提供答案,我会接受的。(我无法亲自验证,因为我似乎没有足够的权限)解释和自动跟踪将不会显示运行语句时使用的实际计划(如Postgres所做的)。如何使用实际计划而不是预期计划?这似乎等同于解释而不分析。我觉得第二种选择很接近,除了默认的计划表之外,还有其他的计划表可以查询吗?在oracle或postgresql中,预期计划与实际计划没有区别。统计数字可能有所不同,但计划是要运行的。您也可以使用autotrace显示统计信息-
在统计信息上设置autotrace
-但我没有使用它(我不能提供一个示例,因为DBA没有在我的数据库上启用该功能)。有关自动跟踪的详细信息,请参见。@eviotto:explain(和
autotrace
,因为这只是一个解释)和实际计划之间可能存在差异。请参见示例here:and here:and here:and here:@a_horse_,其名称为:我不知道共享的_cursor+bind_peek行为。但大多数帖子都是关于bind变量的,postgres在最常见的情况下基本上都会处理bind变量。如果有什么问题的话,那么问题应该是关于理解解释时间和执行时间之间的环境差异。