评估和提升oracle数据库性能的主要工具
SQL是一种非过程化的语言,我们定义的sql语句仅仅告诉数据库我们需要什么样的数据,并没有告诉数据库如何获取这些数据。而执行计划正式数据库获取这些数据的方式和步骤。在日常开发中,为了优化数据库的需要,我们常常需要获取sql语句的执行计划,通过它判断
SQL是一种非过程化的语言,我们定义的sql语句仅仅告诉数据库我们需要什么样的数据,并没有告诉数据库如何获取这些数据。而执行计划正式数据库获取这些数据的方式和步骤。在日常开发中,为了优化数据库的需要,我们常常需要获取sql语句的执行计划,通过它判断语句执行性能的高低,进而进行优化。那么怎么获得执行计划呢?
1、获取SQL执行计划的方式
- 使用explain plan工具
- 查询动态性能视图
- 启用执行计划跟踪功能,即autotrace功能
-
使用PL/SQL Developer提供的获取执行计划方法
下面分别详细介绍下及几种获取执行计划的方式:
1.1 使用explain plan工具
explain plan命令可以将一条SQL语句预估的执行计划插入到计划表plan table,然后查询该表来获取预估的执行计划。 explain plan命令将SQL语句的执行计划插入到计划表,并不会执行隐式commit,所以如果想要持久化到数据库,需要显示commit。
提示:explain plan命令获得的执行计划是预估的,因为它并不是该SQL语句真正执行时的执行计划,随着oracle库中参数、表数据等因素的变化(比如表的数据的太少,虽然某些字段上建了索引,在执行时索引并不一定真正其效果,但是explain plan获得执行计划可能是走索引的),预估的执行计划往往和实际是有出入的。
1.1.1 前提条件
预估的执行计划要存入plan table表,所以执行explain plan之前要确保plan table表的存在。在oracle 10g之前,plan table表是需要手动创建的,从oracle 10g开始,oracle会自动创建全局plan table表(表名为PLAN_TABLE),供所有用户使用。
如何要创建表plan_table,或创建其他的计划表呢?
找到$ORACLE_HOME/rdbms/admin/utlxplan.sql脚本文件,可以根据该脚本创建自己想要的计划表,只需要根据情况修改表名plan_table即可。
提示:关于计划表plan_table介绍请参考《Oracle 10g版本计划表PLAN_TABLE列的说明》
1.1.2 explain plan语法
EXPLAIN PLAN
[SET STATEMENT_ID = 'statement_id']
[INTO table_name]
FOR sql_statement
说明:
1、方括号[]中的语句是可选的。
2、相关选项说明
<span></span>
选项 |
说明 |
statement_id |
标识存入表plan_table的sql语句的执行计划,不同sql语句的执行计划可以共用相同的statement_id标识,但是为了进行区分,尽量唯一,可以通过statement_id作为条件查询plan_table表中的执行计划。 |
table_name |
执行计划表的名称,如果没有指定,默认表名plan_table,如果指定的表不是plan_table表,而是自定义的,必须要确保该表和标准的计划表结果相同。 |
sql_statement |
sql语句,该sql语句可以包含绑定变量。 |
1.1.3 执行计划查询和展现
下面介绍两种查询执行计划的方法:使用dbms_xplan包、自定义层次查询语句,这两种方法都是从计划表查询数据,通过使用dbms_xplan包查询执行计划,默认计划表名为plan_table, 而且查询出来的参数数据也是固定的;但是通过自定义的层次查询语句不但可以自由指定计划表,还可以根据情况选择查询参数。
- 使用DBMS_XPLAN包查看执行计划
语句如下:
<span></span>
SELECT * FROM TABLE(dbms_xplan.display());
SQL> explain plan 2 for select * from t_student where gid = 1; Explained SQL> SELECT * FROM TABLE(dbms_xplan.display()); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 1947974170 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU) -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 595 | 0 (0) | 1 | TABLE ACCESS BY INDEX ROWID| T_STUDENT | 1 | 595 | 0 (0) |* 2 | INDEX UNIQUE SCAN | SYS_C0010947 | 1 | | 0 (0) -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("GID"=1) 14 rows selected
- 自定义层次查询语句执行计划
查询语句如下:
<span></span>
SELECT RTRIM(LPAD(' ', 2*LEVEL)|| RTRIM(operation)||' '|| RTRIM(options)||' '|| object_name) query_plan, cost, cardinality, time FROM plan_table CONNECT BY PRIOR id = parent_id START WITH ID = 0;
如:
SQL> explain plan 2 for select * from t_student where gid = 1; Explained SQL> SELECT RTRIM(LPAD(' ', 2*LEVEL)|| 2 RTRIM(operation)||' '|| 3 RTRIM(options)||' '|| 4 object_name) query_plan, cost, cardinality, time 5 FROM plan_table 6 CONNECT BY PRIOR id = parent_id 7 START WITH ID = 0; QUERY_PLAN COST CARDINALITY TIME -------------------------------------------------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- SELECT STATEMENT 0 1 1 TABLE ACCESS BY INDEX ROWID T_STUDENT 0 1 1 INDEX UNIQUE SCAN SYS_C0010947 0 1 1
1.2、查询动态性能视图
上面1.1章节介绍查询的执行计划,都是预估的执行计划。而动态性能视图中缓存的SQL执行信息,则是真实的执行计划。
下面介绍一下几个动态视图:
- V$SQL:缓存着已执行的SQL语句的时间消耗、CPU或IO需求等信息。
- V$SQL_PLAN:缓存SQL语句的执行计划信息。
- V$SQL_PLAN_STATICS:记录着执行计划每个步骤执行次数、IO次数以及处理记录数。
通过动态性能视图查询较高SQL的执行计划的思路是:
1.通过挖掘V$SQL中具有较高时间消耗、CPU或IO需求的SQL语句。这一步通过自定义SQL完成。比如消耗时间最多的前10条语句,
查询语句如下:
<span></span>
SELECT sql_id, child_number, sql_text, elapsed_time FROM ( SELECT sql_id, child_number, sql_text, elapsed_time, cpu_time, disk_reads, RANK () OVER (ORDER BY elapsed_time DESC) AS elapsed_rank FROM v$sql) WHERE elapsed_rank <p><span><span><span> 2.<span>通过使用</span></span><span><span>V$SQL_PLAN和V$SQL_PLAN_STATICS找到不尽如人意的SQL语句的执行计划。这一步不需要我们写SQL,DBMS_XPLAN已经为提供可查询方法DBMS_XPLAN.display_cursor().具体使用请参考《DBMS_XPLAN包中函数的使用》。</span></span></span></span></p> <p><span><span><span><span><br> </span></span></span></span></p> <p><span><span><span> <span>例子:</span></span></span></span></p> <p><span><span></span></span></p><pre class="brush:php;toolbar:false">SQL> SELECT sql_id, child_number, sql_text, elapsed_time 2 FROM ( SELECT sql_id, child_number, sql_text, elapsed_time, cpu_time, disk_reads, 3 RANK () OVER (ORDER BY elapsed_time DESC) AS elapsed_rank 4 FROM v$sql) 5 WHERE elapsed_rank SELECT * FROM TABLE(DBMS_XPLAN.display_cursor('at5b8k7swu5w4', '0', 'TYPICAL')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- SQL_ID at5b8k7swu5w4, child number 0 ------------------------------------- select * from t_student where gid = 2 Plan hash value: 1947974170 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU) -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 (100) | 1 | TABLE ACCESS BY INDEX ROWID| T_STUDENT | 1 | 595 | 0 (0) |* 2 | INDEX UNIQUE SCAN | SYS_C0010947 | 1 | | 0 (0) -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("GID"=2) 19 rows selected
1.3、启用执行计划跟踪功能
工具EXPLAIN PLAN和DBMS_XPLAN可以获取预估执行计划和缓存中的执行信息,他们是主要的SQL调优工具,但是他们只是获取单个SQL的执行信息。如果想获取特定事务或是应用优化一批SQL语句,跟踪(Tracing)是个有效的方法。跟踪可以提供EXPLAIN PLAN与DBMS_XPLAIN能提供的所有信息,并且更加准确详尽,因为它是执行SQL时的真实的执行计划。
<span> SQL跟踪包括两个基本组成部分: </span><span> 1. SQL跟踪:在当前会话或其他会话中启动跟踪。 </span><span><span> 2. tkprof工具:格式化跟踪文件,因为生成的跟踪文件对使用者不容易读取,使用该工具可以转换为使用者跟容易读取的格式。具体请参加《tkprof命令格式化分析跟踪文件》</span></span>
<span><span> <strong>启动跟踪的方式有: </strong></span></span><span><span> 1. <span>启动</span>当前会话的跟踪 </span></span><span><span> 2.启动其他会话的跟踪 </span></span><span><span> 3.使用登陆触发器启动跟踪</span></span>
下面分别详细介绍3种跟踪启动的方式。
1.3.1 启动当前会话的跟踪
1.3.1.1启动当前会话跟踪的两种方法
启动当前会话的跟踪的两种方法:
<span><span> <strong> 1.设置参数</strong><span><strong>SQL_TRACE 为true</strong>,语句如下: </span></span><span> <span> ALTER SESSION SET </span></span><span><span>SQL_TRACE </span><span>= TRUE;</span></span></span>
该语句创建基本的跟踪,跟踪信息包括SQL语句的执行统计信息与执行计划,但不会包含绑定变量的
值,也不包含等待各种事件花费的时间。如果要获取这些信息,请使用第2种启动方式。
<span> <strong> 2.<span>调用DBMS_SESSION方法</span></strong><span>,语法如下:</span> </span><span><span><span> <span>DBMS_SESSION.session_trace_enable ( </span></span></span><span><span><span> waits IN BOOLEAN DEFAULT TRUE, </span></span></span><span><span><span> binds IN BOOLEAN DEFAULT FALSE</span></span></span><span><span></span></span><span><span><span> );</span></span></span></span>
下面介绍下函数参数的含义:
参数 | 说明 |
waits | 如果为TRUE,将收集等待信息;如果为FALSE,则不收集。 |
binds | 如果为TRUE,将收集绑定变量信息;如果为FALSE,则不收集。 |
<span></span>
调用例子,在Command Window中输入如下命令:
<span></span>
begin dbms_session.session_trace_enable(true, true); end; /
<span></span>
执行完后,执行如下语句查询是否执行成功:
<span></span>
SQL> SELECT t.sql_trace, t.sql_trace_waits, t.sql_trace_binds FROM v$session t WHERE t.sid = USERENV('SID'); SQL_TRACE SQL_TRACE_WAITS SQL_TRACE_BINDS --------- --------------- --------------- ENABLED TRUE TRUE
SQL ID: 518m7y4zt6xkp<span><span><span> Plan Hash: 1947974170 select * from t_student where gid = 1 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.00 0.01 2 2 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 3 0.01 0.02 2 2 0 1 Misses in library cache during parse: 1 Optimizer mode: ALL_ROWS Parsing user id: 79 Rows Row Source Operation ------- --------------------------------------------------- 1 TABLE ACCESS BY INDEX ROWID T_STUDENT (cr=2 pr=2 pw=0 time=0 us cost=1 size=19 card=1) 1 INDEX UNIQUE SCAN SYS_C0010947 (cr=1 pr=1 pw=0 time=0 us cost=0 size=0 card=1)(object id 73110) Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ SQL*Net message to client 2 0.00 0.00 SQL*Net message from client 2 0.04 0.04 Disk file operations I/O 1 0.00 0.00 db file sequential read 2 0.01 0.01</span></span></span>
1.3.1.2 定位跟踪文件
启动会话跟踪之后,如何才能找到当前会话的跟踪文件呢?有两种方法
1.3.1.2.1 通过查询语句
下面语句用来查询当前会话跟踪文件:
select p.TRACEFILE from v$session s, v$process p
where s.PADDR = p.ADDR
and s.SID = USERENV('SID');
说明:USERENV('SID')得到的是当前会话的SID。
如下:
<span></span>
SQL> select p.TRACEFILE from v$session s, v$process p 2 where s.PADDR = p.ADDR 3 and s.SID = USERENV('SID'); TRACEFILE -------------------------------------------------------------------------------- d:\oracle\diag\rdbms\david\orcl\trace\orcl_ora_7220.trc
<span></span>
1.3.1.2.2 标识跟踪文件
为会话指定一个跟踪文件的标识符,通过设置tracefile_identifier参数实现:
ALTER SESSION SET tracefile_identifier = 标识符
如果我们设定tracefile_identifier为LGL,即执行:
SQL> alter session set tracefile_identifier=LGL;
跟踪文件的目录保存在user_dump_dest参数:
SQL> show parameter user_dump_dest; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ user_dump_dest string d:\oracle\diag\rdbms\david\orcl\trace
1.3.2 启动其他会话的跟踪
通过DBMS_MONITOR包中的session_trace_enable()方法启动别的会话的跟踪,语法如下:
<span><span><span><span> <span>DBMS_MONITOR.<span>session_trace_enable( </span></span></span></span></span><span><span><span><span><span> session_id IN BINARY DEFAULT NULL, </span></span></span></span></span><span><span><span><span><span> serial_num IN BINARY DEFAULT NULL, </span></span></span></span></span><span><span><span><span><span> waits IN BOOLEAN DEFAULT TRUE, </span></span></span></span></span><span><span><span><span><span> binds <span> IN BOOLEAN DEFAULT FALSE </span></span></span></span></span></span><span><span><span><span><span> )</span></span></span></span></span></span>
下面介绍下函数参数的含义:
<span></span>
参数 |
说明 |
session_id | 对应V$SESSION视图中的列SID的值。 |
serial_num | 对应V$SESSION视图中的列SERIAL#的值。 |
waits |
如果为TRUE,将收集等待信息;如果为FALSE,则不收集。 |
binds |
如果为TRUE,将收集绑定变量信息;如果为FALSE,则不收集。 |
<span></span>
SQL> SELECT t.sid, t.serial#, t.sql_trace FROM v$session t WHERE LOWER(t.service_name) LIKE '%david%'; SID SERIAL# SQL_TRACE ---------- ---------- --------- 7 249 DISABLED 8 41 ENABLED 71 125 ENABLED
<span><span> 通过上面查询结果可知SID为7的会话的没有启动会话跟踪,使用<span>session_trace_enable()方法启动SID为7的 </span></span></span><span><span><span>会话的跟踪,打开Command Window窗口,执行如下语句:</span></span></span>
<span></span>
begin dbms_monitor.session_trace_enable(session_id =>7, serial_num =>249, waits =>true, binds =>true); end; /
再次查询SID为7的会话跟踪情况,语句如下:
<span></span>
SQL> SELECT t.sid, t.serial#, t.sql_trace FROM v$session t WHERE t.sid = 7; SID SERIAL# SQL_TRACE ---------- ---------- --------- 7 249 ENABLED
从查询结果可以看出,SID为7的会话已经启动了跟踪。
1.3.3 使用登陆触发器启动跟踪
建立一个触发器(执行到sys用户中),用户登录数据库之后就启动会话的跟踪,触发器创建脚本如下:<span></span>
CREATE OR REPLACE TRIGGER trace_login_trigger AFTER LOGON ON DATABASE BEGIN --设置用户ADMIN的会话跟踪 IF USER = 'ADMIN' THEN --设置跟踪文件标识 EXECUTE IMMEDIATE 'alter session set tracefile_identifier=ADMINCC'; --启动会话跟踪 DBMS_SESSION.session_trace_enable( waits =>TRUE, binds =>FALSE ); END IF; END; /

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Ouyi OKX ist die weltweit führende digitale Vermögenshandelsplattform. 1) Seine Entwicklungsgeschichte umfasst: Sie wird 2017 ins Leben gerufen. Der chinesische Name "Ouyi" wird 2021 eingeführt und wird 2022 in Ouyi in OKX umbenannt. 3) Zu den speziellen Funktionen der Plattform gehören: Marktdatendienste und Risikokontrollsystem. 4) Zu den Hauptvorteilen gehören: technische Stärke, Sicherheitssystem, Serviceunterstützung und Marktabdeckung.

