#sql #database #oracle #indexing
#sql #База данных #Oracle #индексирование
Вопрос:
Я читаю об индексах базы данных Oracle, и есть какой-то момент, который я не мог понять, зачем нам нужны плотные индексы, особенно в случае плотных индексов для уникальных столбцов? тот факт, что наличие записи с плотными индексами для каждой записи в нашей таблице базы данных делает затраты на ввод-вывод одинаковыми для поиска по таблице индексов или по таблице базы данных, что, с моей точки зрения, не оптимизирует производительность нашей СУБД, я уверен, что мне не хватаетукажите, как работают плотные индексы, но я действительно искал документ Oracle, не найдя подходящего ответа на мой вопрос.
Хорошо, я понимаю смысл использования плотного индекса в случае неуникального ключа, но мой реальный вопрос заключается в том, как его использование для повышения производительности уникального ключа? в чем разница между доступом к записям по плотным индексам и доступом к записям базы данных в случае плотных индексов с уникальным ключом, поскольку они имеют одинаковое количество записей?
Редактировать :
В плотном индексе создается запись для каждого ключа поиска, оцененного в базе данных. Это помогает вам быстрее выполнять поиск, но требует больше места для хранения записей индекса. В этом индексировании записи метода содержат значение ключа поиска и указывают на реальную запись на диске.
Комментарии:
1. Что такое плотный индекс?
2. На самом деле индекс Oracle B-tree не является плотным в случае столбца с нулевым значением, потому что не все строки индексируются .
3. Вместо того, чтобы бороться с теорией, просто создайте таблицу с несколькими M строками, создайте индекс по ID и сравните производительность запроса
select * from tab where id =1
с запросом, выбирающим все данные из таблицы;) Первый получит доступ к 2-3 индексным блокам и одному табличному блоку, а второй — к нескольким табличным блокам. Это объяснение?4. Я отредактировал свой вопрос, чтобы включить определение плотного индекса @WernfriedDomscheit.
5. @MarmiteBomber, я сделаю это, но на самом деле я хочу понять концепцию, я знаю, что использование индексов оптимизирует производительность, но я хочу знать, как это будет сделано.
Ответ №1:
тот факт, что наличие записи с плотными индексами для каждой записи в нашей таблице базы данных делает затраты на ввод-вывод одинаковыми для поиска по таблице индексов или по таблице базы данных,
Поскольку все знакомые мне индексы являются «плотными индексами», я буду использовать «индекс» для обозначения этого и «разреженный индекс» для других разновидностей.
Это просто заблуждение.
Цель индекса — значительно снизить затраты на ввод-вывод при чтении таблиц. Концептуально индекс делает это, сохраняя упорядоченный список ключей. Затем можно быстро просмотреть структуру индекса, чтобы найти конкретное значение или, во многих случаях, диапазон значений.
Концептуально вы можете представить индекс как упорядоченный список ключей и двоичный поиск. Однако фактическая реализация может быть совершенно иной. Наиболее часто используются сбалансированные деревья. Более эзотерические типы используют хэш-коды. И затем некоторые типы специфичны для определенных типов данных, таких как индексы ГИС и полнотекстовые индексы.
Очень важной частью индекса является то, что он может находить определенные строки с определенным значением. Вторая важная часть заключается в том, что таблицы SQL представляют неупорядоченные мультимножества (мультимножества — это просто наборы, которые допускают повторяющиеся значения).
Если вы соберете их вместе, вы поймете, что разреженный индекс действительно не имеет смысла, потому что нет способа найти значения, которых нет в индексе.
Вероятно, это относится к кластеризованным индексам в таблице. Кластеризованный индекс — это особый тип индекса, в котором базовые данные фактически сортируются по ключу индекса (только один кластеризованный индекс на таблицу). В качестве оптимизации пространства для кластеризованных индексов разреженное хранилище имеет некоторый смысл. Сканирование записей на одной странице часто сопоставимо по стоимости с уменьшением глубины индекса на несколько уровней.
Я также хочу отметить, что «разреженный» чаще используется в разговорах с базой данных — и это были бы разреженные данные. Базы данных, ориентированные на столбцы, оптимизированы, среди прочего, для столбцов, которые часто имеют NULL
значения. Однако я не думаю, что это использование «разреженного индекса» связано с разреженными данными.
Ответ №2:
Ключевым моментом является то, что индексы не совпадают с таблицей.
Индексы и таблицы, организованные по индексу
Индекс — это необязательная структура, связанная с таблицей или кластером таблиц, которая иногда может ускорить доступ к данным. Создавая индекс для одного или нескольких столбцов таблицы, вы получаете возможность в некоторых случаях извлекать из таблицы небольшой набор случайно распределенных строк. Индексы являются одним из многих средств сокращения дискового ввода-вывода.
Индексы — это объекты схемы, которые логически и физически независимы от данных в объектах, с которыми они связаны. Таким образом, индекс может быть удален или создан без физического воздействия на таблицу для индекса.
Таким образом, в контексте unqiue index чтение из индекса B-дерева с одним столбцом намного быстрее, чем из таблицы, содержащей несколько столбцов.
Комментарии:
1. Поиск будет быстрее в случае доступа к записи в одном столбце, но выборка данных из базы данных будет такой же, как при выборке того же количества столбцов, другими словами, после нахождения значения указателя нашего запрошенного ключа мы получим доступ к базе данных для загрузки других значений столбцов, которые будутта же стоимость…
2. Подумайте другими словами, у вас есть таблица строк объемом 1 млн с 20 столбцами и сделайте
SELECT * FROM tab WHERE col = 1
. Что было бы быстрее — сканирование всей таблицы (чтение всех страниц данных) и отбрасывание 99% ее как ненужных операций чтения или сканирование небольшого индекса, поиск указателя (rowid) и чтение только необходимых страниц данных?3. Выполнение этого запроса:
SELECT * FROM tab WHERE col=1
в случае отсутствия индекса процесс поиска будет считывать все столбцы (20) нашей таблицы и проверяет, выполнено ли условие ? Он не будет просто сканировать значения столбца col , и если значение равно 1, он возвращает всю запись?