oracle - float 列上的 oracle 索引对性能有何影响?

标签 oracle indexing

我有一个定义为 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

虽然索引会稍微紧凑一些,但只有在对索引结构进行一些大范围扫描或快速全扫描时才会发挥作用。整数值的索引中不太可能有更少的级别,因此单行查找将需要同样多的 I/O。并且您很少希望对索引进行大规模范围扫描。数据更紧凑的事实也可能会增加对某些 block 的争用。

因此,我的猜测是索引使用的磁盘空间会稍微少一些,但您很难注意到性能差异。如果您每次都进行额外的乘法和除法运算,那么额外消耗的 CPU 可能会抵消您可能获得的边际 I/O yield 。如果您的应用程序恰好执行比平均更多的索引快速完整扫描,您可能会发现 I/O 有所减少。

关于oracle - float 列上的 oracle 索引对性能有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9334294/

相关文章:

arrays - Julia 的负/补索引,如 R

sql - ORA-12899 值对于列来说太大,尽管长度相同

sql - 使用列的值进行选择

java - 如何使用java在oracle中插入BFILE值?

sql - VARCHAR2 与 NUMBER 之间的性能差异

arrays - Swift,如何使用带索引的数组重新排序另一个数组

oracle - 如何在Oracle中定义具有动态返回类型的pl sql函数?

mysql - 数据库和多列索引 (mySQL)

mysql - 无论如何都必须完全扫描表上的索引? (MySQL)

mysql - 为什么索引使这个查询变慢?