千家信息网

oracle查询执行计划的方法有哪些

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍"oracle查询执行计划的方法有哪些",在日常操作中,相信很多人在oracle查询执行计划的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"o
千家信息网最后更新 2025年01月22日oracle查询执行计划的方法有哪些

这篇文章主要介绍"oracle查询执行计划的方法有哪些",在日常操作中,相信很多人在oracle查询执行计划的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"oracle查询执行计划的方法有哪些"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1.explain plan for

--无需执行,快捷方便

--没有统计信息,产生的逻辑读,递归等

--无法判断处理了多少行

--无法判断表被访问了多少次

explain plan for select * from t,t1 where t.type=t1.object_name;

select * from table(dbms_xplan.display());

Plan hash value: 2914261090

---------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

---------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 221 | 244 (0)| 00:00:01 |

|* 1 | HASH JOIN | | 1 | 221 | 244 (0)| 00:00:01 |

| 2 | TABLE ACCESS FULL| T | 1 | 142 | 122 (0)| 00:00:01 |

| 3 | TABLE ACCESS FULL| T1 | 1 | 79 | 122 (0)| 00:00:01 |

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."TYPE"="T1"."OBJECT_NAME")

Note

-----

- dynamic statistics used: dynamic sampling (level=2)

19 rows selected.

2.set autotrace on

--有输出统计信息

--必须要等语句执行完之后才有结果--无法看到表被访问了多少次

set autotrace on ---set autotrace traceonly 不输出结果--

select * from t,t1 where t.type=t1.object_name;

Execution Plan

----------------------------------------------------------

Plan hash value: 2914261090

---------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

---------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 221 | 244 (0)| 00:00:01 |

|* 1 | HASH JOIN | | 1 | 221 | 244 (0)| 00:00:01 |

| 2 | TABLE ACCESS FULL| T | 1 | 142 | 122 (0)| 00:00:01 |

| 3 | TABLE ACCESS FULL| T1 | 1 | 79 | 122 (0)| 00:00:01 |

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."TYPE"="T1"."OBJECT_NAME")

Note

-----

- dynamic statistics used: dynamic sampling (level=2)

Statistics

----------------------------------------------------------

4 recursive calls

0 db block gets

896 consistent gets

0 physical reads

0 redo size

889 bytes sent via SQL*Net to client

408 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

3 rows processed

3.statistics_level=all

--可以从Starts看出表被访问多少次,E-Rows,A-Rows预测行数与真实行数,buffer是真实的逻辑读

---语句执行完后才有结果,无法控制不出结果,看不出递归调用和逻辑读

alter session set statistics_level=all;

select * from t,t1 where t.type=t1.object_name;

select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

----------------------------------------------------------------------------------------------------------------

| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |

----------------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | | 3 |00:00:00.01 | 896 | | | |

|* 1 | HASH JOIN | | 1 | 1 | 3 |00:00:00.01 | 896 | 1695K| 1695K| 787K (0)|

| 2 | TABLE ACCESS FULL| T | 1 | 1 | 4 |00:00:00.01 | 447 | | | |

| 3 | TABLE ACCESS FULL| T1 | 1 | 1 | 5 |00:00:00.01 | 449 | | | |

----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."TYPE"="T1"."OBJECT_NAME")

Note

-----

- dynamic statistics used: dynamic sampling (level=2)

4.dbms_xplan.display_cursor

--知道sql_id可以立即得出真是的执行计划,且可以直接得出

--没有相关的统计信息(逻辑读等)--无法判断执行了多少次--无法得出表被访问了多少次

5qn0b7zft4s04

select * from table(dbms_xplan.display_cursor('sql_id'))--共享池获取

select * from table(dbms_xplan.display_awr('sql_id'))--awr性能视图中获取

select * from table(dbms_xplan.display_cursor('5qn0b7zft4s04'))

select * from table(dbms_xplan.display_awr('5qn0b7zft4s04'))

Plan hash value: 2914261090

---------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

---------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | | | 244 (100)| |

|* 1 | HASH JOIN | | 1 | 221 | 244 (0)| 00:00:01 |

| 2 | TABLE ACCESS FULL| T | 1 | 142 | 122 (0)| 00:00:01 |

| 3 | TABLE ACCESS FULL| T1 | 1 | 79 | 122 (0)| 00:00:01 |

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("T"."TYPE"="T1"."OBJECT_NAME")

Note

-----

- dynamic statistics used: dynamic sampling (level=2)

5.10046 trace跟踪

--可以看出语句的等待事件,可以看出sql中的函数调用,

--可以看出处理的行数以及物理读--解析时间以及执行时间

--方便跟踪整个程序包

alter session set events '10046 trace name context forever,level 12'; 开启跟踪

执行语句

alter session set events '10046 trace name context off';

找到文件

tkprof trc文件 目标文件 sys=no sort=prsela,exeela,fchela

[oracle@oracle1 ~]$ cat 1.txt

TKPROF: Release 19.0.0.0.0 - Development on Wed Mar 11 10:25:48 2020

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

Trace file: NGENPR_ora_6661.trc

Sort options: prsela exeela fchela

********************************************************************************

count = number of times OCI procedure was executed

cpu = cpu time in seconds executing

elapsed = elapsed time in seconds executing

disk = number of physical reads of buffers from disk

query = number of buffers gotten for consistent read

current = number of buffers gotten in current mode (usually for update)

rows = number of rows processed by the fetch or execute call

********************************************************************************

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows

------- ------ -------- ---------- ---------- ---------- ---------- ----------

Parse 2 0.00 0.00 0 138 0 0

Execute 2 0.00 0.00 0 0 0 0

Fetch 2 0.00 0.00 0 760 0 3

------- ------ -------- ---------- ---------- ---------- ---------- ----------

total 6 0.00 0.00 0 898 0 3

Misses in library cache during parse: 1

Elapsed times include waiting on following events:

Event waited on Times Max. Wait Total Waited

---------------------------------------- Waited ---------- ------------

Disk file operations I/O 2 0.00 0.00

SQL*Net message to client 3 0.00 0.00

SQL*Net message from client 3 8.24 13.24

OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call count cpu elapsed disk query current rows

------- ------ -------- ---------- ---------- ---------- ---------- ----------

Parse 3 0.00 0.00 0 0 0 0

Execute 3 0.00 0.00 0 0 0 0

Fetch 3 0.00 0.00 0 136 0 2

------- ------ -------- ---------- ---------- ---------- ---------- ----------

total 9 0.00 0.00 0 136 0 2

Misses in library cache during parse: 3

Misses in library cache during execute: 1

2 user SQL statements in session.

3 internal SQL statements in session.

5 SQL statements in session.

********************************************************************************

Trace file: NGENPR_ora_6661.trc

Trace file compatibility: 12.2.0.0

Sort options: prsela exeela fchela

1 session in tracefile.

2 user SQL statements in trace file.

3 internal SQL statements in trace file.

5 SQL statements in trace file.

5 unique SQL statements in trace file.

167 lines in trace file.

5 elapsed seconds in trace file.

6 awrsqlrpt

@?/rdbms/admin/awrsqlrpt

begin end snap

sql_id

六种方法的差异

1.如果结果出不来,只能用1

2.比较简单的方法是1或者2

3.观察多个执行计划只能用4和6

4.如果语句复杂,里面涉及到函数等,只能用5

5.真实的执行计划不能用1

6.想获取表被访问的次数,只能用3

到此,关于"oracle查询执行计划的方法有哪些"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0