如何在不修改源代码的情况下调优Oracle应用程序包的SQL

介绍

应用程序包软件是为授权给第三方组织而开发的软件程序的集合。虽然软件包软件可以通过参数或表来满足用户的特定需求,但软件本身并不是专门为组织开发的。因此,用户不能拥有源代码,也没有方法修改嵌入式SQL语句来进行性能调优。有很多基于Oracle RDBMS的应用程序包,如Siebel、PeopleSoft JD Edwards、SAP等。为了帮助应用程序包的用户,Oracle提供了一些特性来帮助用户调优SQL语句,且不需要更改源代码。

SQL profile

它是由Oracle SQL Tuning Advisor生成的概要文件。SQL概要文件包含对错误估计的统计信息和辅助信息的更正。因此,SQL profile只是将优化器引导到一个更好的计划,但它们并不保证每次解析语句时都使用相同的计划。对于某些SQL语句,无论统计数据有多好,Oracle SQL optimizer仍然无法在特定的环境中生成更好的计划。对于这些类型的SQL语句,人工干预是必要的,但是对于开发人员来说,SQL profile不是一个方便的工具,在不更改程序源代码的情况下,不能强迫Oracle执行新的计划。

SQL plan baselines and stored outlines

由于Oracle环境的变化或Oracle数据库版本升级,它可能会针对Oracle SQL优化器为某些SQL语句生成新的计划。如果它不好,我们需要一些东西来保存旧的计划,以适应新的环境。为了实现SQL计划的稳定性,stored outlines是Oracle数据库早期版本中的主要工具。Oracle数据库11g仍然支持该特性;但是,在将来的版本中,它可能会贬值,并被SQL计划管理所替代。SQL Plan Baselines的机制是保持指定SQL语句的性能,而不管数据库环境的变化或版本升级。此外,还可以手动为SQL语句创建Plan Baselines,并且该技术可以帮助开发人员指导Oracle SQL优化器为性能较差的SQL语句生成特定的计划。因此,当Oracle SQL optimizer下次接收到相同的SQL语句时,将根据数据库中存储的新计划基线组成更好的性能计划。不需要更改源程序中的SQL语句。
例如,如果您想要调优一条执行plan-A计划的SQL(目前Oracle SQL optimizer在您的数据库中使用这条SQL),并且您想要调优这条SQL(带有提示),使Oracle SQL optimizer生成一个新的计划plan-B。你需要做的是用执行调优后的SQL(带新的提示),并使用Oracle提供的以下方法:

使用优化后带提示的SQL执行,并在SGA中缓存plan B。

SET SERVEROUTPUT ON
DECLARE
    My_Plan  PLS_INTEGER;
BEGIN
     My_Plan := DBMS_SPM.load_plans_from_cursor_cache(
              sql_id          => 'Plan-B SQL_ID',
              plan_hash_value => 'Plan-B plan_hash_value’,
              sql_handle      => 'Original SQL’s sql_handle');
      DBMS_OUTPUT.put_line('Plan Loaded=> ' || My_plan);
END;

要启用调优计划,手动将调优后的计划更改为固定计划,方法是将其FIXED属性设置为YES。
要启用SQL plan baselines,请确保optimizer_use_sql_plan_baslines初始化参数设置为TRUE。

使用SQL Plan baselines进行SQL调优的缺点

由于SQL Plan baselines的设计目的是为了在以下环境发生变化后保持SQL语句的性能:

  • 新的优化器版本
  • 更改优化器统计信息和优化器参数
  • 更改schema和元数据定义
  • 更改系统设置
  • SQL profile 创建

您可以看到,它不是为手动SQL调优而设计的。还有一些额外的限制,比如SQL Plan Baselines不支持Parallel Hints,您不能为你的SQL加载一个应用Parallel Hints的Plan-B,而原始计划Plan-A的性能很差。 有时候, Parallel Hints 在Oracle SQL optimizer中往往能生成更好的计划。

SQL Patches

SQL Patches是SQL Repair Advisor提供的特性之一,用于修复SQL语句的关键故障,比如返回错误的结果。 SQL Repair Advisor分析有问题的语句,并在许多情况下建议使用SQL patch来修复该语句。SQL patch将影响Oracle SQL优化器为将来的执行选择一个替代的执行计划,而不是使用原来有问题的执行计划。在Oracle Database 12c Release 2之后,提供了一个公共API来手动创建SQL patch。DBMS_SQLDIAG.CREATE_SQL_PATCH包可以帮助用户为特定的SQL语句创建用于SQL调优的SQL patch。你可以改变一个性能不好的SQL语句的执行计划,而不需要修改程序源代码, 如下:

