Почему и когда я должен использовать разреженный столбец? (SQL SERVER 2008)
пройдя через некоторые учебники по новой функции разреженного столбца SQL SERVER 2008, я обнаружил, что он не занимает места, если значение столбца равно 0 или null, но когда есть значение, оно занимает в 4 раза больше места, чем обычный(не разреженный) столбец.
Если мое понимание правильно, то почему я пойду на это во время проектирования базы данных?
И если я использую это,то в какой ситуации я буду?
также из любопытства, почему нет места вам резерв, когда столбец определяется как разреженный столбец (я имею в виду, что такое внутренняя реализация для этого)
спасибо заранее
5 ответов:
разреженный столбец не используется 4x объем пространства для хранения значения он использует (фиксированный)4 лишних байта в ненулевое значение. (Как вы уже сказали, значение NULL занимает 0 пробелов.)
таким образом, ненулевое значение хранится в немного
хранение null в разреженном столбце не занимает места вообще.
для любого внешнего приложения столбец будет вести себя одинаково
разреженные столбцы очень хорошо работают с отфильтрованными индексами, так как вы хотите создать индекс только для работы с непустыми атрибутами в столбце.
вы можете создать набор столбцов над разреженными столбцами, который возвращает XML-клип всех ненулевых данных из колонок, покрытых множеством. Набор столбцов ведет себя как сам столбец. Примечание: Вы можете иметь только один набор столбцов в таблице.
Change Data Capture и репликация транзакций работают, но не функция наборов столбцов.
минусы
Если в разреженном столбце есть данные, он займет на 4 байта больше, чем обычный столбец, например, даже бит (обычно 0,125 байта) равен 4,125 байты и уникальный идентификатор повышается с 16 байт до 20 байт.
не все типы данных могут быть разреженными: text, ntext, image, timestamp, user-defined data type, geometry, geography или varbinray (max) с атрибутом FILESTREAM не могут быть разреженными. (Changed17 / 5 / 2009 спасибо Алекс для обнаружения опечатки)
вычисляемые столбцы не могут быть разреженными (хотя разреженные столбцы могут принимать участие в вычислении в другом вычисляемом колонка)
вы не можете применять правила или иметь значения по умолчанию.
разреженные столбцы не могут быть частью кластеризованного индекса. Если вам нужно это сделать, используйте вычисляемый столбец, основанный на разреженном столбце, и создайте кластеризованный индекс на этом (какой вид побеждает объект).
репликация слиянием не работает.
сжатие данных не работает.
доступ (чтение и писать) в разреженные столбцы дороже, но я не смог найти никаких точных цифр по этому поводу.
Вы читаете это неправильно - это никогда не занимает 4x пространство.
в частности, он говорит 4 * (4 байта, см. сноску), а не 4x (умножить на 4). Единственный случай, когда это точно 4x пространство-это char(4), который будет видеть экономию, если нули существуют более 64% времени.
"*длина равна среднему значению данных, содержащихся в типе, плюс 2 или 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 байта не только один раз в строке; но и для каждой ячейки в строке, которая не является нулевой.
с SQL SERVER-2008-введение в разреженные столбцы-Часть 2 by Пинал Дэйв:
все разреженные столбцы хранятся как один столбец XML в базе данных. Позволь нам см. некоторые преимущества и недостатки разреженного столбца.
преимущества разреженного столбца:
инструкции INSERT, UPDATE и DELETE могут ссылаться на разреженные столбцы по имени. Разреженный столбец может работать как один столбец XML, а также.
разреженный столбец может использовать преимущества отфильтрованных индексов, где данные заполняются в строке.
разреженный столбец сохраняет много места в базе данных, когда в базе данных есть нулевые или нулевые значения.
недостатки разреженного столбца:
разреженный столбец не имеет свойства IDENTITY или ROWGUIDCOL.
разреженный столбец не может быть применен к тексту, ntext, изображению, метке времени, геометрии, географии или определяемым пользователем типам данных.
разреженный столбец не может иметь значение по умолчанию или правило или вычисляемый столбец.
кластеризованный индекс или уникальный индекс первичного ключа не может быть применен к разреженному столбцу. Разреженный столбец не может быть частью ключа кластеризованного индекса.
таблица, содержащая разреженный столбец, может иметь максимальный размер 8018 байт вместо обычных 8060 байт. Операция таблицы, которая включает в себя разреженные столбец принимает хит производительности по сравнению с обычным столбцом.
Comments