2010-03-05 4 views
6

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

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

Извините, если это «Будет ли Java заменять XML?» вид вопрос.

UPDATE:

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

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

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

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

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

ответ

3

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

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

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

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

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

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

1 
/
2 
    \ 3 
     \ 4 

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

+0

Это своего рода кластеризованный индекс? – Anton

+0

Я думаю, что кластеризованные индексы хранят фактические данные, потому что кластеризованные индексы сортируются так же, как и данные. – Valentin

+0

Да, IOT похож на кластеризованный индекс. Строка в таблице физически переупорядочена. Отличная производительность для запроса данных, но медленнее для вставки. – ewernli

2

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

  1. Таким образом, вы можете использовать тот факт, данных в ВТКЕЕ Лифсе сортируются;

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

PS только что проверил наш сервер MySQL: для 20GB индексы таблиц взять 10GB пространства :)

0

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

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

+0

Я думал, что это зависит от того, сколько индексов проиндексировано. Например, если таблица содержит 30 строк, но только 2 доступны для поиска, вам потребуется только 2 b-дерева для этих конкретных строк. Вот почему важно ** не ** индексировать строки, которые не будут использоваться для поиска. –

+0

@Evan: Я не уверен, что я следую ... вы имели в виду «зависит от того, сколько индексов индексировано»? –

+0

Да ... Я сказал, что столбцы не были;) –