当应用程序使用绑定变量后,通过snap看到的SQL语句where部分都是一些变量,如果表之前收集过分布的统计信息,这种情况下SQL的执行计划是否会随着不同的变量值而变化?在oracle中使用绑定变量可以减少SQL语句的硬解析,SQL语句的执行计划一般不会随变量值而变化,DB2是什么情况?
使用绑定变量的情况下,缺省情况下DB2执行计划将保持不变,这有助于稳定执行计划并改善性能,特别是对于典型OLTP系统SQL相当简单的场景效果明显。在OLAP系统中,SQL往往比较复杂,如果用绑定变量的方式,SQL编译时无法确定绑定变量具体的值,往往就会出现执行计划不是最优的情况。对于这种情况,DB2提供了静态包绑定优化选项:
db2 rebind package
对于once的情况,DB2将根据第1次执行package时传入的绑定变量具体值生成执行计划并固定下来;对于always的情况,每次执行package时DB2均会根据实际传入的绑定变量值生成新的执行计划。对于OLAP系统来讲,编译时间通常远小于执行时间,每次编译代价不大;当然,对于OLTP系统来讲,每次生成新的执行计划就不划算了。