我有一个定义为 Number (10,3) 的列,并且该列已建立索引。我想知道如果我将此列转换为整数,索引会在其上表现更好。我必须在代码中乘以 10^7 并除以 10^7。但不知道有必要吗?
谢谢,
几乎可以肯定,这不会有明显的差异。
索引可能稍微更紧凑,因为整数表示可能比定点表示稍小。例如,数字 1234 需要 3 个字节的存储空间,而数字 1.234 则需要 4 个字节的存储空间。有时,情况正好相反,定点值需要的存储空间更少,但整数表示形式比相反情况小的可能性要高出 100 倍。您可以通过用前 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
Run Code Online (Sandbox Code Playgroud)
虽然索引会稍微紧凑一些,但这只有在您对索引结构进行一些广泛的范围扫描或快速完整扫描时才会发挥作用。整数值索引中的级别不太可能较少,因此单行查找将需要同样多的 I/O。您很少会想要对索引进行大规模范围扫描。数据更加紧凑这一事实也可能会增加某些块上的争用。
因此,我的猜测是,索引将使用略少的磁盘空间,但您很难注意到性能差异。如果您每次都进行额外的乘法和除法运算,则消耗的额外 CPU 可能会抵消您可能获得的边际 I/O 优势。如果您的应用程序碰巧执行的索引快速完整扫描比平均值多得多,您可能会看到 I/O 有所减少。