Подтвердить что ты не робот

Почему и когда следует использовать SPARSE COLUMN? (SQL SERVER 2008)

После ознакомления с некоторыми учебными пособиями по новой функции SQL Server 2008 "SPARSE COLUMN" я обнаружил, что она не занимает места, если значение столбца равно 0 или NULL, но при наличии значения оно занимает в 4 раза больше обычного пространства ( не разреженный) столбец содержит.

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

Также из любопытства, как не зарезервировать пространство, когда столбец определен как разреженный столбец (я имею в виду, какова внутренняя реализация для этого?)

4b9b3361

Ответ 1

В разреженном столбце не используется 4x объем пространства для хранения значения, он использует (фиксированный) 4 дополнительных байта за ненулевое значение. (Как вы уже сказали, значение NULL занимает 0 пробелов.)

  • Таким образом, ненулевое значение, хранящееся в столбце бит, будет 1 бит + 4 байта = 4,125 байт. Но если 99% из них NULL, это все еще чистая экономия.

  • Не пустое значение, хранящееся в столбце GUID (UniqueIdentifier), равно 16 байтам + 4 байта = 20 байтов. Таким образом, если только 50% из них являются NULL, это все еще чистая экономия.

Таким образом, "ожидаемая экономия" сильно зависит от того, о каком столбце мы говорим, и о вашей оценке того, какое отношение будет равным null vs non-null. Значения столбцов переменной ширины (varchars), вероятно, немного сложнее предсказать точно.

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

Итак, когда вы должны использовать разреженную колонку? Когда вы ожидаете, что значительная часть строк будет иметь значение NULL. Некоторые примеры, которые приходят на ум:

  • A Дата возврата "в таблице заказов. Вы надеетесь, что очень небольшой процент продаж приведет к возврату продуктов.
  • A 4-й адрес "в таблице адресов. Большинство почтовых адресов, даже если вам нужно название отдела и" Уход", возможно, не нужны 4 отдельных строки.
  • A Суффикс "в таблице клиентов. У довольно низкого процента людей есть" младший ", или" III "или" Esquire" после их имени.

Ответ 2

  • Сохранение нуля в разреженном столбце не занимает места вообще.

  • Для любого внешнего приложения столбец будет вести себя одинаково

  • Разреженные столбцы очень хорошо работают с отфильтрованными индексами, так как вам нужно только создать индекс для обработки непустых атрибутов в столбце.

  • Вы можете создать столбец, установленный над разреженными столбцами, который возвращает клип xml всех ненулевых данных из столбцов, охватываемых множеством. Набор столбцов ведет себя как сам столбец. Примечание. У вас может быть только один столбец для каждой таблицы.

  • Смена данных и репликация транзакций работают, но не функция колонок.

Downsides

  • Если в разреженном столбце есть данные, он будет принимать еще 4 байта, чем обычный столбец, например. даже бит (обычно 0,125 байта) составляет 4,255 байта, а уникальный идентификатор увеличивается от 16 до 20 байтов.

  • Не все типы данных могут быть разрежены: текст, ntext, изображение, метка времени, определяемый пользователем тип данных, геометрия или география или varbinray (max) с атрибутом FILESTREAM не могут быть разрежены. (Changed17/5/2009 благодарит Alex за обнаружение опечатки)

  • вычисленные столбцы не могут быть разреженными (хотя разреженные столбцы могут принимать участие в вычислении в другом вычисленном столбце)

  • Вы не можете применять правила или значения по умолчанию.

  • Разреженные столбцы не могут составлять часть кластерного индекса. Если вам нужно это сделать, используйте вычисляемый столбец на основе разреженного столбца и создайте кластерный индекс на этом (какой тип побеждает объект).

  • Слияние репликации не работает.

  • Сжатие данных не работает.

  • Доступ (чтение и запись) к разреженным столбцам дороже, но я не смог найти никаких точных цифр.

Ссылка

Ответ 3

Вы читаете это неправильно - это никогда не занимает 4x места.

В частности, он говорит 4 * (4 байта, см. сноску), а не 4x (умножить на 4). Единственный случай, когда это ровно 4x, является char (4), что позволит сэкономить, если NULL существуют более 64% времени.

"* Длина равна среднему числу данных, содержащихся в типе, плюс 2 или 4 байта."

Ответ 4

| datetime NULL      | datetime SPARSE NULL | datetime SPARSE NULL |
|--------------------|----------------------|----------------------|
| 20171213 (8 bytes) | 20171213 (12 bytes)  | 20171213 (12 bytes)  |
| NULL     (8 bytes) | 20171213 (12 bytes)  | 20171213 (12 bytes)  |
| 20171213 (8 bytes) | NULL      (0 bytes)  | NULL      (0 bytes)  |
| NULL     (8 bytes) | NULL      (0 bytes)  | NULL      (0 bytes)  |

Вы теряете 4 байта не один раз за строку; но для каждой ячейки в строке, которая не равна нулю.

Ответ 5

От SQL SERVER - 2008 - Введение в столбцы SPARSE - Часть 2 Pinal Dave:

Все столбцы SPARSE хранятся как один столбец XML в базе данных. Позволь нам см. некоторые преимущества и недостатки столбца SPARSE.

Преимущества столбца SPARSE:

  • Операторы INSERT, UPDATE и DELETE могут ссылаться на разреженные столбцы по имени. Столбец SPARSE может работать как один столбец XML.

  • Столбец SPARSE может использовать отфильтрованные индексы, где данные заполняются в строке.

  • Столбец SPARSE сохраняет много пространства базы данных, когда в базе данных есть нулевые или нулевые значения.

Недостатки столбца SPARSE:

  • В столбце SPARSE нет свойства IDENTITY или ROWGUIDCOL.

  • Столбец SPARSE не может быть применен к тексту, ntext, image, timestamp, геометрии, географии или определенным пользователем типам данных.

  • Столбец SPARSE не может иметь значение по умолчанию или правило или вычисленный столбец.

  • Кластерный индекс или уникальный индекс первичного ключа не могут применяться столбец SPARSE. Столбец SPARSE не может быть частью кластерного индексного ключа.

  • Таблица, содержащая столбец SPARSE, может иметь максимальный размер 8018 байт вместо обычных 8060 байт. Операция таблицы, которая включает SPARSE столбец принимает производительность, попадающую в стандартный столбец.