代码之家  ›  专栏  ›  技术社区  ›  Lucas B

在甲骨文的ORDER BY之后,+0是什么意思

  •  9
  • Lucas B  · 技术社区  · 14 年前

    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
    

    有什么想法吗?

    注意:我不认为这与升序或降序有关,因为我不能在.Code和+0之间添加asc或desc,我可以在+0之后添加asc或desc

    5 回复  |  直到 14 年前
        1
  •  8
  •   Rob van Wijk    14 年前

    这个 + 0 在基于规则的优化器时代,这是一个技巧,使得无法在数字列上使用索引。同样,他们也做了 || ''

    对于您的查询,我在检查后得出的唯一结论是,它的创建者正在与性能作斗争。如果(这是我的假设)index CODE\u ZIP\u CODE\uix是TBL\u CODE\u ZIP(CODE)上的索引,那么查询将不会使用它,即使它被暗示要使用它。创建者可能没有意识到,使用LPAD(a.code,5,0)而不是a.code,索引就不能使用。ORDERBY子句获取驻留在内存中的中间结果集并对其进行排序。不需要索引。但是有了 + 0 他好像在想禁用它。

    当做,

    PS1:最好使用LPAD(tochar(a.code),5,'0')或tochar(a.code,'fm00009')。然后就可以清楚地知道您在用数据类型做什么了。

    PS2:在LPAD上使用基于函数的索引(TO_CHAR(a.code),5,'0')或任何用于左填充zipcode的表达式,可能会对查询有所帮助。

        2
  •  7
  •   Mark Baker    14 年前

    您应该能够添加ASC/DESC 之后 +0

        3
  •  3
  •   APC    14 年前


    假设代码是一个VARCHAR2列,其中包含数字串(邮政编码)。问题是varchars按字符串而不是数字排序。将零添加到代码中会产生对数字的隐式强制转换,从而按数字排序:

    SQL> select id, code
      2  from t72
      3  order by code
      4  /
    
            ID CODE
    ---------- -----
             1 1
             2 11
             3 111
             4 12
    
    SQL> select id, code
      2  from t72
      3  order by code+0
      4  /
    
            ID CODE
    ---------- -----
             1 1
             2 11
             4 12
             3 111
    
    SQL>
    

    如果存储的代码用零填充,那么就不需要强制转换,因为它们无论如何都会按数字顺序排序。

        4
  •  1
  •   Jeffrey Kemp    14 年前

    有索引吗 TBL_CODE_ZIP.Code ? 我见过一些查询将0添加到数字中(或将“”添加到字符串中),以强制优化器避免对查询的该部分使用索引(当然,避免使用索引的正确方法是添加适当的提示)

    可能最初的编写器有一个问题,orderby被优化为索引扫描,这导致查询运行较慢;所以他们加了+0来强制一个不同的访问路径并进行普通排序。

        5
  •  0
  •   naeemgik    13 年前

    首先很抱歉回答这个问题,因为这个问题已经很老了。但是+0提示数据库忽略此特定查询的索引(如果它位于.Code列上),

    根据数据库的优化器模式,有时索引使检索速度变快,有时索引使检索速度变慢。