DECLARE
    Patch_name  VARCHAR2(32767);
BEGIN
    Patch_name := SYS.DBMS_SQLDIAG.create_sql_patch(
        sql_text  => 'SELECT *
                      FROM   employees
                      WHERE  emps_dept IN
                     (SELECT dpts_id
                      FROM   departments
                      WHERE  dpts_avg_salary <200000)', hint_text => 'INDEX(@SEL$1 EMPLOYEES) INDEX(@SEL$2 DEPARTMENTS)',
        name      => 'my_sql_patch_name');
END;

如果数据库版本在Oracle database 12c Release 2之前,则必须使用DBMS_SQLDIAG_INTERNAL.i_create_patch包代替。SQL文本和SQL ID都可以用于SQL提示注入。为SQL注入的提示应该放在hint_text输入参数中。只有一行 Hints 文本可以用于SQL,而且无法为任何子查询块定义自己的查询块名称。因此,如果您的SQL有多个子查询,并且希望指示Oracle在子查询的块中执行某些操作,则必须在注入的 Hints 文本中使用Oracle默认的查询块名称。
hint_text => ‘ INDEX(@SEL$1 EMPLOYEES) INDEX(@SEL$2 DEPARTMENTS) ‘
上面示例中的提示文本显示@SEL$1和@SEL$2是Oracle在SQL执行计划中提供的默认查询块名称。提示告诉Oracle使用索引搜索查询块@SEL$1中的EMPLOYEES表,同时使用索引搜索查询块@SEL$2中的DEPARTMENTS表。

使用SQL Patches来调优SQL的优缺点

没有SQL Plan Baselines的限制,SQL patch更灵活地接受提示指令,带parallel操作的复杂提示通常能被SQL patch接受。在创建 SQL Patches之后,不需要额外的维护工作来告诉Oracle使用 SQL Patches。 Oracle将使用存储的提示优化任何具有相同SQL ID或SQL文本的SQL,并生成更好的性能执行计划。此外,您还可以使用 SQL Patches 来禁用已在包应用程序中写入的破坏性提示的 SQL,甚至使用它来控制一个具有绑定感知的SQL的执行行为。
由于注入的提示文本必须放在一个文本行中,并且只使用默认的查询块名称,因此手工编写一个预期的提示来改进SQL语句,对于大多数SQL开发人员来说是一项困难的任务,尤其是对于包含许多子查询的复杂SQL语句。

一个自动创建Hints和SQL Patches的工具

到目前为止,市场上只有一个工具能够生成更好的提示且完全自动化的方式创建SQL Patch。
Tosska SQL Tuning Expert Pro 是一个用户可以在不接触其程序源代码的情况下提高 SQL 性能的工具。用户可以为不同大小的生产数据库部署不同的性能查询计划,而不需要保存程序源代码的多个版本,并且特别适合于不拥有其应用程序源代码的包应用程序用户。该工具将尝试最有用的提示组合来调优性能较差的SQL语句,最好的提示组合SQL性能将与原始SQL并排进行基准测试。用户将得到准确的性能改进,没有任何猜测或不确定的成本评估。

您可以访问我们的网站了解产品详情
https://www.tosska.cn/tosska-sql-tuning-expert-pro-tse-pro-for-oracle-zh/

Tosska Technologies宣布推出其旗舰SQL性能调优产品 – 适用于Oracle®的Tosska SQL调优专家(TSE™)

创新的SQL语句优化工具

Dec. 18, 2017

Hong Kong, December 18, 2017 – Tosska Technologies Limited(Tosska)是一家专门提供数据库和SQL性能相关工具的IT公司,今天宣布推出他们的第一个提供机器调整功能以改善Oracle® SQL性能的产品Tosska SQL Tuning Expert(TSE™)。

SQL调优是每个DBA都会遇到的标准问题。 调优SQL语句就是要找到执行SQL语句的最快路径。 为了调优SQL语句,您需要了解数据库体系结构并具有SQL调优技能的深入知识。

「市场上有很多SQL调优技巧,但大多数只在特定的数据库环境中才有用。 您需要在数据库上手动逐个尝试这些提示。 这不仅耗时,而且也无法保证您能为SQL语句找到最佳性能的解决方案,」Tosska首席执行官伍家铭说。 「对于DBA或有经验的SQL开发人员来说,调整有问题的SQL语句可能需要数天或数周的时间。 SQL调优是一项非常需要技巧的工作,在很多企业中,他们的开发人员都无法执行这样的工作。 这些昂贵且宝贵的时间是否应该节省并用于公司内部其他更高效的任务? 这就是我们设计TSE来解决这个问题的原因。」