Die App -Software, die Mainstream -Münzen kaufen kann, umfasst: 1. Binance, das weltweit führende Transaktionsvolumen und schnelle Geschwindigkeit; 2. OKX, innovative Produkte, niedrige Gebühren, hohe Sicherheit; 3.. Gate.io, eine Vielzahl von Vermögenswerten und Handelsoptionen, die sich auf die Sicherheit konzentrieren; 4. Huobi (HTX), niedrige Gebühren, gute Benutzererfahrung; 5. Coinbase, geeignet für Anfänger, hohe Sicherheit; 6. Kraken, sicher und konform, eine Vielzahl von Dienstleistungen; 7. Kucoin, niedrige Gebühren, geeignet für professionelle Händler; 8. Gemini betont die Compliance und bietet Depotdienste an; 9. Crypto.com, die eine Vielzahl von Angeboten und Dienstleistungen bietet; 10. Bitstamp, ein alter Austausch, starke Liquidität,

Die drei besten zehn Top -Marktansichtssoftware im Währungskreis sind OKX, Binance und Gate.io. 1. OKX bietet eine einfache Schnittstelle und Echtzeitdaten, die eine Vielzahl von Diagrammen und Marktanalysen unterstützt. 2. Binance hat leistungsstarke Funktionen, genaue Daten und eignet sich für alle Arten von Händlern. 3.. Gate.io ist bekannt für seine Stabilität und Vollständigkeit und für langfristige und kurzfristige Anleger geeignet.

