Эффективное добавление столбца в SQL Server - PullRequest
1 голос
/ 16 апреля 2009

Я хочу добавить целочисленный столбец в таблицу с большим количеством строк и множеством индексов (это таблица фактов хранилища данных).

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

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

Так что я должен удалить все индексы перед добавлением столбца, а затем воссоздать их все. Или есть более простой способ сделать это?

Также я не очень понимаю, почему добавление столбца, который можно обнулять, происходит намного быстрее. Почему это не связано с перезаписью записей с дополнительным битом Is Null, перевернутым для каждой строки.

Ответы [ 3 ]

4 голосов
/ 16 апреля 2009

Это потребует обновления кластеризованного индекса, да - это IS данные таблицы, в конце концов.

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

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

Марк

0 голосов
/ 16 апреля 2009

"Кроме того, я не очень понимаю, почему добавление столбца, который может содержать значение NULL, происходит намного быстрее. Почему это не связано с перезаписью записей с дополнительным битом Is Null, перевернутым для каждой строки."

Добавление обнуляемого столбца просто меняет определение таблицы. Отдельные записи не затрагиваются.

0 голосов
/ 16 апреля 2009

SQL Server - это база данных, ориентированная на строки. Это в отличие от базы данных, ориентированной на столбцы. Это означает, что в SQL Server все данные для данной строки хранятся вместе на диске. Давайте рассмотрим пример:

Допустим, у вас есть таблица Customer с 3 столбцами: FirstName, MiddleInitial и LastName. Затем, скажем, у вас есть 3 записи в этой таблице для Джаббы Т. Хатта, Денниса Т. Менаса и Джорджа Буша-младшего.

В базе данных, ориентированной на строки (например, SQL Server), записи будут храниться на диске следующим образом:

Джабба, Т, Хатт; Деннис, T, Menace; Джордж, W, Буш;

Напротив, база данных, ориентированная на столбцы, будет хранить записи на диске следующим образом:

Джабба, Деннис, Джордж; Т, Т, Ш; Угроза Хатта, Буш;

Где столбцы сгруппированы вместо строк.

Теперь, когда вы собираетесь добавить столбец в таблицу в базе данных, ориентированной на строки (например, SQL Server), новые данные для каждого столбца должны быть вставлены рядом с существующими строками, сдвигая строки, требующие большого количества операции чтения / записи. Итак, если бы вы вставили новый столбец для префикса клиента, который по умолчанию равен «Mr», вы получите следующее:

Мистер Джабба, Т, Хатт; Мистер Деннис, T, Menace; Мистер Джордж, W, Буш;

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

Конечно, это упрощение того, что на самом деле происходит на диске. Есть и другие вещи, которые необходимо учитывать при работе с индексами, страницами и т. Д. Но это должно помочь вам получить представление.

Для пояснения Я вовсе не предлагаю вам перейти на базу данных, ориентированную на столбцы, я просто поместил эту информацию туда, чтобы помочь объяснить, что означают строки, ориентированные.

...