Физическое хранение данных в Access 2007 - PullRequest
1 голос
/ 21 марта 2010

Я пытался оценить размер таблицы Access с определенным количеством записей.

Она имеет 4 длинных (4 байта каждая) и валюту (8 байтов).

Теоретически: 1 Record = 24 bytes, 500,000 = ~11.5MB

Однако файл accdb (даже после сжатия) увеличивается почти на 30 МБ (~ 61 байт на запись).Несколько дополнительных байтов для заполнения не были бы такими плохими, но 2.5X кажется немного чрезмерным - даже для Microsoft bloat.

Что с расхождением?Четыре длинных являются составными ключами, это имеет значение?

1 Ответ

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

Это результат моих тестов, проведенных с MDB A2003, а не ACCDB A2007:

      98,304 IndexTestEmpty.mdb
     131,072 IndexTestNoIndexesNoData.mdb
  11,223,040 IndexTestNoIndexes.mdb
  15,425,536 IndexTestPK.mdb
  19,644,416 IndexTestPKIndexes1.mdb
  23,838,720 IndexTestPKIndexes2.mdb
  24,424,448 IndexTestPKCompound.mdb
  28,041,216 IndexTestPKIndexes3.mdb
  28,655,616 IndexTestPKCompoundIndexes1.mdb
  32,849,920 IndexTestPKCompoundIndexes2.mdb
  37,040,128 IndexTestPKCompoundIndexes3.mdb

Имена должны быть довольно понятны, я думаю. Я использовал запрос на добавление с помощью Rnd (), чтобы добавить 524 288 записей поддельных данных, что сделало файл 11 МБ. Все индексы, которые я создал для других полей, были неуникальными. Но если вы видите, что составной 4-колоночный индекс увеличил размер с 11 МБ (без индексов) до более чем 24 МБ. Размер PK в первом столбце увеличился только с 11 МБ до 15,4 МБ (конечно, с использованием поддельных МБ, т. Е. Как производителей жестких дисков).

Обратите внимание, как каждый индекс с одним столбцом добавляет примерно 4 МБ к размеру файла. Если учесть, что 4 столбца без индексов составляли 11 МБ, то, исходя из моего комментария выше, это кажется правильным, то есть каждый индекс должен увеличивать размер файла примерно на объем данных в индексируемом поле. Я удивлен, что кластерный индекс сделал это тоже - я думал, что кластерный индекс будет использовать меньше места, но это не так.

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

Теперь я не внимательно прочитал ваш вопрос и пропустил поле Валюта, но если я добавлю его в неиндексированную таблицу и таблицу с составным индексом и заполню ее случайными данными, я получу следующее:

      98,304 IndexTestEmpty.mdb
     131,072 IndexTestNoIndexesNoData.mdb
  11,223,040 IndexTestNoIndexes.mdb
  15,425,536 IndexTestPK.mdb
  15,425,536 IndexTestIndexUnique2.mdb
  15,425,536 IndexTestIndexUnique1.mdb
  15,482,880 IndexTestNoIndexes+Currency.mdb
  19,644,416 IndexTestPKIndexes1.mdb
  23,838,720 IndexTestPKIndexes2.mdb
  24,424,448 IndexTestPKCompound.mdb
  28,041,216 IndexTestPKIndexes3.mdb
  28,655,616 IndexTestPKCompoundIndexes1.mdb
  28,692,480 IndexTestPKCompound+Currency.mdb
  32,849,920 IndexTestPKCompoundIndexes2.mdb
  37,040,128 IndexTestPKCompoundIndexes3.mdb

Точки сравнения:

  11,223,040 IndexTestNoIndexes.mdb
  15,482,880 IndexTestNoIndexes+Currency.mdb
  24,424,448 IndexTestPKCompound.mdb
  28,692,480 IndexTestPKCompound+Currency.mdb

Итак, поле валюты добавило еще 4,5 МБ, а его индекс добавил еще 4 МБ. И если я добавлю неуникальные индексы во 2-е, 3-е и 4-е длинные поля, база данных 41 338 832 и увеличится в размере чуть менее 12 МБ (или ~ 4 МБ на дополнительный индекс).

Итак, это в основном копирует ваши результаты, нет? И у меня получился файл одинакового размера, грубо говоря.

Ответом на ваш вопрос является ИНДЕКСЫ, хотя очевидно, что в формате ACCDB A2007 явно больше служебной информации, поскольку я наблюдал увеличение размера только на 20 МБ, а не на 30 МБ.

Одна вещь, которую я заметил, состояла в том, что я мог реализовать индекс, который увеличил бы файл, затем удалил бы индекс и сжал его, и он вернул бы точно такой же размер файла, как и раньше, так что вы должны иметь возможность возьмите одну копию вашей базы данных и поэкспериментируйте с тем, как удаление индексов влияет на размер вашего файла.

...