【 使用环境 】生产环境
【 OB or 其他组件 】
【 使用版本 4.3.5
【问题描述】
参数 仅有id的 in个数不一致
WHERE
s.id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
如上。2个sql样本仅传入的参数不同,sqlId不一致。导致调整执行计划时。无法统一调整。
已知参数 cursor_sharing为 FORCE
【 使用环境 】生产环境
【 OB or 其他组件 】
【 使用版本 4.3.5
【问题描述】
参数 仅有id的 in个数不一致
WHERE
s.id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
如上。2个sql样本仅传入的参数不同,sqlId不一致。导致调整执行计划时。无法统一调整。
已知参数 cursor_sharing为 FORCE
没生效吧
参数没生效? 这个参数一直是这个默认值。
IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)的参数个数一致么
SHOW VARIABLES like ‘version_comment’; 查一下 具体版本信息
in的参数不一样 两个文本 应该也是不一样的
相同文本的 SQL 的 SQL_ID 总是相同的 所以不同的文本下 sql_id也是不一样的
sql_Id不一致,调整执行计划时,确实无法统一调整的。你可以看看能否使用hint的方式,绑定一下。
不一致
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479547
你可以看看format_sql_id 是否一致 如果一致也可以使用 FORMAT_SQL_ID绑定执行计划
https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000005438226?back=kb
你看看我上面发的 format_sql_id 你看看这样的方式是否可以
用format sql id来绑定,有format outline
学习下
学习下,感觉执行计划应该都一样吧,保是In里面的个数不一样就算两个执行计划么
是否有确定 format_sql_id是否一样 看一下绑定outline是否生效
你查看一下 看看执行相似的文本 format_sql_id的值是否一样
select usec_to_time(request_time),query_sql,sql_id,format_sql_id from oceanbase.gv$ob_sql_audit where query_sql like ‘%select * from test_table%’ and query_sql not like ‘%usec_to_time%’;
这个文档 你也看一下
https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000005438226
对的,这是基本原理,IN 中 参数个数不一致,那么产生的SQL_ID就会不同,因为SQL途径快速参数化阶段时候,得到的参数不一样。
in数量不一致就会有不同的sql id,因为参数化后的文本不一样
format_sql_id想要生效。 需要把类似sql之前绑的计划都解绑
牛逼大佬