「TSE™背后的设计理念是提供一种机器调优工具,可以在不需要用户参与的情况下优化SQL语句。 用户只需要将有问题的SQL语句输入到工具中并按下按钮,然后工具就会处理其余部分,无需用户在整个SQL调优过程中进行分析,猜测或测试,」Tosska首席技术官杜伟业表示。「TSE™通过使用Tosska发明的嵌入式人工智能(AI)引擎的专有技术,来模仿人类专家的SQL调优过程,来实现这一目标。调优引擎会在指定的配额内,为SQL语句尝试每种可能的有效Oracle Hints组合以改进执行的速度。 由于SQL语句的Oracle Hints组合的排列非常庞大,因此人类专家是无法为复杂的SQL语句完成这样的调优的。」

TSE™现在可以从Tosska的网站免费下载。 有关详细信息,请访问Tosska的网站www.tosska.com。

关于 Tosska
Tosska Technologies是一家专注于为数据库和SQL相关性能优化和改进提供解决方案的公司。我们的使命是通过我们的新技术帮助用户消除障碍。此外,Tosska是世界上为数不多的专注于使用人工智能技术解决各种数据库性能问题的公司之一。我们的目标是帮助客户减少硬件投资; 提高他们的数据库应用程序服务水平,利用我们的创新技术,为更多的战略活动腾出人力资源。更多信息请访问www.tosska.com 或发邮件至 enquire@tosska.com。

新闻和媒体咨询
KaMing Ng
Chief Executive Officer
Tosska Technologies Limited
Phone: +852-28248420
Email: enquire@tosska.com

All Trademarks mentioned on this Site are the property of their respective owners.

如何购买Tosska产品?

欢迎来到Tosska的世界!我们很高兴您决定与我们合作,让我们使用我们的Tosska解决方案来帮助您。

请选择您想要的产品(包括其选项),并将其添加到购物车。当您完成购物时,请前往购物车进行最终审核,并确保它们是您需要的,然后选择“继续结帐”。在结帐页面,请填写订单详细信息。请仔细检查并确保您的电子邮件地址正确无误,因为这将是我们向您发送Tosska产品链接以供下载(如果适用)和产品许可证密钥的地方。

成功处理付款后,您将收到一封电子邮件,其中包含您的订单详细信息以及下载您选择的 Tosska 产品(如果适用)的链接。请注意,此链接最多允许 3 次下载(如果您的下载不成功且需要重试),并且将在 30 天后过期。另外将单独向您发送一封单独的电子邮件,其中包含此订单所特有的许可证密钥。您需要此许可证密钥才能正确安装和运行 Tosska 产品。请注意,这两封电子邮件中包含的信息是严格保密的,您不应将其透露给其他人。请把它们放在一个安全的地方。

欢迎来到Tosska大家庭,享受您的Tosska产品!

揭示CBO的力量

揭示甲骨文数据库基于成本的SQL优化器的强大功能的示例

用户拥有需要很长时间才能执行的SQL语句;实际上SQL并不是很复杂,但它有一个非常复杂的执行计划。

Mimic SQL text :
  SELECT TO_CHAR(SYSDATE, ‘yyyy-mm-dd’) AS STAT_DATE,
SYSDATE AS STAT_TIME,
X.TABLE_NAME,
NVL(X.NUM_ROWS, 0) AS TABLE_ROWS,
NVL(ROUND(X.NUM_ROWS * X.AVG_ROW_LEN / 1024, 2), 0) AS TABLE_SIZES,
Y.CREATED AS CREATE_TIME,
Z.COMMENTS AS TABLE_COMMENT,
H .COL_CNT
FROM ALL_TABLES X,
ALL_OBJECTS Y,
ALL_TAB_COMMENTS Z,
(SELECT H .TABLE_NAME, COUNT(1) AS COL_CNT
FROM ALL_TAB_COLS H
WHERE H.OWNER = ‘TOSSKA’
GROUP BY H .TABLE_NAME) H
WHERE X.TABLE_NAME = Y.OBJECT_NAME
AND X.TABLE_NAME(+) = Z.TABLE_NAME
AND X.TABLE_NAME = H.TABLE_NAME
AND Y.OBJECT_TYPE IN (‘TABLE PARTITION’, ‘TABLE’)
AND X. OWNER = ‘TOSSKA’
AND Y. OWNER = ‘TOSSKA’
AND Z. OWNER = ‘TOSSKA’
ORDER BY X.TABLE_NAME

执行计划:
以下部分计划步骤列出了总共214个执行计划步骤中的10%。

用户将SQL输入到Tosska SQL Tuning Expert for Oracle中,并按Tune开始探索是否只潜在有来自Oracle的更好的查询计划。 用户回到他的日常工作中,让计算机代他完成余下的调优工作。 最后,在一小时内找到了5个更好的SQL替代计划。

