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