暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 接受SQL配置文件

askTom 2017-04-19
263

问题描述

嗨-我们正在对与供应商产品相关的数据库进行一些数据转换。这意味着从一个版本的供应商模式迁移到另一个版本。所以重新映射数据。在性能运行期间,其中一个sql运行时间更长。所以我运行了SQL调优顾问。它返回了一个推荐的SQL配置文件与99.9% 的好处。我应用了它,显然可以看到它的处理速度要快得多。两者之间的区别是计划更改。第二个是使用并行执行。现在我的问题是-我们可以将其保留在个人资料中吗?这会在数据库重新启动之间持续存在吗?当我们在prod中实际运行它时,我们只是迁移sql配置文件,还是应该找到一种方法来获得SQL配置文件本来可以完成的计划。最好的方法是什么?为该sql保留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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论