Если я буду иметь столбец таблицы с данными и создам индекс на этом столбце, то индекс возьмет то же количество дискового пространства как сам столбец?
Мне интересно, потому что я пытаюсь понять, сохраняют ли B-деревья на самом деле копии данных столбца в вершинах, или они так или иначе указывают на них?
Извините, если это "Java заменит XML?" добрый вопрос.
ОБНОВЛЕНИЕ:
составленный таблица без индекса с единственным столбцом GUID, добавленным 1M строки - 26 МБ
та же таблица с первичным ключом (кластерный индекс) - 25 МБ (еще меньше!), индексный размер - 176 КБ
та же таблица с уникальным ключом (некластеризируемый индекс) - 26 МБ, индексируйте размер - 27 МБ
Таким образом, только некластеризованные индексы занимают столько же места сколько сами данные.
Все измерения были сделаны в SQL Server 2005
B-дерево указывает на строку в таблице, но само B-дерево все еще занимает некоторые место на диске.
Некоторые базы данных имеют специальную таблицу, в которую встроены основные индексы и данные. В Oracle это называется IOT - таблица с индексированием.
Каждую строку в обычной таблице можно идентифицировать по внутреннему идентификатору (но это зависит от базы данных), который используется B-деревом для идентификации строки. В Oracle он называется rowid
и выглядит как AAAAECAABAAAAgiAAA
:)
Если у меня есть столбец таблицы с данными и создаст индекс для этого столбца, будет { {1}} индекс занимает такое же количество дискового места, что и сам столбец?
В базовом B-дереве количество узлов совпадает с количеством элементов в столбце.
Рассмотрим 1,2,3,4
:
1
/
2
\ 3
\ 4
Точное пространство все еще может быть немного другим (индекс, вероятно, немного больше, поскольку он должен хранить ссылки между узлами, он может не быть идеально сбалансированным и т. д.), и я предполагаю, что база данных может использовать оптимизацию для сжатия части индекса. Но порядок значений индекса и данных столбца должен быть одинаковым.
Судя по этой статье , фактически он будет занимать как минимум столько же места, сколько данные в столбце (во всяком случае, в PostgreSQL) . В статье также предлагается стратегия по сокращению использования диска и памяти.
Чтобы проверить себя, можно использовать, например, дерби DB, создайте таблицу с миллионом строк и одним столбцом, проверьте ее размер, создайте индекс для столбца и снова проверьте его размер. Если вы потратите на это 10-15 минут, сообщите нам о результатах. :)
Я почти уверен, что это сильно зависит от БД, но в целом - да, они занимают дополнительное место. Это происходит по двум причинам:
Таким образом, вы можете использовать факт сортировки данных в листьях BTREE;
Вы получаете преимущество в скорости поиска, поскольку вам не нужно искать назад и вперед, чтобы получить необходимые данные.
PS только что проверил наш сервер mysql: для индексов таблицы 20 ГБ требуется 10 ГБ места :)