不需要,最好的SQL替代文本将在您输入有效的许可证到TSE™后立即显示。
调优SQL,我可以将SQL变量替换为文字吗?
Tosska SQL Tuning Expert (TSE™) for Oracle® 免费版的限制
Tosska SQL Tuning Expert (TSE™) for Oracle® 免费版有以下限制:
如果您在没有许可的情况下使用TSE™,则该软件最多只能提供20个自动SQL替代方案来解决大多数常见的SQL性能问题。
但是,如果勾选“Full Power”选项,TSE™ 仍然会让您知道除了20个备选方案之外是否还有更好的解决方案,但是您无法获得具体调优细节。
如果您有兴趣获得那些超过30个选择,您可以从我们购买许可证。请注意,您不需要重新安装产品来申请许可证密钥。只需进入我们的TSE™ 在线商店 选择适合您需要的选项。
我必须安装Oracle客户端才能连接数据库吗?
Tosska SQL Tuning Expert (TSE™) 1.1.2 发行说明
释放强大的 Oracle Optimizer Hints 来优化SQL语句
常见的SQL调优方法
SQL 调优是提高 SQL 语句性能,达到用户期望的过程。开发人员或 DBA 通常使用三种方法,这些方法包括创建新索引、重写 SQL 语句和将 Oracle 优化器提示应用于 SQL 语句。每种方法都有其优缺点,适用于应用周期的不同阶段。让我们在下面讨论这三种方法。
为SQL语句创建新的索引
为SQL语句创建新的索引是提高SQL性能的一种非常常见的方法,在数据库开发过程中尤其重要。由于SQL语句的新索引不仅影响当前SQL,还影响同一数据库上运行的其他SQL语句。因此,在生产数据库中应谨慎使用。通常,用户需要对新创建的索引的其他相关SQL语句进行影响分析。
重写 SQL 语句
有很多人通过互联网教授 SQL 重写技能。这些重写规则大多都基于 Oracle 规则的 SQL 优化器或基于成本的 SQL 优化器的旧版本继承。例如,有些人可能认为以下 SQL 可能具有不同的性能:
Select * from A where A.unique_key in (select B.unique_key from B);
Select * from A where exists (select ‘x’ from B where A.unique_key=B.unique_key);
实际上,如果将这两个 SQL 放入 Oracle 数据库中,您可能会从 Oracle 获得相同的查询计划;这是因为 Oracle SQL 优化器将在内部将这两个 SQL 重写为一个标准形式,以便生成更好的查询计划。在过去的二十年中,Oracle SQL optimizer开发了一种更强大的内部重写能力。因此,Oracle已经解决了一些明显的问题,如“KEY IS NOT NULL”或“NVL(KEY, ‘ ABC ‘) = ‘ ABC ‘”不能使用索引。当然,对于复杂的SQL转换,Oracle SQL optimizer仍然存在一些限制,因此经验丰富的用户仍然可以通过SQL重写来调优SQL语句,从而影响Oracle SQL optimizer生成更好的查询计划。但是,由于 SQL 语法和最终查询计划生成之间的关系越来越弱,因此 DBA 越来越难以应用此方法,这是因为Oracle基于成本的优化器(CBO) 变得越来越智能,并且 SQL 文本的语法不再是成本计算和计划生成中的主导因素。
SQL 重写在开发和生产数据库中仍然很有用,因为它是对数据库的单独更改,并且不会影响其他 SQL 的性能,并且比创建新索引更安全。但是它需要在程序源代码中修改SQL语句,因此单元测试或集成测试可能仍是必需的。相反,使用提示来调整 SQL 相对更安全,因为不容易意外地更改SQL的语义。
对SQL语句应用提示
市场上的大多数数据库都提供了一些查询计划控制语言,以帮助其优化器更好地优化特定的 SQL 语句。例如:IBM LUW 优化指南和 SQL Server 计划指南已经提供了多年。Oracle 提供了嵌入 SQL 文本的优化器提示,用于告诉 Oracle SQL 优化器如何优化 SQL 语句。由于提示不会影响 SQL 语句的语义,因此它比 SQL 重写和生成新索引相对更安全。Oracle提供了超过100个文档化的优化提示。使用正确的提示来调整 SQL 是并不容易掌握,除非您是使用优化器提示的专家,即使是专家,如果从一百个提示中挑选只3个提示,那也是非常的困难的, 因为它是接近一百万的排列。
让我们用一个带有以下 Optimizer Hints 的简单SQL示例来展示优化提示是如何工作的,这些提示用于告诉Oracle SQL Optimizer在查询计划选择期间尽可能使用DEPARTMENT表的索引。Oracle将通过对DEPARTMENT表的索引检索,在所有计划中寻找成本最低的计划。
Select /*+ INDEX(@QB2 DEPARTMENT) */ *
From employee
Where emp_dept in (Select /*+ QB_NAME(QB2) */ dpt_id
From department
Where dpt_name LIKE ‘D%’);
Oracle SQL提示不是一种编程语言
Oracle Optimizer hint不是一种带有正确语法检查或错误返回的编程语言。这意味着一个无效的SQL语句提示指令,Oracle SQL优化器不会返回错误消息。此外,即使这是一条有效的提示指令,Oracle SQL优化器实际上不能遵守,也不会返回错误消息。因此,在影响SQL优化器生成特定的更好的查询计划之前,用户必须进行大量的反复试验。
了解解决方案
这是一个非常常见的调优实践,人们试图为性能较差的SQL语句找到最佳的查询计划,它的工作就像一个人模拟Oracle SQL优化器的工作,用人的知识优化SQL语句。如果SQL语句很简单,而且Oracle SQL优化器犯了一个明显的错误,那么人工干预对这种简单的SQL很有效。举个例子:
Select * from A where A.KEY<’ABC’;
如果Oracle SQL optimizer没有使用索引从表A检索记录,而使用索引KEY1实际上是一个更好的解决方案。您可以使用优化器提示来指示Oracle对该SQL语句使用索引而不是全表扫描。
Select /*+ INDEX(KEY1 KEY1_INX) */ from A where A.KEY1<’ABC’ and A.KEY2<123 and A.KEY3<’C’;
了解最佳解决方案对于简单的 SQL 语句来说很容易,但对于复杂的 SQL 语句来说却很难。由于复杂 SQL 的查询计划中有很多执行步骤,因此人类无法估计每个步骤并制定一系列查询步骤来组成最佳性能查询计划。因此,使用 Oracle 优化器提示来指示 SQL 优化器为复杂 SQL 生成特定的查询计划可能并不容易,即使对于经验丰富的 SQL 调优专家也是如此。
了解问题
与了解 SQL 语句的解决方案不同,人工专家可以相对更轻松地查找问题在复杂查询计划中的位置。告诉 Oracle 绕过此问题的方法是应用前缀为”NO_”的提示,如 NO_INDEX 或 NO_USE_HASH。它告诉 Oracle 不要在查询计划中使用指定的操作,而是选择成本较低的其他操作。这种方法在市场上并不普遍采用,因为人们通常受以解决方案为导向的思维的约束。
例如:
Select /*+ NO_INDEX(KEY2 KEY2_INX) */ * from A where A.KEY1<’ABC’ and A.KEY2<123 and A.KEY3<’C’;
如果您认为 KEY2_INX 不是从表 A 检索记录的好索引,则可以通过应用 /* NO_INDEX(KEY2 KEY2_INX)*/ 来禁用 KEY2 索引,并让 Oracle 选择其他索引来检索记录。
释放Oracle优化器提示的潜在功能
无论您是使用面向解决方案的方法还是问题绕过方法,您都需要了解 SQL 查询计划的详细信息、数据分布、每个步骤的成本,并尝试预测计划的最终实际聚合成本是什么。有时,您必须将这两种技术用于复杂的 SQL 语句;您必须为查询计划的某些部分提供最佳查询步骤,并使用”NO_”绕过查询计划中的已知问题。这是一个非常复杂的过程,如果没有对 SQL 调优的深入了解,普通 SQL 开发人员很难执行。
下面的示例显示了一个花费8.56秒完成的SQL,查询计划看起来很正常。SQL语法是完整的,因此没有太多空间进行SQL重写。可能并行执行可以帮助改进SQL语句,但是应该使用哪个表或索引进行并行执行,以及新的并行执行步骤如何影响整个查询计划。即使对于经验丰富的 SQL 调优专家来说,这也不是一件容易的事。这就是为什么Oracle优化器提示没有从一开始就被充分挖掘的原因。
借助最新的 AI 算法,计算机搜索引擎可以极大地释放用户发现提示组合的努力,而无需经历巨大的提示排列空间。它使 hint SQL调优变得更容易,并可以解决比您预期的更多的问题。
以下解决方案显示了一系列提示组合,这些提示组合告诉 Oracle 不要使用 EMPLOYEES.EMPSS_GRADE_INX 索引和排除哈希联接以联接表,然后使用表 EMPLOYEES 的并行索引扫描。它生成比原始计划快 70% 的新查询计划。整个调优过程无需人工干预即可完成,结果是安全的,因为它不涉及任何语法重写。
https://www.tosska.cn/tosska-sql-tuning-expert-tse-oracle-zh/
Tuning SQL without touching the its SQL text
如果您是一个应用程序用户,您可能想知道,如果无法直接编辑查询,如何调整 SQL。或者,如果您是应用程序开发人员,您希望快速修复 SQL 性能,而无需花时间进行思考源代码更改和单元测试。Oracle 提供了多个功能,例如 SQL 配置文件、SQL Plan Baselines和 SQL Patch, 您可以使用这些功能告诉 Oracle 修复 SQL 的查询计划,而不需要更改SQL文本。但是这些功能的使用仅受 Hints 注入的限制,您不能使用不同的语法重写 SQL,并且要求原始 SQL 接受重写的 SQL 查询计划。因此,在当今瞬息万变的数据库应用程序中,基于Hints的 SQL 调优变得越来越重要。
实际上,SQL 性能应该与应用程序源代码分离,SQL 性能应该易于管理,以便随时随地部署和回滚。它还应该为一个源 SQL 代码进行定制,以适应不同大小的数据库。基于hints的 SQL 调优将是释放 Oracle 数据库 SQL 性能管理潜在功能的关键,在现代数据库 SQL 调优过程中,它变得越来越重要。
下载时遇到“提交被拒绝,令牌无效”错误怎么办
哪些人会是TIM™的用户?
如果您对Oracle® 新的功能 In-memory 有以下一个或多个问题,那么您应该考虑使用TIM™:
- 在有限大小的 in-memory 内, 放入 in-memory 内的表方案是什么?
- 对于AWR中的特定时间段或SGA中的当前SQL工作负载,最好的放入 in-memory 内的表方案是什么?
- 相比我预选的进入in-memory的表方案,还有更好的方案吗?
- 有没有一种解决方案,在牺牲不太多性能的前提下降低对 in-memory需求?
- 是否可以为给定的SQL工作负载提供精确的执行计划变化和成本估计,给出推荐的解决方案?
- 如果我将这些推荐表放入Oracle® in-memory内,对特定SQL有什么影响?
- 对于一条SQL语句,如果把所有表都放入in-memory内,但并不是最佳解决方案,那么对于这条关键的SQL语句,哪个才是最优的解决方案呢?
TIM™ – 完整的描述
关于 Tosska In-memory Maestro (TIM™) for Oracle®
Tosska In-memory Maestro (TIM™) for Oracle® 使用我们专有的人工智能引擎,自动执行In-memory SQL 最优化过程,并为给定的SQL工作负载提供In-memory对象推荐。它还提供了友好的In-memory模拟功能,使用户可以为一个SQL或给定的SQL工作负载虚拟地评估In-memory的表对象,而无需实际填充这些表对象。
关键功能
TIM™的主要功能包括 IM SQL Tuning模块,该模块在In-memory环境中优化SQL语句,具有不折不扣的性能调优能力;IM Advisor使用Tosska专有的人工智能引擎,为AWR或SGA提供空前未有的In-memory对象推荐。使用TIM™的IM Simulator,用户可以对给定的SQL工作负载进行虚拟In-memory对象模拟,而无需实际填充所选的表对象。TIM™还提供了一些工具,使您可以更轻松地管理IM环境。IM对象管理器是一个图形化工具,它可以帮助用户通过单击来管理In-memory中的对象,而IM Configuration是一个工具,它可以帮助用户查看数据库当前内存中的设置,并启用或设置新的In-memory配置。
连接和配置
要开始使用TIM™,用户必须使用连接管理器与目标数据库建立连接。然后,用户可以使用IM配置工具查看数据库当前In-memory的状态、不同大小池的使用情况和In-memory使用面板中显示的设置,并使用In-memory选项面板启用或设置新的In-memory配置。
IM SQL Tunning
对于任务关键型SQL语句,用户可能希望使用Oracle In-memory功能优化其 SQL 以获得最佳性能。TIM™提供了一个创新的功能,帮助用户评估和调优SQL,并假设将相关表对象填充到 In-memory或从 In-memory中反填充。一个专有的人工智能引擎是嵌入式的,以彻底探索大多数表候选项的组合,这是手动SQL调优无法实现的,它对于具有许多表联接的复杂 SQL 语句调优特别有用。
IM SQL Tuning调优模块提供一个SQL文本面板,用户可以在此面板中输入或粘贴SQL语句进行调优。使用User Scenario函数,用户可以模拟SQL语句的场景,如果某些表正在通过特定的检索操作放入in-memory或从in-memory中删除,并查看对SQL执行计划的影响。
另外,TIM™还提供了“Auto Scenario”选项,用户可以按下这个按钮来尝试SQL语句的大多数in-memory对象组合与必要的提示,最后显示惟一的执行计划方案,以便进行基准测试。
用户可以使用TIM™中提供的测试运行选项选择一个或多个场景来测试运行,以实际执行用于基准测试的场景。使用Compare SQL scenario功能,用户可以并排查看两个SQL语句/方案,显示SQL文本、执行计划和统计信息,便于比较。执行计划中的任何差异将会被突出显示。
IM Advisor
由于in-memory大小的限制,用户必须非常小心地选择要填充到in-memory内的表,并为给定的SQL工作负载提供最佳工作。SQL工作负载是在特定时间从Oracle AWR或SGA捕获的一组SQL语句,可能有多达数千条SQL语句正在访问数百个表。因此,如何在给定的in-memory大小内选择要填充到in-memory内的表始终是一个难题。此外,用户可能想知道,是否有能够提供与给定工作负载的内存要求较少的解决方案。
最大内存大小由用户给出;TIM™可以推荐In-memory需求较少的解决方案。
借助 Tosska 专有的人工智能引擎,IM Advisor 能够在 AWR 或 SGA 的 SQL 工作负载的一定配额或时间段内找到 IM 对象的最佳建议。建议的 IM 对象将对给定的工作负载产生最大影响。这意味着用户可以使用此模块来提高来自 AWR 的特定时隙 SQL 工作负载或来自 SGA 的当前 SQL 工作负载的性能。
当创建一个新的advisor会话时,将要求用户从SGA或AWR中提取SQL,以组成一个用于推荐IM对象的SQL工作负载。一旦提取SQL完成,将显示IM Advisor界面,还将显示捕获的SQL数量和成功取得执行计划的有效SQL。您可以通过在此界面上随时单击超链接QL 详细信息查看SQL的详细信息。
IM Simulator
IM 模拟器用于模拟许多几乎选定的内存中表对象,这些对象会影响从 SGA 或 AWR 捕获的 SQL 工作负载。用户可以使用该模块来提高一天中特定小时的数据库性能;例如,如果用户希望提高一天的高峰时间性能,则用户可以在该时间时段内从 SGA 或 AWR 中提取 SQL工作负载 。取到SQL后,还将显示 SQL 相的列表,以供用户执行影响模拟。用户可以选择任意表,并将它们放入内存中,以查看对捕获的 SQL 工作负载的影响。
IM Objects Manager
TIM™为用户提供了一个非常方便的工具来管理他们的IM对象,使用各种类型的选项将其更改为In-memory内的IM对象,或者在“All objects”页面中将其从In-memory内取出。顶部还显示一个IM对象占用图,以便用户轻松地了解对象的大小和分布。用户还可以使用“In-memory 对象”页面来查看那些已经放入In-memory 内的对象。