我想了解这个Oracle 9i查询结尾处的0是什么意思:
SELECT /*+ INDEX (a CODE_ZIP_CODE_IX) */ a.city,a.state,LPAD(a.code,5,0) ZipCode,b.County_Name CoName,c.Description RegDesc,d.Description RegTypeDesc FROM TBL_CODE_ZIP a,TBL_CODE_COUNTY b,TBL_CODE_REGION c,TBL_CODE_REGION_TYPE d WHERE a.City = 'LONDONDERRY' AND a.State = 'NH' AND lpad(a.Code,0) = '03038' AND a.Region_Type_Code = 1 AND b.County(+) = a.County_Code AND b.STATE(+) = a.STATE AND c.Code(+) = a.Region_Code AND d.Code(+) = a.Region_Type_Code ORDER BY a.Code +0
有任何想法吗?
注意:我不认为它与升序或降序有关,因为我不能在a.Code和0之间添加asc或desc,我可以在0之后添加asc或desc
解决方法
在基于规则的优化器的日子里,0是一个诡计,这使得不可能在数字列上使用索引.同样,他们做了一个|| “用于字母数字列.
对于您的查询,在检查之后,我可以达到的唯一结论是,其创建者正在努力与表现.如果(这是我的假设)索引CODE_ZIP_CODE_IX是TBL_CODE_ZIP(代码)上的索引,那么查询将不会使用它,即使它被暗示使用它.创建者可能不知道通过使用LPAD(a.code,0)而不是a.code,索引不能使用. order by子句将其中间结果集(驻留在内存中)进行排序,并进行排序.不需要索引.但是,与0相似,他正在考虑禁用它.
所以,使用的技巧是无效的,现在只是误导,就像你已经发现的那样.
问候,
抢.
PS1:最好使用LPAD(TO_CHAR(a.code),’0′)或TO_CHAR(a.code,’fm00009′).那么很清楚你正在使用数据类型.
PS2:您的查询可能会受益于在LPAD(TO_CHAR(a.code),’0′)上使用基于函数的索引,或者您用来留下您的邮政编码的任何表达式.