Почему и Когда я должен использовать РЕДКИЙ СТОЛБЕЦ? (SQL-СЕРВЕР 2008)

Только целое число и шестнадцатеричное число непосредственно, я боюсь (ECMA 334v4):

9.4.4.2 Целочисленных литерала Целочисленные литералы используются для записи значений интервала типов, uint, долго, и ulong. Целочисленные литералы имеют две возможных формы: десятичный и шестнадцатеричный.

Для парсинга можно использовать:

int i = Convert.ToInt32("01101101", 2);
64
задан Patrick Mevzek 15 August 2019 в 00:27
поделиться

3 ответа

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

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

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

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

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

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

  • Столбец « Дата возврата заказа » в таблице заказов. Можно надеяться, что очень небольшой процент продаж приведет к возвращению товаров.
  • Строка « 4-й адрес » в таблице адресов. Для большинства почтовых адресов, даже если вам нужно название отдела и «Care Of», вероятно, не нужны 4 отдельные строки.
  • A « Суффикс » столбец в таблице клиентов. Достаточно низкий процент людей имеет «младший». или "III" или "Esquire" после их имени.
87
ответ дан 24 November 2019 в 15:53
поделиться
  • Сохранение нуля в разреженном столбце вообще не занимает места.

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

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

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

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

Недостатки

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

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

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

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

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

  • Репликация слиянием не работает.

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

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

Ссылка

23
ответ дан 24 November 2019 в 15:53
поделиться

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

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

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

4
ответ дан 24 November 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: