Индексы DB берут то же количество дискового пространства как данные столбца?

Если я буду иметь столбец таблицы с данными и создам индекс на этом столбце, то индекс возьмет то же количество дискового пространства как сам столбец?

Мне интересно, потому что я пытаюсь понять, сохраняют ли B-деревья на самом деле копии данных столбца в вершинах, или они так или иначе указывают на них?

Извините, если это "Java заменит XML?" добрый вопрос.

ОБНОВЛЕНИЕ:

составленный таблица без индекса с единственным столбцом GUID, добавленным 1M строки - 26 МБ

та же таблица с первичным ключом (кластерный индекс) - 25 МБ (еще меньше!), индексный размер - 176 КБ

та же таблица с уникальным ключом (некластеризируемый индекс) - 26 МБ, индексируйте размер - 27 МБ

Таким образом, только некластеризованные индексы занимают столько же места сколько сами данные.

Все измерения были сделаны в SQL Server 2005

6
задан Matthieu M. 27 June 2010 в 14:38
поделиться

3 ответа

B-дерево указывает на строку в таблице, но само B-дерево все еще занимает некоторые место на диске.

Некоторые базы данных имеют специальную таблицу, в которую встроены основные индексы и данные. В Oracle это называется IOT - таблица с индексированием.

Каждую строку в обычной таблице можно идентифицировать по внутреннему идентификатору (но это зависит от базы данных), который используется B-деревом для идентификации строки. В Oracle он называется rowid и выглядит как AAAAECAABAAAAgiAAA :)

Если у меня есть столбец таблицы с данными и создаст индекс для этого столбца, будет { {1}} индекс занимает такое же количество дискового места, что и сам столбец?

В базовом B-дереве количество узлов совпадает с количеством элементов в столбце.

Рассмотрим 1,2,3,4 :

    1 
  / 
2
   \ 3 
      \ 4

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

3
ответ дан 17 December 2019 в 04:45
поделиться

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

Чтобы проверить себя, можно использовать, например, дерби DB, создайте таблицу с миллионом строк и одним столбцом, проверьте ее размер, создайте индекс для столбца и снова проверьте его размер. Если вы потратите на это 10-15 минут, сообщите нам о результатах. :)

0
ответ дан 17 December 2019 в 04:45
поделиться

Я почти уверен, что это сильно зависит от БД, но в целом - да, они занимают дополнительное место. Это происходит по двум причинам:

  1. Таким образом, вы можете использовать факт сортировки данных в листьях BTREE;

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

PS только что проверил наш сервер mysql: для индексов таблицы 20 ГБ требуется 10 ГБ места :)

2
ответ дан 17 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: