④内部公开请勿外传背景:语句低效,开始分析,用了多种手段:新建索引,新增唯一性约束,重新采集表的统计信息,给关键字段创建联合字段统计信息分析,给代码加入行提示,分析索引字段的柱状图,对比正式库和测试库(测试库上的问题解决)的数据库参数等等,经过多轮分析测试,已经接近真相:索引只返回42行记录。由于索引键值在业务上是唯一属性(虽然没有为此字段创建唯一性约束),这个预估值是对的,如上面红框部分,只有42个值!问题在于:根据索引键值回表时,优化器却认为这42个值,在表里却能找到103万行记录(这个预估值是错的),这不科学!!!要么是数据库的BUG,要么有哪些地方我没考虑到?1/3④内部公开请勿外传思索了很久,没得要领,要说这是个BUG,那这个BUG也太低级了,到了11204版本,不应该出现这么低级的BUG,就在我刚和客户说完这情况,脑子中猛然想起以前的一个案例:在无锡某客户的环境上遇上的,因为关键字段值太长,超过32位,而优化器在采集字段的统计信息时,只截取了字段值的前32位,但这前32位的数值大部分却是相同的:该字段的值是由两个主外键值合并组成,主键值相同,外键值不同。所以出现这种情况,该字段值明明是具有唯一性,但由于主键值相同,导致优化器在采集时,认为字段的唯一性很差,如下:由于该字段是NVARCHAR2数据类型,而该类型的字符集为AL16UTF16,这种字符集的每个字符,都占两个字节,这导致优化器在截取数据的32位字节时,只截取了前16个字符,,,我猜测,这次遇上的,很可能也是这个原因:1000万的记录,只有190个唯一值(最高254桶2/3④内部公开请勿外传没用完),因此,根据这42个索引值,大概估计出需要从表返回103万行记录,,,简单点说,是柱状图的原因,采集了错误的柱状图信息引起。想到这一点后,我立马删除柱状图信息,再尝试解析语句,果然,这次,优化器预估,根据索引返回的42行记录,从表里只需要返回42行记录,此时茅塞顿开:索引的数据具有唯一性,优化器在缺乏柱状图的信息下,自动对比表的总行数,与该索引字段的唯一总行数,而采集到的这个索引字段的唯一总行数的值,是对的,这才是期望的结果,,,知会客户再到系统测试,,,这次,效果很好,原先需要50秒的语句,现在5秒左右就出结果,几个终端客户测试过,都是这个效率,客户表示满意,,,3/3