oracle SQL配置文件 3

2023年 11月 27日 64.2k 0

1.1.1.1   文本标准化

SQL配置文件的一个主要优势是尽管它应用于某个SQL语句,但它并不会对SQL语句做任何修改。实际上,SQL配置文件保存在数据字典中,并且查询优化器会自动选择它们。图11-6显示了在选择过程中会实施的基本步骤。

 

首先,会使SQL语句标准化,这代表不仅要不区分大小写,还要不使用空格。基于结果的SQL语句会计算出签名。然后会根据签名在数据字典中进行查找。每当找到有相同签名的SQL配置文件时,就会执行检查来确保SQL语句是最优的并且关联SQL配置文件的SQL语句也是等价的。这一步很重要,因为签名其实是个散列值,因此可能会存在冲突。如果检测成功,会将与SQL配置文件关联的hint加入到生成的执行计划中。

 

如果SQL语句包含的文字发生改变,它会像散列值签名一样改变。因此,SQL配置文件是没用的,因为SQL配置文件被绑定到某个仅会执行一次的SQL语句。为了避免这个问题,数据库引擎会在标准化阶段去除文字部分。要启用这个功能,需要在应用SQL配置文件时将force_match参数设置为TRUE。

 

图11-6 SQL配置文件选择期间实施的主要步骤

为了研究文本标准化的工作原理,可以使用dbms_sqltune包中的sql_text_to_signature函数。它需要两个输入参数,sql_text和force_match。前者指定SQL语句,后者指定文本标准化的类型。下面是节选自profilesignature.sql脚本生成的输出,展示了在签名不同但是相似的SQL语句上force_match参数的影响。

Ø  force_match设置为FALSE:空格和不区分大小写。

SQL TEXT

select * FROM dual WHERE dummy ='X'

select  
*   from   dual  
where   dummy='X'

select * FROM dual WHERE dummy =x'

select * FROM dual WHERE dummy =Y'

select * FROM dual WHERE dummy =X' OR dummy
= :b1   14508885911807130242

select * FROM dual WHERE dummy =Y' OR dummy
= :b1   816238779370039768

 

Ø  force_match 设置为TRUE: 空格和不区分大小写和文字。然而,如果SQL语句中使用了绑定变量,那么不会执行文字替换。

SQL_TEXT   SIGNATURE

select * FROM dual WHERE dummy='X'    10668153635715970930

select  
*   from   dual  
where   dummy='X'   10668153635715970930

select * FROM dual WHERE dummy='x'     10668153635715970930

select * FROM dual WHERE dummy ='Y'   10668153635715970930

select * FROM dual WHERE dummy=X' OR
dummy=:b114508885911807130242

select * FROM dual WHERE dummy='Y' OR
dummy=:b1  816238779370039768

 

请注意,同一SQL语句可以有两个SQL配置文件:一个使用设置为FALSE的force_match参数,另一个使用设置为TRUE的force_match参数。如果两个SQL配置文件都存在,那么使用设置为FALSE的force_match参数的SQL配置文件会优先于设置为TRUE的。这是因为设置为FALSE的force_match参数会比另一个更详细些。这表示可以使用一个SQL配置文件来对应大多数文字,而另一个来对应需要特别处理的(比如,当对文字的限制应用在一个数据倾斜的列上时)。

 

1.1.1.1   激活SQL配置文件

可以在系统或会话级别通过初始化参数sqltune_category来控制SQL配置文件的激活。默认值为DEFAULT。这也是dbms_sqltune包中的accept_sql_profile过程中category参数的默认值。因此,如果应用SQL配置文件时未指定类别,那么会激活默认的SQL配置文件。应用SQL配置文件时,会把类别名当作一个值来处理。比如,下面的SQL语句在会话级别激活属于test类别的SQL配置文件:

ALTER SESSION SET sqltune_category=test;

 

这个初始化参数只支持单个类别。很显然在给定时间内一个会话只能激活一个类别。

 

为了查明查询优化器是否使用了SQL配置文件,可以利用dbms_xplan包中的函数。正如下面的例子,它们输出的Note部分明确给出了需要的信息:

EXPLAIN PLAN FOR select * FROM t ORDER BY
id;

select * from table(dbms_xplan.display);

 

Note

----

- SQL profile
"import_sql_profile" used for this statement

 

对于保存在库缓存中的游标,v$sql视图的sql_profile列显示了在游标执行计划生成期间使用的SQL配置文件名。当没有使用SQL配置文件时,该列值为NULL。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论