oracle SQL配置文件 3
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'