问题描述
嗨-我们正在对与供应商产品相关的数据库进行一些数据转换。这意味着从一个版本的供应商模式迁移到另一个版本。所以重新映射数据。在性能运行期间,其中一个sql运行时间更长。所以我运行了SQL调优顾问。它返回了一个推荐的SQL配置文件与99.9% 的好处。我应用了它,显然可以看到它的处理速度要快得多。两者之间的区别是计划更改。第二个是使用并行执行。现在我的问题是-我们可以将其保留在个人资料中吗?这会在数据库重新启动之间持续存在吗?当我们在prod中实际运行它时,我们只是迁移sql配置文件,还是应该找到一种方法来获得SQL配置文件本来可以完成的计划。最好的方法是什么?为该sql保留SQL配置文件是否有任何危害?
专家解答
嗨,先生,
让我开始用SQL配置文件的简要说明来解决您的问题。
优化器通常使用诸如对象和系统统计信息,编译环境,绑定值等信息来确定SQL语句的最佳计划。在某些情况下,这些输入或优化器中的缺陷可能导致次优计划。SQL配置文件包含缓解这些问题的辅助信息 (提示的子集)。当与常规输入一起使用时,SQL配置文件可帮助优化器最大程度地减少错误,从而更有可能选择最佳计划,而不会将其限制在任何特定计划中。
是否跨数据库重新启动的SQL配置文件持久化?
是的,SQL配置文件将在重新启动期间持久化,因为它存储在数据字典中。您可以使用以下查询查看数据库中所有现有的SQL配置文件,
我们应该只是将SQL配置文件迁移到生产吗?
是的,您可以轻松地将SQL配置文件从测试系统移动到生产系统,就像我们在早期的文章中描述的那样https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:952492100346078754
保留此语句的SQL配置文件是否有任何危害?
这个问题的答案是它取决于你想要的行为。
正如我前面解释的,SQL配置文件是一个提示的子集,帮助优化器纠正基数错误。它不会冻结执行计划。如果某些内容随基础表,索引或统计信息而更改,则即使该语句存在SQL配置文件,执行计划也可能会更改。
对于某些人来说,计划更改的可能性太可怕了,他们使用SQL计划基线来保证每次都获得相同的计划,而不管对统计信息或架构进行任何更改。可以在优化器上找到有关SQL计划基线以及它们与SQL配置文件有何不同的更多信息https://blogs.oracle.com/optimizer/entry/what_is_the_different_between
是否值得找到一种方法来使优化器自动生成SQL配置文件获得的计划?
同样,这里的答案取决于。
如果您对现有计划感到满意,并且您认为此语句是一次性的 (没有其他语句的行为像它一样),并且基础架构对象的统计信息不会有太大变化,那么可能不值得进行调查。
但是,如果多个SQL语句可能遇到相同的问题,或者将从修复根本原因中受益,那么可能值得研究该问题。
调查的第一步应该是弄清楚SQL配置文件是如何影响SQL语句的执行计划的。为此,您需要查看带有和不带有配置文件的SQL语句的大纲。
大纲是重现特定执行计划所需的优化器提示的完整列表。您可以使用DBMS_XPLAN包中的显示函数查看SQL语句的大纲,如下所示
通过比较两个轮廓,您将了解从哪里开始调查。根据是什么原因导致优化器得到一个不正确的计划 (缺少统计信息,表中列之间的相关性,联接列之间的相关性,复杂表达式等),您可能能够找到解决问题的替代方法。
让我开始用SQL配置文件的简要说明来解决您的问题。
优化器通常使用诸如对象和系统统计信息,编译环境,绑定值等信息来确定SQL语句的最佳计划。在某些情况下,这些输入或优化器中的缺陷可能导致次优计划。SQL配置文件包含缓解这些问题的辅助信息 (提示的子集)。当与常规输入一起使用时,SQL配置文件可帮助优化器最大程度地减少错误,从而更有可能选择最佳计划,而不会将其限制在任何特定计划中。
是否跨数据库重新启动的SQL配置文件持久化?
是的,SQL配置文件将在重新启动期间持久化,因为它存储在数据字典中。您可以使用以下查询查看数据库中所有现有的SQL配置文件,
COLUMN category FORMAT a10 COLUMN sql_text FORMAT a20 SELECT NAME, SQL_TEXT, CATEGORY, STATUS FROM DBA_SQL_PROFILES;
我们应该只是将SQL配置文件迁移到生产吗?
是的,您可以轻松地将SQL配置文件从测试系统移动到生产系统,就像我们在早期的文章中描述的那样https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:952492100346078754
保留此语句的SQL配置文件是否有任何危害?
这个问题的答案是它取决于你想要的行为。
正如我前面解释的,SQL配置文件是一个提示的子集,帮助优化器纠正基数错误。它不会冻结执行计划。如果某些内容随基础表,索引或统计信息而更改,则即使该语句存在SQL配置文件,执行计划也可能会更改。
对于某些人来说,计划更改的可能性太可怕了,他们使用SQL计划基线来保证每次都获得相同的计划,而不管对统计信息或架构进行任何更改。可以在优化器上找到有关SQL计划基线以及它们与SQL配置文件有何不同的更多信息https://blogs.oracle.com/optimizer/entry/what_is_the_different_between
是否值得找到一种方法来使优化器自动生成SQL配置文件获得的计划?
同样,这里的答案取决于。
如果您对现有计划感到满意,并且您认为此语句是一次性的 (没有其他语句的行为像它一样),并且基础架构对象的统计信息不会有太大变化,那么可能不值得进行调查。
但是,如果多个SQL语句可能遇到相同的问题,或者将从修复根本原因中受益,那么可能值得研究该问题。
调查的第一步应该是弄清楚SQL配置文件是如何影响SQL语句的执行计划的。为此,您需要查看带有和不带有配置文件的SQL语句的大纲。
大纲是重现特定执行计划所需的优化器提示的完整列表。您可以使用DBMS_XPLAN包中的显示函数查看SQL语句的大纲,如下所示
Explain plan for
Select prod_id, sum(amount_sold)
From SALES
Where channel_id=5
Group by prod_id;
Explained.
select * from table(dbms_xplan.display(null,null,'BASIC +outline'));
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------
Plan hash value: 3604305554
--------------------------------------
| Id | Operation | Name |
--------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | HASH GROUP BY | |
| 2 | PARTITION RANGE ALL| |
| 3 | TABLE ACCESS FULL | SALES |
--------------------------------------
Outline Data
-------------
/*+
BEGIN_OUTLINE_DATA
USE_HASH_AGGREGATION(@"SEL$1")
FULL(@"SEL$1" "SALES"@"SEL$1")
OUTLINE_LEAF(@"SEL$1")
ALL_ROWS
DB_VERSION('12.2.0.2')
OPTIMIZER_FEATURES_ENABLE('12.2.0.2')
IGNORE_OPTIM_EMBEDDED_HINTS
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter(TO_NUMBER("CHANNEL_ID")=5)
30 rows selected.
通过比较两个轮廓,您将了解从哪里开始调查。根据是什么原因导致优化器得到一个不正确的计划 (缺少统计信息,表中列之间的相关性,联接列之间的相关性,复杂表达式等),您可能能够找到解决问题的替代方法。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