Empfohlene Apps für die zehn besten Plattformen für virtuelle Währung: 1. OKX, 2. Binance, 3. Gate.io, 4. Huobi, 5. Coinbase, 6. Kraken, 7. Bitfinex, 8. Kucoin, 9. Bybit, 10. Bitstamp, diese Plattformen liefern Echtzeit-Markttrends, technische Analyse-Tools und Benutzern und Benutzern, und es mithilfe von Hilfsmittel und Hilfsmittel und Hilfsmittel, die Hilfsmittel für Hilfsmittel und Hilfsmittel für Hilfsmittel und Hilfsmittel für Hilfsmittel und Hilfsmittel zuhilfe liefern.

Die zuverlässigen und benutzerfreundlichen Virtual Currency Exchange-Apps sind: 1. Binance, 2. OKX, 3. Gate.io, 4. Coinbase, 5. Kraken, 6. Huobi Global, 7. Bitfinex, 8. Kucoin, 9. Bittrex, 10. Poloniex. Diese Plattformen wurden als das Beste für ihre Transaktionsvolumen, die Benutzererfahrung und -sicherheit ausgewählt, und alle bieten Registrierung, Überprüfung, Einzahlung, Auszahlung und Transaktionsvorgänge an.

Oracle ist nicht nur ein Datenbankunternehmen, sondern auch ein führender Anbieter von Cloud -Computing- und ERP -Systemen. 1. Oracle bietet umfassende Lösungen von der Datenbank bis zu Cloud -Diensten und ERP -Systemen. 2. Oraclecloud fordert AWS und Azure heraus und liefert IaaS-, PaaS- und SaaS -Dienste. 3. ERP-Systeme von Oracle wie E-Businesssuite und Fusion Applications helfen Unternehmen dabei, den Betrieb zu optimieren.

