浮点列对oracle索引的性能影响是什么?

时间:2012-02-17 19:38:18

标签: oracle indexing

我有一个定义为Number(10,3)的列,并且该列已编入索引。我想知道如果我将此列转换为整数,索引是否会在其上执行得更好。我将需要多次10 ^ 7并在我的代码中除以10 ^ 7。但我不知道是否有必要?

谢谢,

1 个答案:

答案 0 :(得分:4)

几乎肯定不会有明显的差异。

索引可能稍微更紧凑,因为整数表示可能略小于定点表示。例如,数字1234需要3个字节的存储空间,而数字1.234需要4个字节的存储空间。有时,反之亦然,固定点值需要较少的存储空间,但整数表示法小于反向值的可能性要高100倍。您可以通过使用前100万个整数和第一个百万个整数除以1000来填充表来自己看到。

SQL> create table int_test( int_col number(38,0), fixed_col number(10,3) );

Table created.

SQL> insert into int_test
  2    select level, level/1000
  3      from dual
  4   connect by level <= 1000000;

1000000 rows created.

SQL> select sum(vsize(int_col)) int_col_total_size,
  2         sum(vsize(fixed_col)) fixed_col_total_size
  3    from int_test;

INT_COL_TOTAL_SIZE FIXED_COL_TOTAL_SIZE
------------------ --------------------
           3979802              4797983

SQL> ed
Wrote file afiedt.buf

  1  select count(*) int_larger_than_fixed
  2    from int_test
  3*  where vsize(int_col) > vsize(fixed_col)
SQL> /

INT_LARGER_THAN_FIXED
---------------------
                 8262

SQL> ed
Wrote file afiedt.buf

  1  select count(*) fixed_larger_than_int
  2    from int_test
  3*  where vsize(int_col) < vsize(fixed_col)
SQL> /

FIXED_LARGER_THAN_INT
---------------------
               826443

虽然索引会变得更加紧凑,但只有在对索引结构进行大范围扫描或快速全扫描时才能发挥作用。整数值的索引中的级别不太可能,因此单行查找将需要尽可能多的I / O.你很想在索引上进行大范围扫描。数据更紧凑的事实也可能会增加某些块的争用。

因此,我的猜测是,索引会在磁盘上使用稍微少的空间,但是你很难注意到性能差异。如果你每次都进行额外的乘法和除法,那么消耗的额外CPU可能会取消你可能得到的任何边际I / O好处。如果您的应用程序碰巧执行了比平均值更多的索引快速完整扫描,您可能会看到一些减少的I / O.