Что такое индекс на банковской карте

Что такое индекс на банковской карте

Разбираемся с индексами на базе битовых карт

Джонатан Льюис (Jonathan Lewis)

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

Ни для кого не секрет, что.

В случае если совершить простое изучение понимания разработчиками индексов на базе битовых карт, вероятнее, следующие комментарии окажутся самые типичными:

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

Третье утверждение, в действительности, всего лишь следствие (быть может, не проверенное) второго. Причем, все три утверждения попадают в смутную территорию между большим заблуждением и ложью.

Само собой разумеется, в этих утверждениях имеется и маленькая часть правды, — достаточная, дабы растолковать их происхождение.

Цель данной статьи — разобраться в структуре индексов на базе битовых карт, проверить истинность данных утверждений и постараться узнать преимущества индексов на базе битовых карт, и какой ценой эти преимущества достигаются.

Что такое индекс на базе битовой карты?

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

Разглядим SQL-сценарий на рис. 1.

Рисунок 1. Пример данных.

Обратите внимание, что столбцы btree_col и bitmap_col заданы так, что содержат аналогичные эти, — числа от 0 до 9, повторяющиеся циклически.

В базе данных версии 9.2 с размером блока 8 Кбайт результирующая таблица займет 882 блока. Индекс на базе B*-дерева будет иметь 57 листовых блоков, а индекс на базе битовых карт — 10 листовых блоков. Фрагмент листового блока индекса на базе B*-дерева Фрагмент листового блока индекса на базе битовых карт

Рисунок 2. Блоки данных, скинутые в символьном виде.

Ясно, что индекс на базе битовых карт пара плотнее упакован, чем индекс на базе B*-дерева. Дабы заметить эту упаковку, возможно скинуть блоки данных индекса в символьном виде посредством команд типа:

Результаты представлены на рис. 2. Учтите, но, что информация, полученная в следствии сброса блока в символьном виде, может время от времени приводить к неверным выводам, потому, что часть ее — производная от данных, и порядок следования также поменян по отношению к настоящему для ясности.

Блокируются ли таблицы при работе с индексами на базе битовых карт?

Обратившись к рис. 2, возможно заметить, что запись индекса на базе B*-дерева складывается из комплекта знамён. байта блокировки. и (в этом случае) двух столбцов данных. Эти два столбца. в действительности, — проиндексированное идентификатор и значение строчка. причем, для каждой строки в таблице имеется запись этого вида в индексе. (Если бы индекс был неповторимым, содержимое каждой записи было бы таким же, но размещение мало отличалось бы).

В индексе на базе битовых карт любая запись складывается из комплекта знамён. байта блокировки и (в этом случае) четырех столбцов данных. Эти четыре столбца, в действительности, — проиндексированное значение. пара идентфикаторов строчков и поток битов. Пара идентификаторов строчков задает постоянную часть таблицы, а поток битов говорит, какие конкретно строки в этом диапазоне идентификаторов строчков содержат соответсвтующее значение.

Посмотрите, но, на размер потока битов, — протяженность столбца в представленном примере образовывает 3521 байт, либо около 27000 битов. Около 12% составляют накладные затраты на контрольные суммы и т.п. исходя из этого эта запись может покрыть порядка 24000 строчков таблицы. Но на всю запись имеется лишь один байт блокировки. тем самым, одна блокировка будет оказывать влияние на 24000 строчков таблицы.

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

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

Последствия блокировок битовых карт

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

Возможно продолжить изучение посредством гораздо меньшей тестовой таблицы (см. Рис. 3).

Мы создадим таблицу, а после этого будем делать разные трансформации различных строчков данной таблицы.

Тестовые эти: Создание структур данных для примера Изменение одной строки

Рисунок 3. Готовимcя к тестированию трансформаций.

Обратите внимание, что поменян проиндексированный столбец только одной строки таблицы. В случае если скинуть в символьном виде таблицы и блоки индекса, окажется, что байт блокировки установлен для одной строки таблицы. но заблокированы две секции индекса на базе битовых карт. Это секция для родных строчков с текущим значением 1 в проиндексированном столбце (секция, откуда убирается строка) и секция для родных строчков со значением 2 (секция, куда переносится строка). (В действительности, эти две секции битовых карт скопированы. и обе копии заблокированы).

Сейчас осталось разобраться, как враждебно блокирует сервер Oracle в этом случае.

Ответ может показаться весьма неожиданным для тех, кто мыслит категориями индексы на базе битовых карт приводят к блокированию таблицы.

В полной мере возможно сделать следующие трансформации (каждое — в отдельном тесте).

Поменять строчок в секции откуда. в случае если это изменение не затрагивает столбец индекса на базе битовых карт.

Поменять строчок в секции куда. в случае если это изменение не затрагивает столбец индекса на базе битовых карт.

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

Само собой разумеется, конфликты блокирвок вероятны, — к примеру, ни один из следующих операторов не сможет поменять заблокированную строчок

таблицы, но их исполнение приведёт к ожиданию соответствующим сеансом снятия блокировки TX в режиме 4 (разделяемой блокировки)

Учтите, но, что для происхождения неприятности нужно исполнение двух условий. Во-первых, нужно изменять проиндексированный столбец, а во-вторых, изменяемая строка обязана покрываться ранее заблокированной секцией битовой карты, т.е. должна быть относительно близко от второй, изменяемой на данный момент, причем, конфликт может вызывать весьма ограниченный комплект значений (в отечественном примере, 4).

Не забывайте, что в полной мере возможно, в нашем случае, изменять столбец, по которому создан индекс на базе битовых карт, в близкой строчке, в случае если ни исходное, ни новое значения не равны 1 либо 2. К примеру:

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