Bei der Auswahl einer für Anfänger geeigneten Handelsplattform für digitale Währung müssen Sie Sicherheit, Benutzerfreundlichkeit, Bildungsressourcen und Kostentransparenz berücksichtigen: 1. Priorität wird Plattformen erteilt, die Kühlspeicher, Zwei-Faktor-Überprüfung und Versicherungsversicherung bieten. 2. Apps mit einfacher Schnittstelle und klarer Betrieb sind für Anfänger besser geeignet. 3. Die Plattform sollte Lernwerkzeuge wie Tutorials und Marktanalysen bereitstellen. 4. Achten Sie auf versteckte Kosten wie Transaktionsgebühren und Barauszahlungsgebühren.

Zu den am besten geeigneten Plattformen für Handelsmeme -Münzen gehören: 1. Binance, die weltweit größte, mit hoher Liquidität und niedrigem Handhabungsgebühren; 2. OKX, eine effiziente Handelsmotor, die eine Vielzahl von Meme -Münzen unterstützt; 3. Xbit, dezentralisiert und unterstützt den Handel mit dem Cross-Chain; 4. REDIM (Solana Dex), niedrige Kosten, kombiniert mit Serumbestellbuch; 5. Pancakeswap (BSC Dex), niedrige Transaktionsgebühren und schnelle Geschwindigkeit; 6. Orca (Solana Dex), Benutzererfahrungsoptimierung; 7. Coinbase, hohe Sicherheit, geeignet für Anfänger; 8. Huobi, bekannt in Asien, reiche Handelspaare; 9. Dexrabbit, intelligent
