最近我遇到了一个问题,函数代码中的一些(理论上无关的)形式变化(甚至在代码中添加或删除空格字符)会极大地影响函数的性能(参见我前面的问题here和here)。
这个谜团是由乔恩·海勒
如果在代码中添加空格会更改性能,则这可能是计划管理问题。许多Oracle优化工具都对SQL_ID进行操作,这类似于SQL文本的MD5散列。因此,如果更改SQL文本的单个字符,优化程序会将代码视为全新的语句。任何计划管理修复(如SQL概要文件或计划大纲)将不会应用于新语句。可能DBA使用/*+ INDEX ... */提示优化了旧语句,但该提示不会应用于新语句。请比较DBMS_XPLAN输出中的"注意"部分。
并作为
SQL语句中的空格会更改SQL_ID,这可能导致优化器不再将SQL语句与计划管理功能匹配,如配置文件、大纲、基线(可能-在某些情况下,它们应该能够避免此问题)、补丁、高级重写等。
因此,我剩下的唯一问题是如何摆脱卡住的坏执行计划?如何从Oracle中"清除"它们?
1条答案
按热度按时间qjp7pelc1#
这对我很有效: