SQL 语句处理阶段
透彻理解 SQL 处理有助于理解 SQL 统计信息。在 SQL 语句处理过程中,有四个重要阶段:分析、绑定、执行和提取。
反向箭头表示处理方案(例如,提取-(再)绑定-执行-提取)。
提取阶段仅适用于带有 returning 子句的查询和 DML 语句。
注:有关 SQL 语句处理的详细说明,请参阅《Oracle Database 11g Application Developers Guide: Fundamentals》和《Oracle Database 11g: Concepts》。
分析阶段
分析是 SQL 语句处理的一个阶段。当应用程序执行 SQL 语句时,其将对 Oracle DB 进行一次分析调用。在分析调用期间,Oracle DB 将:
检查语句的语法和语义有效性
确定执行该语句的进程是否具有运行的权限
在共享池中搜索该语句的可共享匹配
为该语句分配专用 SQL 区域
存在两类分析操作:
软分析:提交一条 SQL 语句,并在共享池找到一个匹配。该匹配可以是另一用户之前执行的结果。会共享该 SQL 语句,这对性能有利。但是,软分析仍需要语法和安全检查,这将占用系统资源。
硬分析:第一次提交一条 SQL 语句,而在共享池中未找到可共享的匹配。硬分析最耗费资源,且不可伸缩,因为硬分析会执行分析中所涉及的所有操作。
如果正确使用绑定变量,则可能存在更多的软分析,从而减少硬分析,并将分析后的语句在库高速缓存中保存更长时间。
SQL 存储
Oracle 服务器使用库高速缓存和 SQLAREA 来存储 SQL 语句和 PL/SQL 块。如果将语句存储在高速缓存中,Oracle 服务器将:
将语句减少到 ASCII 文本的数值
使用此数字的散列函数
将此语句的游标置于散列链上
散列值不是唯一值,多条语句可以散列到相同的值。这些语句的游标上下文都存储在同一散列链中。搜索散列链以获得正确的语句。任何时候提交语句,都会搜索高速缓存。如果没有找到游标句柄,则会从该语句构建游标。后续提交语句时,会找到该游标句柄并重复使用此游标。
若已分析并执行该语句,且该游标句柄仍位于客户机高速缓存中,则可调用并执行该游标,而无需在共享池中搜索该语句。不管何时作出分析请求,分析计数统计信息都会递增,但是在会话高速缓存中寻找语句的开销明显降低。
注:理想情况下,在 SQL 语句第一次提交时进行一次硬分析,而后对每个使用该语句的其它会话进行一次软分析。这取决于会话高速缓存和共享池中是否存在足够的内存来保留游标信息。
游标的使用和分析
每个开发人员都希望其代码能够以尽可能快的速度运行。对于使用 SQL 语句的代码,这意味着游标访问的速度必须很快。访问游标可能的最快方法是通过服务器会话的会话内存中打开的游标高速缓存进行访问。在打开的游标高速缓存中每个打开的游标都有一个指向该游标句柄 SGA 内存位置的指针。要执行该游标,需要使用指针,而不需要分析。一个打开的游标是已经过分析的游标,并且游标句柄位于库高速缓存中。
如果已将 SESSION_CACHED_CURSORS 参数设置为某个值,则在关闭游标后,会将游标信息移至会话已关闭的游标高速缓存中。(版本 10.2.0.2 之前,默认值为 0,在该版本中已更改为 50。)
打开游标时,会话会散列 SQL 语句,并在关闭的游标高速缓存中执行散列查找。如果找到该游标,则会将其移至打开的游标高速缓存中,然后使用指向共享池中该游标句柄的指针来执行该游标,无需进行任何分析。
如果未在会话中找到游标,则会使用散列值在共享池中搜索该游标句柄的散列链。搜索将注册为分析。如果找到游标句柄,并且剩余的游标尚未到期释放,则执行此游标。这属于软分析。
游标的使用和分析(续)
如果游标已在共享池中到期释放,或者游标不存在于共享池中,则会构建该游标。这属于硬分析。构建游标需要查找独立对象(如表、索引、区和序列)的元数据。如果尚未将这些对象的元数据高速缓存在共享池中,则会生成递归 SQL 以提取数据字典中的信息。
在大量游标提交到共享池且共享池内存分配不足的某些情况下,游标可能很快便在高速缓存中到期释放,即时此时位于两次提取之间。这种情况将导致出现大量硬分析。
注:有关优化共享池,以便优化游标处理的详细信息,请参阅“优化共享池”课程。
绑定阶段
绑定阶段期间:
Oracle DB 检查该语句对绑定变量的引用。
Oracle DB 会为每个变量分配或重新分配一个值。
当在某一语句中使用绑定变量时,优化程序将假设需要使用游标共享,且不同的调用应使用相同的执行计划。这有助于通过减少大量运行硬分析来改善性能。
如果存在直方图,则优化程序将假定数据分配与该优化程序的默认假设不匹配。因此,如果使用不同的执行计划,在使用不同绑定变量多次调用游标时将获得显著的优势。此情况下,自适应游标共享将创建新计划。如果不尝试新计划,则性能可能会因为某些绑定变量值而降低。
游标共享受 Oracle Database 11g 的数据库初始化参数和自适应游标共享功能影响。有关详细信息,请参阅“优化共享池”课程。
执行阶段
执行计划是一系列步骤,服务器进程使用这些步骤访问并确定数据缓冲区中的所需数据行。多个用户可共享相同执行计划。Oracle DB 针对 DML 语句执行物理读取或逻辑读取/写入,同时视需要进行数据排序。
注:物理读取为磁盘读取;逻辑读取涉及的是数据库缓冲区高速缓存内存中已存在的块。物理读取需要磁盘 I/O,因此会占用更多资源和时间。
提取阶段
提取阶段,Oracle DB 针对 SELECT 语句进行行检索。每个提取操作通常使用数组提取对多行进行检索。数组检索可通过减少网络往返次数来提高性能。每个 Oracle 工具都有自己的方式来调整数组大小;例如,在 SQL*Plus 中,可通过使用 ARRAYSIZE 设置来更改提取大小:
SQL> show arraysize arraysize 15 SQL> set arraysize 50
SQL*Plus 每次默认处理 15 行。过大的数组几乎不具优势,或根本不具优势。
DML 处理步骤
数据操纵语言 (DML) 语句仅需要两个处理阶段:
分析阶段与处理查询使用的分析阶段相同。
执行阶段需要执行其它处理才能进行数据更改。
DML 执行阶段
执行 DML 语句:
1. 如果缓冲区高速缓存中没有数据块和回退块,则服务器进程会将其从数据文件读取到缓冲区高速缓存。服务器进程将锁定要修改的行。
2. 服务器进程将记录对数据缓冲区所作的更改以及还原更改。这些更改将在修改内存中的数据和回退缓冲区之前写入到重做日志缓冲区中。这称作“先行写事件记录”。
3. 回退缓冲区包含修改操作前数据的值。回退缓冲区用于存储之前的数据映像,因此可视需要回退 DML 语句。数据缓冲区将记录数据的新值。
4. 用户将获得该 DML 操作的反馈(如该操作影响的行数)。
DML 处理步骤(续)
DML 执行阶段(续)
由于 DML 而更改的所有内存中数据块和回退块(缓冲区高速缓存中)将标记为灰缓冲区,即不同于磁盘上的对应块。数据库写入进程 (DBWR) 不会将这些缓冲区立即写入到磁盘。当提交事务处理时,日志写入进程将立即在重做日志文件中记录对这些块进行的更改的重做更改记录,且灰块最终由 DBWR 写入磁盘,这将由增量检查点算法确定。注:在 DBWR 将灰块写入磁盘之前,必须将灰块的重做更改记录写入重做日志文件。
UPDATE、DELETE 或 INSERT 命令均使用类似的步骤。DELETE 命令执行之前的映像包含要删除行的列值,而 INSERT 命令执行之前的映像仅包含行位置信息。
提交事务处理之前,对块进行的更改仅记录在内存结构中,而不会立即写入到磁盘中。实例进程遵循一种惰性写入算法,以提高整体性能。提交事务处理之后,写入操作将是永久性的。在 LWGR 进程将重做信息记录到磁盘之前,不会发布“已提交”消息,以确保完整的可恢复性。DBWR 根据检查点算法将数据块写入到磁盘。提交事务处理前,如果计算机出现故障导致 SGA 丢失,则将同时丢失这些更改。遵循的规则是:提交事务处理之前,该事务处理并非永久性的。
有关处理数据库缓冲区高速缓存的详细信息,请参阅“优化缓冲区高速缓存”课程。
快速提交
Oracle 采用一种快速提交机制,来保证出现实例故障时能够恢复已提交的更改。
系统更改号
每当提交事务处理时,Oracle DB 将为该事务处理分配一个唯一的系统更改号 (SCN)。Oracle DB 将 SCN 用作内部时间戳来让数据保持同步,这样从数据文件中检索数据时可提供读一致性。通过 SCN 实例可执行一致性检查,而无需依赖操作系统的日期和时间。
发出 COMMIT 时,将执行以下步骤:
服务器进程将提交记录连同 SCN 一起保存在重做日志缓冲区中。
后台日志写入进程 (LGWR) 对直到提交记录为止(包括提交记录)的所有重做日志缓冲区条目执行一次相邻写入,并写入到重做日志文件中。这将保证即使出现实例故障,也不会丢失更改。
服务器进程向用户进程发送一条消息,说明事务处理完成。
最后 DBWR 基于其自身内部计时机制和增量检查点设置,将实际数据块更改写回磁盘。
Oracle 优化程序的作用
优化程序是 Oracle DB 的一部分,用于为 SQL 语句创建执行计划。确定执行计划是处理任何 SQL 语句的重要一步,会对执行时间产生重大影响。
执行计划是执行语句时按顺序执行的一系列操作。“影响优化程序”课程讲述了各步骤的详细信息。优化程序会考虑与被引用对象相关的以及与查询中所指定的条件相关的许多因素。优化程序所需的信息包括:
为系统(I/O、CPU 等)以及方案对象(行数、索引等)搜集的统计信息
字典中的信息
WHERE 子句限定词
开发人员提供的提示
使用诸如 Enterprise Manager、EXPLAIN PLAN 和 SQL*Plus AUTOTRACE 等诊断工具时,可以看到优化程序选择的执行计划。
注:根据其功能的不同,Oracle Database 11g 优化程序具有两个名称:查询优化程序或运行时优化程序和自动优化程序。
Oracle 优化程序的作用(续)
优化程序操作:对于由 Oracle Server 处理的任何 SQL 语句,优化程序将执行以下操作:
评估表达式和条件:优化程序首先尽可能全面评估含有常数的表达式和条件。
语句转换:对于涉及的复杂语句,例如,关联的子查询或视图,优化程序可能将原始语句转换为等效的联接语句。
选择优化程序方法:优化程序确定优化目标。
选择访问路径:对于语句访问的每个表,优化程序选择一或多个可用的访问路径以获得表数据。如果没有可用的统计信息(如使用位图索引),优化程序将跳过某些访问路径。
选择联接顺序:对于联接两个以上表的联接语句,该优化程序首先选择联接哪两个表,然后选择哪个表将联接到结果,等等。
选择联接方法:对于任何联接语句,优化程序选择用于联接的操作。
注:对于不同的 Oracle DB 版本,优化程序可能不会作出相同的决定。在最近的版本中,因为有更多信息可用,优化程序可能作出不同的决定。
优化程序有两种工作模式,第一种为运行时优化程序,是常用模式,该模式在运行时创建执行计划。在此模式中,该优化程序的时间有限,其仅可考虑有限个数的备选方案。第二种模式称为自动优化程序 (ATO)。在此模式中,优化程序有更多时间考虑更多选项和收集统计信息。ATO 可生成更好的计划,并创建 SQL 概要文件,未来每当提交 SQL 语句时,该概要文件将帮助优化程序选择更好的计划。
确定不良 SQL
SQL 的优势之一是,可以编写不同的 SQL 语句来产生相同的结果。任何能够产生正确结果的 SQL 语句便是正确的 SQL 语句。但是,不同的 SQL 可能需要不同数量的资源。不良 SQL 可能是正确的,但是效率不高,需要更多资源。
不良 SQL 的症状可能是幻灯片上所列特征的任何一项。下一张幻灯片中所示的顶级 SQL 报表提供了一种查找消耗最多系统资源的 SQL 语句的方法。
导致不良 SQL 原因可能是不当的设计、不良的编码,或是优化程序选择了低效的执行计划。DBA 很少有机会控制设计或代码,但是可以影响优化程序来生成更好的执行计划。
从理论上讲,给定关系数据集上任何给定的结果集都存在一个最优执行计划。优化程序试图在给定的时间和资源的限制条件下找到该最优执行计划。找到该最优计划可能需要很长时间。例如,您可能不愿等待优化程序花 5 分钟时间生成一个能将运行时减少 5 秒钟的计划。优化程序评估试用执行计划的顺序受包括 SQL 编写方式在内的多种因素的影响。
顶级 SQL 报表
在优化方面,最大的投资收益在于 SQL 优化。顶级 SQL 报表在确定占用系统资源最多的语句方面非常有效。研究表明,通常 20% 的 SQL 语句占用了 80% 的资源,而 10% 的语句占用了 50% 的资源。这意味着,通过确定并优化顶级 SQL 语句,可改善整个系统的性能。
使用顶级 SQL 报表简化了查找占用资源最多的 SQL 语句的过程。AWR 和 Statspack 报表都包括一组顶级 SQL 列表。每个报表以若干类别按照资源使用情况排序列出了顶级 SQL 语句。这些类别包括:用时、CPU 时间、获取数、读取数、执行数、分析调用、可共享内存和版本计数。各个报表不包括完整的 SQL 文本,但各个报表之后按照 SQL_ID 给出了所有 SQL 文本的报表。
默认情况下,这些报表中不包括全部 SQL 语句。所包括语句的数目由 AWR 的 topnsql 参数设置和 Statspack 中的级别和阈值设置控制。有关 Statspack 参数的详细信息,请参阅附录“使用 Statspack”。
什么是执行计划?
执行某一语句时,服务器将执行由该优化程序创建的计划步骤。每一步骤要么从数据库物理检索数据行,要么以某种方式为发出该语句的用户准备数据行。用于运行语句的步骤的组合称作“执行计划”。
执行计划包括语句所访问的每个表的访问方法以及这些表的顺序(联接顺序)。优化程序还使用不同的方法来组合多个表的行(联接方法)。执行计划的步骤并不按编号顺序执行。
通过执行计划,可查看优化程序所选的方法。有时执行计划会明确说明某一语句效率不高的原因;例如,当某一索引查询选择全表扫描 (FTS) 时,这种扫描涉及很多 I/O 操作。这种情况下,问题就变为优化程序为什么选择 FTS。“影响优化程序”课程详细说明了此类问题。
查看执行计划的方法
通过 EXPLAIN PLAN 命令,可查看优化程序用来执行 SQL 语句的执行计划,而无需执行该 SQL 语句。
SQL 跟踪实用程序用于度量 SQL 语句的计时统计信息。
自动工作量资料档案库 (AWR) 是 Oracle Database 11g 中的一个内置资料档案库。Oracle DB 定期捕获其所有重要统计信息和工作量信息的快照,并将快照保存在 AWR 中,包括占用资源较多的 SQL 语句的列表。AWR 数据包括执行计划。
V$SQL_PLAN 视图包含有关所执行 SQL 语句及其执行计划(仍位于共享池中)的信息。
SQL*Plus 中可用的 AUTOTRACE 命令生成 PLAN_TABLE 输出和有关查询的性能的统计信息。此命令提供了许多与 SQL 跟踪相同的统计信息,诸如磁盘读取和内存读取。
您可使用 DBMS_XPLAN 程序包方法来显示由 EXPLAIN PLAN 命令和 V$SQL_PLAN 查询以及 AWR 生成的执行计划。
使用执行计划
查看执行计划用于:
确定当前的执行计划
确定在一个表上创建索引的效果
查找包含某一特定访问路径的游标(例如,全表扫描或索引范围扫描)
确定优化程序所选或所未选的索引
确定优化程序是否选择开发人员所期望的特定执行计划(例如,嵌套循环联接)
您可使用执行计划来作出以下决定:
删除或创建索引
生成数据库对象的统计信息
修改初始化参数值
将应用程序或数据库迁移到一个新的版本
默认情况下,SQL 在共享池中到期释放后,将不保留执行计划。如果之前所用的计划保留在用户定义的表中,或作为基线计划加载,则确定 SQL 语句性能的更改如何与该语句的执行计划的更改相关联是可能的。
DBMS_XPLAN 程序包:概览
DBMS_XPLAN 程序包提供了一种简单方法来以若干预定义格式显示 EXPLAIN PLAN 命令的输出。还可使用 DBMS_XPLAN 程序包来显示存储在 AWR 中的语句的计划。此外,它还提供了一种方法,用以基于 V$SQL_PLAN 固定视图和 V$SQL_PLAN_STATISTICS_ALL 固定视图中存储的信息来显示高速缓存的 SQL 游标的 SQL 执行计划和 SQL 执行运行时统计信息。
DBMS_XPLAN 程序包提供了可用于检索和显示执行计划的三种表函数:
DISPLAY 格式化并显示 PLAN_TABLE 的计划表的内容。
DISPLAY_AWR 格式化并显示存储在 AWR 中的 SQL 语句的执行计划的内容。
DISPLAY_CURSOR 格式化并显示任何从 V$SQL_PLAN 视图载入的游标的执行计划的内容。
DBMS_XPLAN 程序包:概览(续)
此程序包的方法包含一个 FORMAT 参数,通过此参数,可指定所显示计划的详细级别。
BASIC:显示最少的计划信息(操作 ID、对象名称和操作选项)
TYPICAL:默认。显示计划中相关性最高的信息。可用时,仅显示分区修剪、并行和谓词。
ALL:最大级别。包括 TYPICAL 级别所显示的信息,并添加投影信息以及针对并行执行服务器而生成的 SQL 语句(仅当并行时)。
SERIAL:与 TYPICAL 类似,但不显示并行信息,即使并行执行计划,也同样如此。
此程序包以调用用户的权限运行,而不以程序包所有者的权限 (SYS) 运行。DISPLAY_CURSOR 表函数需要以下固定视图上的 SELECT 权限:V$SQL_PLAN、V$SESSION 和 V$SQL_PLAN_STATISTICS_ALL。使用 DISPLAY_AWR 函数需要 DBA_HIST_SQL_PLAN、DBA_HIST_SQLTEXT 和 V$DATABASE 上的 SELECT 权限。所有这些权限均作为 SELECT_CATALOG_ROLE 的一部分而自动授予。但是,建议您不要不加区分地授予此角色,因为这可能导致安全问题。
DISPLAY_CURSOR 和 DISPLAY_AWR 函数接受 SQL_ID 作为一个参数(如本课程后续示例所示)。可通过查询 V$SQL 或 DBA_HIST_SQLTEXT 来获得语句的 SQL_ID。
EXPLAIN PLAN 命令
EXPLAIN PLAN 命令用于生成优化程序用以执行 SQL 语句的执行计划。其不执行语句,但简单生成可能使用的计划,并将此计划插入到表中。如果查看计划,可看到 Oracle 服务器执行相应语句的方式。
要使用 EXPLAIN PLAN,必须:
首先使用 EXPLAIN PLAN 命令解释 SQL 语句
使用 DBMS_XPLAN 程序包中的方法检索计划步骤
PLAN_TABLE 是作为全局临时表而自动创建的,用于为所有用户保存 EXPLAIN PLAN 语句的输出。PLAN_TABLE 是默认的示例输出表,EXPLAIN PLAN 语句将在其中插入说明执行计划的行。
注:EXPLAIN PLAN 可能生成一个不同于优化程序实际所使用计划的计划,其原因如下:
EXPLAIN PLAN 命令无法访问绑定变量。
鉴于登录触发器或会话参数设置,SQL*Plus 会话可能具有不同的环境。
V$SQLPLAN 将使用该实际计划。
EXPLAIN PLAN 命令:示例
此命令将 SQL 语句的执行计划插入到计划表中,并添加名称标记 demo01,以便后续参考。标记是可选的。也可以使用以下语法:
EXPLAIN PLAN
FOR
SELECT e.last_name, d.department_name FROM hr.employees e, hr.departments d
WHERE e.department_id =d.department_id;
EXPLAIN PLAN 命令:输出
DBMS_XPLAN 程序包的 DISPLAY 函数可用于格式化并显示计划表中存储的最后一条语句。
幻灯片显示了按照上一张幻灯片上所示使用 DBMS_XPLAN 程序包检索该示例的 PLAN 表中的信息。
还可使用以下所示语法来检索 PLAN 表。
SELECT plan_table_output FROM TABLE(dbms_xplan.display('plan_table','demo01','serial'));
输出的内容与幻灯片中显示的内容相同。在此示例中,可使用另一计划表名称替换 PLAN_TABLE,'demo01' 代表语句 ID。
您可运行 utlxpls.sql 脚本(位于 ORACLE_HOME/rdbms/admin/ 目录下)以显示所解释的最后一条语句的 EXPLAIN PLAN。该脚本使用 DBMS_XPLAN 程序包的 DISPLAY 表函数。
读取执行计划
可从执行计划构造一棵执行树(或“分析树”),以更清晰了解如何处理语句。要构造该树,请从步骤 1 开始。然后查找步骤 1 的所有子步骤,并在步骤 1 下方将其绘制成子级步骤或分支。对于每个步骤,重复此过程查找该步骤的所有子步骤,直到所有步骤都绘出。Oracle DB 为执行计划中的每个步骤分配一个编号,表示 PLAN_TABLE 的 ID 列。每个步骤由一个“节点”表示。每个节点的操作结果会传递到其父节点,父节点将此结果用作输入。
步骤的顺序由这些步骤的父-子关系来确定。执行计划的每个步骤从数据库检索行,或者将一或多个其它步骤(也称作“行源”)的行接受为输入。子步骤将至少被执行一次,且结果会馈送至父步骤。当一个父步骤具有多个子步骤时,将按照步骤的位置次序执行各子步骤。如果下层子步骤是按照从左向右排列的,则可从左向右、从下到上读取计划。
图中,编号对应于 PLAN 表中的 ID 值(参看前一张幻灯片)。优化程序通过在主键列执行 FULL INDEX SCAN 而使用索引扫描,从 DEPARTMENTS 表检索行。然后在 EMPLOYEES 表上执行一次 FULL TABLE SCAN 和 SORT 操作。然后对两个结果集执行 MERGED 以获得查询的最终结果。
使用 V$SQL_PLAN
该视图提供了一种方法,用于检查最近执行过的游标的执行计划。此视图中的信息非常类似于 PLAN_TABLE 的输出。但是,EXPLAIN PLAN 显示的是执行相应语句时可以使用的理论计划,而 V$SQL_PLAN 包含实际使用的计划。鉴于绑定变量取数、cursor_sharing 参数设置等原因,EXPLAIN PLAN 语句获得的执行计划可能不同于所用的实际执行计划。
V$SQL_PLAN 显示了特定游标的计划。每条 SQL 语句可能具有多个相关的游标,各游标以 CHILD_NUMBER 标识。例如,如果所引用的对象位于不同方案中,则不同用户执行的同一语句具有不同的相关游标。提示不同或绑定变量值不同可能引起游标不同。V$SQL_PLAN 可用于查看同一语句的不同子游标的不同计划。
注:另一有用视图为 V$SQL_PLAN_STATISTICS,此视图为每个缓存的游标的执行计划中的每个操作提供执行统计信息。同时,V$SQL_PLAN_STATISTICS_ALL 视图组合了 V$SQL_PLAN 中的信息和 V$SQL_PLAN_STATISTICS 以及 V$SQL_WORKAREA 中的执行统计信息。
V$SQL_PLAN 列
V$SQL_PLAN 视图的几乎所有列都显示在 PLAN_TABLE 列中。两个视图中,同名的列意义相同。
ADDRESS 和 HASH_VALUE 列可用于联接 V$SQLAREA,以添加特定于游标的信息。
ADDRESS、HASH_VALUE 和 CHILD_NUMBER 列可用于联接 V$SQL,以添加特定于子游标的信息。
查询 V$SQL_PLAN
可使用 DBMS_XPLAN.DISPLAY_CURSOR() 函数来查询 V$SQL_PLAN,以显示当前或上一次执行的语句(如示例所示)。对于给定语句,可将该语句的 SQL_ID 值作为参数传递,以获得执行计划。要获得 SQL_ID:
SELECT e.last_name, d.department_name
FROM hr.employees e, hr.departments d WHERE e.department_id =d.department_id;
SELECT SQL_ID, SQL_TEXT FROM V$SQL
WHERE SQL_TEXT LIKE '%SELECT e.last_name,%' ;
13saxr0mmz1s3 select SQL_id, sql_text from v$SQL …
cfz0cdukrfdnu SELECT e.last_name, d.department_name …
FORMAT 参数控制计划的详细级别。除了标准值(BASIC、TYPICAL、SERIAL 和 ALL)外,还有两个受支持的值,用于显示游标的运行时统计信息。
RUNSTATS_LAST:显示上一次执行该游标的运行时统计信息
RUNSTATS_TOT:显示自第一次分析和执行某一特定 SQL 语句之后,该语句所有执行的全部运行时统计信息
V$SQL_PLAN_STATISTICS 视图
V$SQL_PLAN_STATISTICS 视图提供了计划中每个操作的实际执行统计信息,如输出行数和所用时间。除输出行数外,所有统计信息都是累计的结果。例如,联接操作的统计信息还包括其两个输入的统计信息。V$SQL_PLAN_STATISTICS 中的统计信息对已编译(在 STATISTICS_LEVEL 初始化参数设置为 ALL 的情况下进行编译)的游标是可用的。
V$SQL_PLAN_STATISTICS_ALL 视图包含了使用 SQL 内存的行源的内存使用情况统计信息(排序或散列联接)。此视图连接 V$SQL_PLAN 中的信息与 V$SQL_PLAN_STATISTICS 和 V$SQL_WORKAREA 的执行统计信息。
查询 AWR
可使用 DBMS_XPLAN.DISPLAY_AWR() 函数来显示 AWR 中存储的所有计划。本示例将 SQL_ID 作为参数传入。完成此示例的步骤如下:
1. 执行 SQL 语句。
SQL> select /* example */ *
2> from hr.employees natural join hr.departments;
2. 查询 V$SQL_TEXT 以获得 SQL_ID。
SQL> select sql_id, sql_text from v$SQL
2> where sql_text like '%example%';
SQL_ID SQL_TEXT
------------- -------------------------------------------
F8tc4anpz5cdb select sql_id, sql_text from v$SQL …
454rug2yva18w select /* example */ * from …
3. 使用 SQL_ID 确认 DBA_HIST_SQLTEXT 字典视图已捕获此语句。如果查询未返回行,则表示 AWR 中尚未加载该语句。
查询 AWR(续)
SQL> SELECT SQL_ID, SQL_TEXT FROM dba_hist_sqltext WHERE SQL_ID =' 454rug2yva18w';
no rows selected
您可手动获取 AWR 快照,而不是等待下一张快照(每小时采集一次)。如果 SQL 不在 topnsql 范围内,可能不会捕获 SQL。为此,可使用 MODIFY_SNAPSHOT_SETTING 过程修改 topnsql 范围来强制捕获所有 SQL 语句。然后在 DBA_HIST_SQLTEXT 中检查是否已捕获:
SQL> exec –
2> DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(-
3> topnsql => 'MAXIMUM');
PL/SQL procedure successfully completed.
SQL> exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
PL/SQL procedure successfully completed.
SQL> exec –
2> DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(-
3> topnsql => 'DEFAULT');
PL/SQL procedure successfully completed.
SQL> SELECT SQL_ID, SQL_TEXT FROM dba_hist_sqltext WHERE SQL_ID =' 454rug2yva18w';
SQL_ID SQL_TEXT
-------------- -------------------------------
454rug2yva18w select /* example */ * from …
4. 使用 DBMS_XPLAN.DISPLAY_AWR () 函数检索执行计划:
SQL>SELECT PLAN_TABLE_OUTPUT FROM TABLE (DBMS_XPLAN.DISPLAY_AWR('454rug2yva18w’));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------
SQL_ID 454rug2yva18w
--------------------
select /* example */ * from hr.employees natural join hr.departments
Plan hash value: 2052257371
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 7 (100)| |
| 1 | HASH JOIN | | 11 | 968 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| DEPARTMENTS | 11 | 220 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7276 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------
SQL*Plus AUTOTRACE
在 SQL*Plus 中,可通过使用 AUTOTRACE 设置来自动获得执行计划以及有关运行 SQL 命令的某些其它统计信息。与 EXPLAIN PLAN 命令不同,该语句会实际运行。但是,可通过指定 AUTOTRACE TRACEONLY EXPLAIN 来选择隐藏语句结果。
AUTOTRACE 是用于优化 SQL 语句的方便诊断工具。由于其完全属声明性质,使用起来较 EXPLAIN PLAN 容易。
命令选项
OFF 禁用 SQL 语句的自动跟踪
ON 启用 SQL 语句的自动跟踪
TRACEONLY 启用 SQL 语句的自动跟踪,并隐藏语句输出
EXPLAIN 显示执行计划,但不显示统计信息
STATISTICS 显示统计信息,但不显示执行计划
注:如果忽略 EXPLAIN 和 STATISTICS 命令选项,将默认显示执行计划和统计信息。
使用 SQL*Plus AUTOTRACE
先决条件
要访问 STATISTICS 数据,必须具有访问若干动态性能表的权限。DBA 可通过使用在 plustrce.sql 脚本中创建的 PLUSTRACE 角色来授予权限。DBA 必须以 SYS 用户的身份运行该脚本,具有 DBA 角色的任何人都可对要使用 AUTOTRACE 的选项 STATISTICS 的用户授予 PLUSTRACE 角色。
示例
幻灯片显示了 AUTOTRACE 命令的示例。
控制 AUTOTRACE 执行计划布局
执行计划由按以下顺序显示的四列组成:
ID_PLUS_EXP 各步骤的行号
PARENT_ID_PLUS_EXP 父步骤行号
PLAN_PLUS_EXP 报表步骤
OBJECT_NODE_PLUS_EXP 所用的数据库链接或并行查询服务器
您可更改这些列的格式,或通过使用 SQL*Plus COLUMN 命令隐藏这些列。有关更多信息,请参阅《Oracle SQL*Plus User’s Guide and Reference》。
SQL*Plus AUTOTRACE:统计信息
AUTOTRACE 将显示多种统计信息,这些信息并非全部与此阶段的讨论有关。最重要的统计信息包括以下内容:
db block gets 当前获取数的逻辑 I/O 数
consistent gets 缓冲区高速缓存块的读取数
physical reads 从磁盘读取的块数
redo size 所生成的重做数(针对 DML 语句)
sorts (memory) 在内存中执行的排序数
sorts (disk) 使用临时磁盘存储执行的排序数
注:数据库块获取数为缓冲区高速缓存中当前块的读取数。一致的获取数是具有还原数据的缓冲区高速缓存块的读取数。物理读取数为磁盘块读取数。通常会监视三种统计信息:数据库块获取数、一致获取数和物理读取数。与检索的行数相比,这些数值应该比较低。应该在内存中(而非在磁盘上)执行排序。
SQL 跟踪工具
如果您使用的是标准版,或不具备诊断包,则使用 SQL 跟踪工具和 TKPROF 可收集 SQL 执行计划的统计信息,以便比较性能。比较两个执行计划的一种较好方法是:执行这些语句,并比较统计信息以确定哪个更好。SQL 跟踪将其会话统计信息输出写入到一个文件,您可使用 TKPROF 对该文件进行格式化。您可使用这些工具以及 EXPLAIN PLAN 来获得最佳结果。
SQL 跟踪工具:
可为会话或实例启用
报告分析、执行和提取阶段的容量和时间统计信息
产生可由 TKPROF 格式化的输出
当为某一会话启用 SQL 跟踪工具时,Oracle DB 会生成一个跟踪文件,其中包含该会话的跟踪 SQL 语句的会话统计信息。当为某一实例启用 SQL 跟踪工具时,Oracle DB 会为所有会话创建跟踪文件。
注:SQL 跟踪涉及一些开销,因而您可能不希望在实例级启用 SQL 跟踪。
SQL 跟踪工具(续)
SQL 跟踪工具提供有关各个 SQL 语句的性能信息。SQL 跟踪提供以下信息(包括行源信息):
分析、执行和提取计数
CPU 时间和占用时间
物理读取数和逻辑读取数
处理的行数
库高速缓存未命中数
每次分析所用的用户名
每次提交和回退
显示每一 SQL 语句的实际执行计划的行操作
行数、一致读取数、物理读取数、物理写入数以及针对行的每一操作的用时
注:使用 TKPROF 实用程序可获得每个跟踪文件的概要。
使用 SQL 跟踪工具的方法
必须完成以下步骤以使用 SQL 跟踪:
1. 设置适当的初始化参数。
2. 启用 SQL 跟踪。
3. 运行应用程序(并在完成时禁用跟踪)。
4. 禁用 SQL 跟踪。
5. 关闭会话(关闭会话将同时禁用会话级的跟踪)。
6. 使用 tkprof 格式化由 SQL 跟踪产生的跟踪文件。
7. 解释输出,并视需要优化 SQL 语句。
运行 SQL 跟踪将增加系统开销。视需要仅使用 SQL 跟踪,并且在会话级使用,而非在实例级使用。
注:此示例假设使用专用服务器。在共享服务器环境、XA 或应用程序级连接共享情况下,多个会话可能服务于某单个会话。需要跟踪所有涉及的服务器,并通过使用 trcsess 实用程序来组合跟踪文件,然后提交到 tkprof 以便格式化。有关 trcsess 的详细信息,请参阅“应用程序监视”课程。
初始化参数
有多个初始化参数与 SQL 跟踪有关。
STATISTICS_LEVEL
Oracle 提供的 STATISTICS_LEVEL 初始化参数控制所有主要的统计信息收集或数据库中的指导。该参数设置数据库的统计信息收集级别。根据 STATISTICS_LEVEL 的设置收集某些指导或统计信息。
BASIC:不收集指导或统计信息。禁用监视和许多自动功能。Oracle 建议您不要使用此设置,因为这将禁用重要的 Oracle 功能。
TYPICAL:此为默认值,且确保收集所有主要统计信息,同时提供最佳整体数据库性能。对于大多数环境而言,此设置应足够了。TYPICAL 导致启用 TIMED_STATISTICS。
ALL:包括 TYPICAL 设置所收集的所有指导或统计信息,加上定时操作系统统计信息和行源执行统计信息。
此视图列出了受 STATISTICS_LEVEL 控制的统计信息或指导的状态。
初始化参数(续)
TIMED_STATISTICS
SQL 跟踪工具提供某一进程中有关 SQL 执行的各种信息,且可选地包括定时信息。如果需要定时信息,则必须将此参数设置为 TRUE。STATISTICS LEVEL 参数将自动设置此参数。通过以下方式设置参数文件中的 TIMED_STATISTICS 参数,可从 STATISTICS_LEVEL 单独设置此参数:
SQL> ALTER SYSTEM SET TIMED_STATISTICS = TRUE
对于特定会话,也可使用以下命令动态设置此参数:
SQL> ALTER SESSION SET timed_statistics=TRUE;
定时统计信息以微秒计。
MAX_DUMP_FILE_SIZE
如果在实例级启用 SQL 跟踪工具,则每次对服务器的调用都会在一个文件(以操作系统的文件格式)中产生一个文本行。这些文件(操作系统块中)的最大大小受此初始化参数限制。这是一个动态参数,也是一个会话参数。
警告:默认值为 UNLIMITED,因此这些跟踪文件可能增长而填满文件系统。
DIAGNOSTIC_DEST 是自动诊断资料档案库的根目录。此目录的默认值派生自 ORACLE_BASE 环境变量,在 UNIX 下,其为 $ORACLE_BASE/diag。启用该 Trace 工具时生成的文件将放在此资料档案库的子目录下:../rdbms/
获得有关参数设置的信息
可通过查询 V$PARAMETER 视图来显示当前的参数值:
SQL> SELECT name, value
2 FROM v$parameter
3 WHERE name LIKE '%dest%';
或者,可使用以下方法:
SQL> SHOW PARAMETER dest
为某一会话启用 SQL 跟踪
可使用所示命令为会话启用 SQL 跟踪。当要从 PL/SQL 单元内启用或禁用 SQL 跟踪时,这些过程调用比较有用。
DBA 还可使用所提供的程序包为另一用户的会话启用 SQL 跟踪。
SQL> EXECUTE dbms_system.set_sql_trace_in_session 2 (session_id, serial_id, true);
在此过程调用中,session_id 和 serial_id 为 V$SESSION 的 SID 和 SERIAL# 列中的值,其中 V$SESSION 是数据库管理员常用的数据字典视图。
若要为整个实例启用 SQL 跟踪,则使用 DBMS_MONITOR 程序包中的 DATABASE_TRACE_ENABLE 过程。
警告:实例范围内的跟踪将产生大量的跟踪文件,并会影响性能。
注: 在可以使用 DBMS_MONITOR 程序包之前,必须在其上授予 EXECUTE 权限。
通过使用 10046 事件,可将等待事件信息写入该会话的跟踪文件中。有关此事件的详细信息,请参阅 MetaLink Note: 171647.1,“Tracing Oracle Applications”。要捕获等待事件信息,请运行以下 SQL 语句:
ALTER SESSION SET EVENTS '10046 trace name context forever,level 8';
为某一会话禁用 SQL 跟踪
完成优化之后,使用前述方法之一禁用 SQL 跟踪,用 FALSE 一词替换 TRUE,或用 disable 替换 enable。如果为单次会话启用了 SQL 跟踪,则退出该会话将同时禁用 SQL 跟踪。
格式化跟踪文件
使用 TKPROF 命令将跟踪文件格式化为可读的输出。TKPROF 语法如下:
OS> tkprof tracefile outputfile [options]
tracefile 跟踪输出文件的名称(对 TKPROF 而言是输入)outputfile 存储格式化结果的文件的名称
如果不带任何参数执行 TKPROF 命令,则会生成一条用法消息以及所有TKPROF 选项的说明。请参阅下一张幻灯片上的完整列表。以下为当不带任何参数执行 TKPROF 命令时得到的输出:Usage: tkprof tracefile outputfile [explain= ] [table= ]
[print= ] [insert= ] [sys= ] [sort= ]
默认情况下,.trc 文件以 SPID 命名。可在 V$PROCESS 中找到 SPID。以下是查找该文件的更简单方法:
SQL> ALTER SESSION SET TRACEFILE_IDENTIFIER = 'MY_FILE';
然后 TKPROF 中的跟踪文件将包含“MY_FILE”字符串。
TKPROF 命令选项
黑体显示的选项是最常用的选项:
INSERT 创建 SQL 脚本以将 TKPROF 结果载入到数据库表中
SORT 报表中对语句排序的顺序(请参阅下一页的值列表)
PRINT 仅在这么多个(已排序)语句上生成报表(此选项与 SORT 选项组合尤其有用。)
EXPLAIN 以指定方案登录并执行 EXPLAIN PLAN
SYS 禁用用户 SYS 执行的递归 SQL 语句的列表
AGGREGATE 禁用或启用 TKPROF 的(默认)行为,将完全相同的 SQL 语句聚合到一条记录中
WAITS 指定是否记录在跟踪文件中找到的任何等待事件的概要
TABLE 指定在将执行计划写入到输出文件之前,用来临时存储执行计划的表(如果未指定 EXPLAIN,则将忽略此参数。当若干个体同时使用 TKPROF 来优化同一方案时,可避免具有破坏性的干扰。)
RECORD 使用在跟踪文件中找到的所有非递归 SQL 语句创建 SQL 脚本 (此脚本可用于后续重放优化会话。)
TKPROF 命令选项(续)
排序选项
prscnt 调用分析的次数
prscpu 分析所占用的 CPU 时间
prsela 分析所占用的时间
prsdsk 分析期间磁盘读取数
prsqry 分析期间一致读取的缓冲区数
prscu 分析期间当前读取的缓冲区数
prsmis 分析期间库高速缓存中的未命中数
execnt 调用的执行数
execpu 执行所占用的 CPU 时间
exeela 执行所占用的时间
exedsk 执行期间磁盘读取数
exeqry 执行期间一致读取的缓冲区数
execu 执行期间当前读取的缓冲区数
exerow 执行期间处理的行数
exemis 执行期间库高速缓存的未命中数
fchcnt 调用提取的次数
fchcpu 提取所占用的 CPU 时间
fchela 提取所占用的时间
fchdsk 提取期间磁盘读取数
fchqry 提取期间一致读取的缓冲区数
fchcu 提取期间当前读取的缓冲区数
fchrow 提取的行数
userid 分析游标的用户的 ID
TKPROF 命令的输出
TKPROF 输出按照 SQL 处理步骤列出了 SQL 语句的统计信息。包含统计信息的每行的步骤由调用列的值来标识。
分析 此步骤将 SQL 语句转换为执行计划,并包括对适当安全授权的检查和对表、列 及其它引用对象的存在的检查。
执行 此步骤中,Oracle 服务器实际执行该语句。对于 INSERT、UPDATE 和 DELETE 语句,此步骤将修改数据(包括需要时的排序操作)。对于 SELECT 语句,此 步骤将确定所选行。
提取 此步骤对查询所返回的行进行检索,并在需要时进行排序。提取的执行仅适用 于 SELECT 语句。注:“分析”值包括“硬分析”和“软分析”。硬分析是指执行计划的开发(包括优化);然后其将存储在库高速缓存中。软分析是指,在将 SQL 语句发送到数据库以进行分析时,数据库发现其位于库高速缓存中,仅需确认诸如访问权限等事宜。硬分析代价可能会比较高,尤其是因为需要优化。就库高速缓存活动而言,软分析的代价通常比较高。
TKPROF 命令的输出(续)
将在下页解释输出。
示例输出如下:
SQL ID :6assxhyzbq5jf
select max(cust_credit_limit)
from customers where cust_city ='Paris'
call count cpu elapsed disk query current rows
------- ------ ------ -------- -------- -------- -------- ----------
Parse 1 0.00 0.02 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.01 0.26 1455 1457 0 1
------- ------ ------ -------- -------- -------- -------- ----------
total 4 0.02 0.28 1455 1457 0 1
TKPROF 命令的输出(续)
TKPROF 在 CALL 列旁边显示了每条语句的以下统计信息:
Count 分析、执行或提取语句的次数(解释其它列中的统计信息之前,检查此列 的值是否大于 1。除非使用 AGGREGATE = NO 选项,否则 TKPROF 会将 完全相同的语句执行聚合成一个概要表。)
CPU 所有分析、执行或提取调用所用的总 CPU 时间(以秒计)
Elapsed 所有分析、执行或提取调用所占用的总时间(以秒计)
Disk 所有分析、执行或提取调用从磁盘上的数据文件物理读取的数据块的总数
Query 所有分析、执行或提取调用在一致模式下检索的缓冲区的总数(对于查询, 通常是在一致模式下检索缓冲区。)
Current 当前模式下检索的缓冲区的总数(对于 DML 语句,通常是在当前模式下检 索缓冲区。但是,始终在当前模式下检索段头块。)
Rows SQL 语句处理的总行数(该总数不包括该 SQL 语句的子查询所处理的行。 对于 SELECT 语句,所返回的行数用于提取步骤。对于 UPDATE、 DELETE 和INSERT 语句,所处理的行数用于执行步骤。)
附注
DISK 等效于 v$sysstat 或 AUTOTRACE 的物理读取数。
QUERY 等效于 v$sysstat 或 AUTOTRACE 的一致获取数。
CURRENT 等效于 v$sysstat 或 AUTOTRACE 的数据库块获取数。
递归调用
要执行一条由用户发出的 SQL 语句,Oracle 服务器必须间或执行其它语句。这些语句称作“递归 SQL 语句”。例如,如果在一个表中插入一行,而该表空间不足以保存该行,则 Oracle 服务器将进行递归调用以动态分配空间。当数据字典高速缓存中没有数据字典信息而必须从磁盘检索时,也会生成递归调用。
如果在启用 SQL 跟踪工具时发生递归调用,则 TKPROF 将在输出文件中清晰标出递归 SQL 语句。可通过设置 SYS=NO 命令行参数来禁用在输出文件中列出递归调用。请注意,递归 SQL 语句的统计信息将始终包含在引起递归调用的 SQL 语句的列表中。
库高速缓存未命中数
TKPROF 还针对每条 SQL 语句列出了分析和执行步骤产生的库高速缓存未命中数。这些统计信息将出现在表格式统计信息之下的单行中。
递归调用(续)
行源操作
这些信息提供了执行于行上的各个操作所处理的行数以及其它行源信息,如物理读取数和写入数;cr = 一致读取数,pw = 物理写入数,pr = 物理读取数,time = 时间(以微秒计),cost = 成本估计,size = 行源字节数估计,card =基数(行数)。
分析用户 ID
此为上一次分析该语句的用户的 ID。
行源操作
行源操作显示了该 SQL 语句执行的数据源。仅当在跟踪期间已关闭游标时,才包含此信息。如果行源操作未出现在跟踪文件中,则您可能要查看 EXPLAIN PLAN。
执行计划
如果在 TKPROF 命令行上指定 EXPLAIN 参数,则 TKPROF 将使用 EXPLAIN PLAN 命令来为每个跟踪的 SQL 语句生成执行计划。TKPROF 还显示了执行计划的每一步骤所处理的行数。
注:请注意,执行计划是在运行 TKPROF 命令时生成的,而不是生成跟踪文件时。如果自跟踪语句起,已创建或删除某个索引,则结果可能明显不同。
优化程序模式或提示
这表示在执行语句期间所用的优化程序提示。如果无提示,则将显示所用的优化程序模式。
...
select max(cust_credit_limit)
from customers where cust_city ='Paris'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 77 77 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.01 77 77 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 85 (SH)
Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=77 pr=77 pw=77 time=0 us)
77 TABLE ACCESS BY INDEX ROWID CUSTOMERS (cr=77 pr=77 pw=77 time=555 us
cost=85 size=1260 card=90)
77 INDEX RANGE SCAN CUST_CUST_CITY_IDX (cr=2 pr=2 pw=2 time=1 us cost=1
size=0 card=90)(object id 75264)
不带索引的 TKPROF 输出:示例
幻灯片中的示例展示了正从 CUSTOMERS 表提取多次执行的结果集(行)。其需要 .12 秒的 CPU 提取时间。该语句是通过全表扫描 CUSTOMERS 表而执行的,这可以从输出的行源操作看出。
必须优化该语句。
注:如果 CPU 或 elapsed 的值为 0,则未设置 timed_statistics。
带有索引的 TKPROF 输出:示例
幻灯片中所示结果表示,当在 CUST_CITY 列上创建一个索引后,CPU 时间便减为 .01 秒。之所以实现这些结果,是因为该语句使用索引来检索数据。另外,由于此示例是再次执行同一语句,因此大多数数据块已经位于内存中。通过合理利用索引,可显著改善性能。使用 SQL 跟踪工具确定具有提高潜力的区域。
注:除非需要,否则不应构建索引。因为必须添加、更改或删除对行的引用,所以索引一定会减慢 INSERT、UPDATE 和 DELETE 命令的处理速度。应删除未使用的索引。但是,可使用索引监视功能来确定并删除任何未使用的索引,或使用 SQL 访问指导来确定未使用的索引,而不需通过EXPLAIN PLAN 处理所有应用程序 SQL。
生成优化程序跟踪
可通过命令使优化程序产生对成本决定(通过命令作出)的跟踪。此方法偶尔用于为 Oracle 技术支持提供其它有关优化程序行为的信息。
ALTER SESSION SET EVENTS
'10053 trace name context forever, level 1';
可使用以下命令修改与其它跟踪文件位置相同的优化程序跟踪的位置和跟踪文件的名称:
ALTER SESSION SET TRACEFILE_IDENTIFIER='opt';
该跟踪文件无需格式化,但该文件相当大,所以请确保使用以下命令增大会话中该跟踪的允许大小:
ALTER SESSION SET MAX_DUMPFILE_SIZE=UNLIMITED;
通过退出会话或使用以下命令,停止会话中的跟踪:
ALTER SESSION SET EVENTS
'10053 trace name context off';
创新互联公司专注于克州企业网站建设,成都响应式网站建设公司,商城网站定制开发。克州网站建设公司,为克州等地区提供建站服务。全流程按需网站开发,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务