Требуется / рекомендуется ли столбец Id в таблице фактов в данном сценарии
Я использую таблицу фактов со следующей структурой в SQL Server 2012:
CREATE TABLE [dbo].[factTable] (
[Id] BIGINT IDENTITY (1, 1) NOT NULL,
[Date] DATE NOT NULL,
[MinuteNumber] SMALLINT NOT NULL,
[CityId] INT NOT NULL, /* Foreign key to dimCity */
[Value] DECIMAL(12, 4) NULL
)
У меня есть кластерный индекс на Date
столбец с коэффициентом заполнения 100. Данные, вставленные в эту таблицу, почти всегда располагаются в порядке возрастания Date
а также MinuteNumber
,
Я хочу знать - если в данном сценарии необходимо наличие столбца Id? Есть ли какие-либо последствия для производительности? Или я могу безопасно устранить это.
Я также хочу знать, если кластерный индекс на
Date
достаточно столбца (будет много записей с одинаковой датой, даже с одинаковой датой и одинаковым номером минуты) или лучше иметь кластерный индекс, объединяющий несколько столбцов; и каковы последствия для производительности и хранилища для любого из этих подходов?
Я новичок в этом, и любая помощь будет высоко оценена.
2 ответа
В вашем случае я бы, вероятно, создал бы некластеризованный первичный ключ в столбце идентификаторов, чтобы упростить управление отношениями FK и повысить производительность.
Кластерный ключ будет на date
столбец, чтобы обеспечить более быстрый диапазон запросов. date
Столбец также удовлетворяет трем основным требованиям для кластеризованного индекса: он узкий (чтобы уменьшить размер некластеризованных индексов), он стабилен (потому что изменение столбца CI также означает перестановку индексов NC, этого следует избегать), и он увеличивается (чтобы избежать плохого разбиения страницы, не в конце таблицы).
WRT неуникальный кластеризованный индекс, SQL Server добавит к нему уникальные данные, если они не уникальны.
Кластерный индекс должен быть уникальным, поэтому, если вы решите использовать DATE, вам понадобится другой столбец (столбцы), которые вместе всегда будут уникальными. Кластерный индекс также физически управляет порядком данных, поэтому ключ должен быть в порядке возрастания. Опять же, что-то, что, похоже, есть у вашей ДАТЫ, и вы правильно поняли.
Однако было бы хорошо узнать, сколько данных будет иметь ваша таблица и сколько некластерных индексов вы планируете использовать? Поскольку каждая конечная запись некластеризованного индекса включает указатель на кластеризованный индекс, вы вообще не хотите, чтобы ваш кластеризованный индекс был больше, чем должен быть.
По существу, преимущества простого числа автоматического объединения в качестве ключевого столбца для кластеризованного индекса состоят в том, что он эффективен с точки зрения хранения, он всегда увеличивается по порядку и имеет хорошую синергию с другими объектами и вариантами использования.
marc_s, пользователь здесь, разместил ссылку на другой сайт (ссылку), я думаю, что вы обязательно должны проверить это.
Подводя итог, можно сказать, что в большинстве случаев безопаснее всего придерживаться этого простого и просто поместить кластеризованный индекс в базовый столбец идентификаторов int / bigint, а затем использовать некластеризованные индексы для оптимизации поиска по конкретным столбцам таблицы. Это более чем достаточно для большей части времени. Не нужно усложнять ситуацию и искать 5% -ное улучшение запросов, которые выполняются более чем достаточно быстро. Итак, вопрос в том, есть ли у вас основания ожидать, что стандартное решение не сработает в вашем случае? Например, огромный объем данных (например, речь идет о масштабных строках в масштабе, превышающем несколько миллиардов), другие последствия для производительности (сложные условные объединения с другими таблицами в той же базе данных) или другие подобные вещи?