Есть ли разница в производительности между таблицей, созданной при добавлении столбцов? - PullRequest
1 голос
/ 09 февраля 2009

Быстрый вопрос, мне было любопытно, есть ли какая-либо разница между таблицей базы данных, которая была определена в одном кадре, и таблицей, к которой со временем добавляли столбцы. В какой-то степени страдает тот, у кого производительность с добавленными столбцами?

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 09 февраля 2009

Здесь есть различия поставщиков здесь. Язык SQL определяется стандартом, но детали хранения оставлены на усмотрение каждого поставщика.

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

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

2 голосов
/ 10 февраля 2009

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

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

1 голос
/ 09 февраля 2009

Это будет полностью зависеть от механизма хранения. Обычно я чувствую себя вполне комфортно с добавленными столбцами, возможно, после того, как на них накинут ОПТИМИЗАЦИОННЫЙ СТОЛ.

...