Неприятности с битовыми картами

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

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

Более того, кроме того последовательное исполнение операторов ЯМД, затрагивающих индексы на базе битовых карт, может куда значительнее сказаться на производительности, чем возможно было предположить.

Я уже подчеркивал, что простое изменение одной строки в большинстве случаев ведет к копированию всей соответствующей секции битовой карты. Возвратимся к Рис. 1 и отыщем в памяти, как большой возможно секция битовой карты. В этом примере она была размером 3500 байтов (в Oracle 9 большой размер образовывает около половины блока).

Возможно понять, что маленькое изменение данных может весьма значительно оказать влияние на размер любого изменяемого благодаря этого индекса на базе битовых карт.

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

Столбцы с маленьким числом значений

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

Это утверждение, вправду, достаточно верное, — в случае если его соответствующим образом уточнить и разъяснить. К сожалению, многие, в следствии, считаюм, что индекс на базе битовых карт прекрасным образом так действен, что его возможно применять для доступа к солидным частям таблицы методом, не считающимся целесообразным при применении индекса на базе B*-дерева.

Хорошим примером применимости индекса на базе битовых карт есть экстремальный случай столбца, воображающего пол. В этом столбце возможно всего два значения (либо три, в случае если включить требуемое стандартом ISO значение n/a — малоизвестен). Мы будем чуть менее экстремальны и разглядим пример, основанный на государствах, образующих Соединенное Королевство: Англия, Ирландия, Уэльс и Шотландия.

Пускай употребляются блоки размером 8 строки и Кбайт (очень обычным) размером 200 байтов, что дает 40 строчков в блоке. Засунем в таблицу пара миллионов строчков, обеспечив равномерно случайное распределение по государствам. Так, в среднем в каждом блоке будет по 10 строчков для каждой страны.

В случае если применять индекс на базе битовых карт для доступа ко всем строчкам по Англии, придется (10 раз) последовательно прочесть любой блок таблицы. Вне всякого сомнения, действеннее будет выполнить полный просмотр таблицы, а не применять таковой индекс.

В действительности, даже в том случае, если увеличить эти так, дабы они включали данные по 40 государствам, все равно в полной мере возможно взять по одной строке в каждом блоке таблицы. Возможно, в то время, когда эти разрастутся до глобального масштаба (скажем, охватят 640 государств, дабы строка для данной страны виделась в среднем только в каждом 16-ом блоке), может оказаться дешевле обращаться к ним по индексу на базе битовых карт, а не методом полного просмотра таблицы. Но столбец, имеющий 640 разных значений, вряд ли, на первый взгляд, попадает под определение с маленьким числом разных значений.

Само собой разумеется, описательные выражения типа маленькой, мелкий, близкий к нулю требуют определенного уточнения. К примеру, близко ли значение 10000 к нулю? В случае если сравнивать с десятью миллиардами, то да!

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

Во-вторых, применяемый оптимизатором Oracle механизм комбинирования нескольких битовых индексов делает их вправду нужными.

Разглядим следующий пример, основанный на данных по приблизительно 64-миллионному населению Англии.

  • 50 миллионов имеет карие глаза
  • 35 миллионов — дамы
  • 17 миллионов — темноволосые
  • 1,8 миллиона живет недалеко от Бирмингема
  • 1,2 миллиона имеет возраст 25 лет
  • 750000 трудится в Лондоне

Каждому критерию раздельно соответствует довольно много людей, но какое количество кареглазых брюнеток в возрасте 25 лет живет в Бирмингеме и трудится в Лондоне? Где-то несколько десятков.

Рисунок 4. Моделируем население Англии.

Отдельный индекс (будь-то на базе B*-дерева либо битовых карт) по любому из этих столбцов будет полностью ненужен для исполнения для того чтобы запроса к таким данным в СУБД Oracle.

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

Имеете возможность поэкспериментировать (см. рис. 4), но пригодиться около 2,0 Гбайт места на диске и несколько часов работы процессора с тактовой частотой порядка 500 МГц.

Из-за недостатка места я выстроил модель мельче, эмулирующую население порядка 36 миллионов. размеры и Время построения объектов для компьютера с тактовой частотой процессора 600 МГц, ОС Win2000 и сервером Oracle версии 9.2.0.1 представлены в следующей таблице.

Источник: citforum.ru

Подключение банковской карты к аккаунту Google Play

Важное на сайте:

Самые интересные результаты статей, подобранные именно по Вашим интересам:

  • Банковская карта яндекс денег: отзывы, тарифы и комиссии

    Во всем мире люди уже давно привыкли оплачивать за собственные приобретения либо нужные услуги не наличными деньгами, а пластиковыми картами. Это весьма…

  • Конвертация по банковской карте

    Конвертация по банковской карте Банки.ру Банковской картой возможно оплачивать приобретения в любой валюте независимо от валюты карточного счета. В этом…

  • Где индекс на кредитной карте

    Какую карту выбрать? На рынке существует два вида пластиковых карт: дебетовые и кредитные. Также, карты различаются по платёжным совокупностям, относясь…

  • Что такое индекс почты

    Применимо к Windows 7 Индекс производительности Windows измеряет возможности программного обеспечения и конфигурации оборудования компьютера и воображает…

  • Что такое индекс массы тела имт

    Индекс массы тела [ править ] Диаграмма индекса массы тела Для характеристики массы тела громаднейшее распространение на данный момент взял (ИМТ) — это…

  • Как узнать индекс массы тела?

    К ак определить индекс массы тела? Контроль над собственным весом – дар, дешёвый далеко не каждому. Тот, кто сумел овладеть данным мастерством,…