2012-02-17 3 views
0

У меня есть столбец, определяемый как Number (10,3), и этот столбец индексируется. Мне было интересно, если я преобразую этот столбец в целое число, будет ли индекс работать лучше на нем. Мне нужно будет несколько на 10^7 и сделать деление на 10^7 в моем коде для него. Но я не знаю, если это необходимо?Какое влияние оказывает влияние на индекс оракула на поплавковой колонке?

Спасибо,

ответ

4

Это почти наверняка не будет заметной разницы.

Индекс может быть немного более компактным, поскольку целочисленные представления могут быть немного меньше, чем представление с фиксированной точкой. Например, для номера 1234 требуется 3 байта памяти, а для номера 1.234 требуется 4 байта памяти. Иногда обратное будет истинным, а значение фиксированной точки потребует меньше памяти, но в 100 раз более вероятно, что целочисленное представление будет меньше, чем наоборот. Вы можете видеть, что сами по заполнению таблицы с первыми 1 миллиона целых и первый миллион целых чисел, разделенных на 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 

В то время как индекс будет slighly более компактным, что придет только в игру, если вам «Выполняйте несколько расширенных сканирований по диапазону или быстрое полное сканирование структуры индекса. Очень маловероятно, что в индексе будет меньше уровней для целочисленных значений, поэтому для однострочного поиска потребуется столько же ввода-вывода. И довольно редко вам нужно делать масштабные сканирование диапазона по индексу. Тот факт, что данные являются более компактными, также может привести к усилению конкуренции на определенных блоках.

Мое предположение, следовательно, состоит в том, что индекс будет использовать немного меньше места на диске, но вам будет трудно заметить разницу в производительности. И если вы делаете дополнительные умножения и деления каждый раз, дополнительный процессор, который будет потреблять, скорее всего, отменит все преимущества маржинального ввода-вывода, которые вы можете получить. Если в вашем приложении происходит гораздо более быстрое сканирование индекса, чем в среднем, вы можете увидеть некоторые сокращенные операции ввода-вывода.