Какое влияние на производительность оказывает индекс оракула для плавающей колонки? - PullRequest
0 голосов
/ 17 февраля 2012

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

Спасибо,

1 Ответ

4 голосов
/ 17 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...