Luc*_*s B 9 sql sorting oracle oracle9i
我试图理解这个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,5,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
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
注意:我不认为它与升序或降序有关,因为我无法在a.Code和+0之间添加asc或desc,我可以在+0之后添加asc或desc
该+ 0是基于规则的优化,这使得它不可能对数字列使用索引的日子一招回来.同样,他们|| ''为字母数字列做了一个.
对于你的查询,我检查后得出的唯一结论是它的创建者正在努力表现.如果(这是我的假设)索引CODE_ZIP_CODE_IX是TBL_CODE_ZIP(代码)的索引,那么查询将不会使用它,即使它被暗示使用它.创建者可能不知道通过使用LPAD(a.code,5,0)而不是a.code,不能使用索引.order by子句获取其中间结果集(驻留在内存中)并对其进行排序.不需要索引.但+ 0看起来他似乎想要禁用它.
因此,使用的技巧是无效的,现在只是误导,正如你已经发现的那样.
问候,Rob.
PS1:最好使用LPAD(TO_CHAR(a.code),5,'0')或TO_CHAR(a.code,'fm00009').然后很清楚你在使用数据类型做什么.
PS2:您的查询可能会受益于在LPAD上使用基于函数的索引(TO_CHAR(a.code),5,'0'),或者您用来填充邮政编码的任何表达式.
我的猜测是,a.code是包含数字字符串VARCHAR2,而+0有效它铸造了许多这样的排序将是数字,而不是字母
您应该能够在+0 之后添加ASC/DESC
| 归档时间: |
|
| 查看次数: |
4955 次 |
| 最近记录: |