Чем полезны растровые индексы? - PullRequest
30 голосов
/ 10 августа 2010

Википедия приводит этот пример

Identifier    Gender         Bitmaps
                              F    M
1           Female            1    0
2           Male              0    1
3           Male              0    1
4           Unspecified       0    0
5           Female            1    0

Но я не понимаю этого.

  • Как этот индекс прежде всего?Разве индекс не должен указывать на строки (используя rowid) с заданным ключом?
  • Какие бы типичные запросы были бы полезны для таких индексов?Как они лучше, чем индексы B-дерева?Я знаю, что если мы используем индекс B-дерева для Gender здесь, мы получим много результатов, если, например, мы ищем Gender = Male, который необходимо отфильтровать далее (поэтому он не очень полезен).Как растровое изображение улучшает ситуацию?

Ответы [ 3 ]

36 голосов
/ 11 августа 2010

Лучшее представление индекса растрового изображения, если дан пример выше:

Identifier    Gender          RowID
1             Female          R1
2             Male            R2
3             Male            R3
4             Unspecified     R4
5             Female          R5

индекс растрового изображения в столбце пола будет (концептуально) выглядеть следующим образом:

Gender       R1    R2   R3   R4   R5
Female       1     0    0    0    1
Male         0     1    1    0    0
Unspecified  0     0    0    1    0

Битовые индексы используются, когда число различных значений в столбце относительно мало (рассмотрим противоположное, где все значения уникальны: индекс растрового изображения будет таким же широким, как каждая строка, и до тех пор, пока это как одна большая единичная матрица.)

Таким образом, с этим индексом создается запрос, подобный

SELECT * FROM table1 WHERE gender = 'Male'

база данных ищет совпадения в значениях полов в индексе, находит все строки, в которых бит был установлен в 1, а затем отправляется и получает результаты таблицы.

Запрос типа:

SELECT * FROM table1 WHERE gender IN ('Male', 'Unspecified')

получит 1 бит для Male, 1 бит для Unspecified, выполнить побитовое ИЛИ, а затем перейти к строкам, где результирующие биты равны 1.

Таким образом, преимуществами использования индекса растрового изображения над индексом дерева ab * являются хранение (при низкой мощности, битовые индексы довольно компактны) и возможность выполнять побитовые операции перед разрешением реальных строк, которые могут быть довольно быстрыми.

Обратите внимание, что растровые индексы могут влиять на производительность при вставках / удалениях (концептуально вы добавляете / удаляете столбец в / из растрового изображения и изменяете его соответствующим образом ...), и можете вызвать много споров в качестве обновления строка может заблокировать всю соответствующую запись растрового изображения, и вы не можете обновить другую строку (с тем же значением растрового изображения), пока первое обновление не будет зафиксировано / откатано.

12 голосов
/ 10 августа 2010

Преимущество достигается при фильтрации по нескольким столбцам, после чего соответствующие индексы могут быть объединены с побитовыми операциями перед фактическим выбором данных.Если у вас пол, eye_colour, hair_colour, то запрос

select * from persons where
                      gender = 'male' and 
                      (eye_colour = 'blue' or hair_colour = 'blonde')

сначала будет сделан побитовым или между индексом eye_colour ['blue'] и индексом hair_colour ['blond'] и, наконец, побитовым и междурезультат и гендерный ['мужской'] индекс.Эта операция выполняется очень быстро как в вычислительном отношении, так и во время ввода-вывода.
Результирующий поток битов будет использоваться для выбора фактических строк.

Индексы растрового изображения обычно используются в "соединениях звезд" в приложениях хранилища данных.

4 голосов
/ 10 августа 2010

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

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

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

Предисловие -все остальное - это крачка непрофессионала и не-технарь

Итак, следующий вопрос: что нужно, чтобы оценить истину?Даже сравнение числовых значений означает, что компьютер должен ...

  1. Выделить память для значения, которое вы хотите оценить
  2. Выделить память для управляющего значения
  3. Назначитьзначение для каждого (посчитайте это как два шага)
  4. Сравните два - для числового значения это должно быть быстро, но для строк есть больше байтов для сравнения.
  5. Назначьте результаты для0 (ложь) или 1 (правда) значение.

повторите, если вы используете несколько частей, где предложение, например, где "это = это И это = это"

выполняет побитовые операции с результатами, сгенерированными на шаге 5 Придумайте окончательное значение Освободите память, выделенную на шагах 1-3

Ноиспользуя побитовую логику, вы просто смотрите на 0 (false) и 1 (true) значения.90% накладных расходов на сравнительную работу исключается.

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