Индексы БД занимают столько же места на диске, что и данные столбца? - PullRequest
6 голосов
/ 05 марта 2010

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

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

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

ОБНОВЛЕНИЕ:

создал таблицу без индекса с одним столбцом GUID, добавил 1M строк - 26MB

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 05 марта 2010

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

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

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

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

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

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

    1 
  / 
2
   \ 3 
      \ 4

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

2 голосов
/ 05 марта 2010

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

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

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

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

0 голосов
/ 05 марта 2010

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

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

...