У меня есть таблица только с 4 столбцами и более 1 миллиарда строк. Предположим, что эти столбцы названы a, b, c и d. В моем приложении требуется фильтрация данных на основе (a, b, c) или (a, b). Чтобы приспособиться к этому, я создал индекс для столбцов (a, b, c) в указанном порядке. Однако это привело к удвоению размера таблицы. Я предположил, что причина в том, что столбцы a, b и c добавляются как к данным, так и к индексам. Может ли кто-нибудь предложить какие-либо решения для уменьшения размера этой таблицы?
Схема моей таблицы:
CREATE TABLE Message (
userId bigint NOT NULL,
campaignId int NOT NULL,
notificationId int NOT NULL,
isOpened bit NOT NULL
);
Мне нужно отфильтровать данные по (userId, кампанияId, уведомлениеId) и (userId, кампанияId)
Спасибо, @O.Jones! Я добавил больше информации к моему вопросу.
Предполагая, что у вас еще нет кластеризованного индекса для таблицы, создайте индекс как кластеризованный, чтобы конечные узлы индекса были строками данных. Это позволит избежать избыточного хранения ключа и включенных столбцов. Также укажите UNIQUE
, если значения уникальны, чтобы улучшить качество плана выполнения.
CREATE CLUSTERED INDEX cdx_YourTable ON dbo.YourTable(a, b, c);
Вы можете еще больше уменьшить размер с помощью сжатия PAGE или ROW, как показано ниже. Хотя это повлечет за собой дополнительные накладные расходы ЦП, затраты часто более чем компенсируются меньшим количеством операций ввода-вывода и улучшенной эффективностью буферного кэша для тех же данных.
CREATE CLUSTERED INDEX cdx_YourTable ON dbo.YourTable(a, b, c)
WITH(DATA_COMPRESSION=PAGE);
Спасибо @Dan Guzman. Я попытался применить сжатие страницы, следуя вашему предложению, и результат очень хороший.
Если вы отредактируете свой вопрос, чтобы показать нам точное определение таблицы, мы сможем помочь вам создать кластеризованный индекс @DanGuzman.