产品亮点
Tosska SQL Tuning Expert配备了一个人工智能引擎,可以针对有问题的SQL尝试最有效的Hints注入组合。 引擎可以深入探索Oracle CBO在在线SQL优化阶段无法发现的任何隐藏的良好执行计划,但这些好计划实际存在于SQL语句的计划空间中。


基准结果:
原始SQL需要14分7秒。
注入提示的最佳替代SQL是SQL 45,仅需4秒。
SQL45的运行速度比原始SQL快99倍。

Oracle CBO生成的查询计划的观察
Tosska SQL Tuning Expert是一个基于提示注入的SQL调优工具,无需重写用户的SQL。 因此,注入SQL语句的各种提示以及Oracle生成的相应查询计划都是Oracle SQL优化器可以为SQL语句提供的潜在查询计划。
让我们回顾一下那些生成的查询计划以及为什么Oracle在开始时找不到最佳查询计划的原因。

第一个观察:
原始SQL的成本是1330,但SQL 130,SQL 135和SQL 45的成本都低于原始SQL的成本,为什么Oracle无法获得这些低成本计划?
原因:
Oracle无法探索它可以在短时间内生成的所有潜在查询计划,否则它将需要更长的时间来优化所指定的SQL,而这可能无法以不能预见的更好的查询计划完全补偿的。

第二个观察:
SQL 127和SQL 129的成本比原始SQL高3倍,但速度比原始SQL快得多,这意味着这两个SQL的成本估算异常错误。
原因:
这是数据库SQL优化器中使用的成本估算算法的局限性。 从理论上讲,市场上没有100%准确的SQL成本估算算法可以处理各种环境,对于像上述SQL语句这样复杂的SQL语句尤其如此。

结论:
Oracle拥有市场上最复杂的SQL优化器。 Oracle有很多更好的查询计划可以让您的SQL语句更快地运行。 因此,当您考虑升级硬件或云服务支出时,都应首先探索Oracle SQL优化器为SQL语句提供的潜在能力,而您所需要的只是一个能够揭示Oracle SQL优化器潜在能力的正确工具。

Tosska SQL Tuning Expert (TSE™) ® for Oracle®

Tosska SQL Tuning Expert Pro (TSE Pro™) for Oracle®

如SQL中的所有相关表已经在内存中,是否仍值得使用IM SQL Tuning来调优?

答案是肯定的,即使所有表都已在内存中,使用IM SQL Tuning来调优这样的SQL仍然是值得的。 我们的IM SQL Tuning将检查是否有任何表不需要放入内存来节省内存空间。 在某些情况下;内存中的对象可能引致不必要的内存中全表扫描操作而令查询计划恶化。 IM SQL Tuning会通过SQL提示应用程序建议撤消某些内存中的全表扫描。

Tosska SQL Tuning Expert Pro Version 2有哪些新功能?

将自动SQL调优技术带到新的高度

因着版本2中所支持的提示数量几乎翻了一番,Tosska SQL Tuning Expert Pro(TSE Pro)V2 的SQL调优功能达到了新的高度。 它创建了在市场上其他工具无法实现的基于「提示注入」(Hints-injection-based)的SQL调优能力的新标准。 TSE Pro版本2中的每个智能级别的新提示和更大的配额分配(Quota allocation),让更多有问题的SQL可以得到改进。实际测试结果显示即使非常简单的SQL语句仍有机会在各种环境中得到改进。

选项视窗显示新的配额和提示设置

简化从识别有问题的SQL到优化

TSE Pro版本2中添加了一个新的Tune Top SQLs模块,它是一个功能强大的工具,可以帮助用户从SGA和AWR中将高工作负载SQL语句提取到Top SQL存储库并存储在本地PC中。对于DBA来说,不用浏览数千行程序源代码而能识别出有问题的SQL语句是一个非常有用的功能。捕获的SQL语句的布局可以通过各种资源消耗值进行排序,用户可以轻松查看和找出有问题的SQL语句,并对它们进行优先排序,方便以后进行SQL调优工作。对于每个已识别为有问题的SQL语句,用户只需在Top SQL Repository视窗中点击即可进行调优,它与Tune SQL功能紧密整合,以简化找出有问题的SQL到SQL优化的流程。每个已调优的SQL的改进统计信息和已调优的SQL提示解决方案都会被记录。用户还可以对特定SQL语句加上任何备注,以提醒日后的跟进操作。

从SGA捕获SQL语句,并根据用户的优先级别逐个调优

特定SQL的调优细节可以显示在SQL列表标签页的旁边