上周去客户现场,客户反应在某个页面查询时,执行时间很长,且经常报超时的错误。查看该语句,该表有上千万条记录,其中where后面的条件全部使用的绑定变量。不过其中有一个字段值除了Y就是NULL。而且页面查询时该条件传入Y,且在不选择传入参数的情况下也会默认传入Y值。将该条SQL,放到pl/sql执行(其中一个条件带入具体值),结果就几百条,极快。查看执行计划走索引很正常。但是带着变量在pl/sql查看执行计划不走索引。
从AWR报告上发现,
所以页面查询时该走索引的,而执行了全表扫描。于给客户的建议:
- 将该条件不使用绑定变量,直接写成Y值
- 加HINTS,强制走索引
- 该表的统计信息是单独收集的,禁用直方图信息收集
总结:任何事物都有两面性,绑定变量也不例外。所以不要不分情况随意的使用绑定变量。以后工作中也要注意这种情况的出现。