Предположим, у вас есть одна массивная таблица с тремя столбцами, как показано ниже:
[id] INT NOT NULL,
[date] SMALLDATETIME NOT NULL,
[sales] FLOAT NULL
Также предположим, что вы ограничены одним физическим диском и одной файловой группой (ПЕРВИЧНАЯ). Вы ожидаете, что в этой таблице будут храниться более 10 000 000 идентификаторов на 100 дат (легко 1B + записи).
Как и во многих сценариях хранилищ данных, данные обычно растут последовательно по дате (т. Е. Каждый раз, когда вы выполняете загрузку данных, вы будете вставлять новые даты и, возможно, обновлять некоторые из более поздних дат данных). Для аналитических целей данные часто запрашиваются и агрегируются для случайного набора ~ 10000 идентификаторов, который будет указан через соединение с другой таблицей. Часто в этих запросах не указываются диапазоны дат и не задаются очень широкие диапазоны дат, что приводит меня к моему вопросу: каков наилучший способ индексации / разбиения этой таблицы?
Я думал об этом некоторое время, но застрял с противоречивыми решениями:
Опция # 1: Поскольку данные будут загружаться последовательно по дате, определите кластерный индекс (и первичный ключ) как [дата], [идентификатор]. Также создайте функцию / схему разделения «скользящего окна» на дату, позволяющую быстро перемещать новые данные в / из таблицы. Потенциально создайте некластеризованный индекс по идентификатору, чтобы помочь с запросами.
Ожидаемый результат № 1: Эта установка будет очень быстрой для целей загрузки данных, но неоптимальной, когда речь идет о аналитическом чтении, как, в худшем случае (без ограничения по датам, не повезло набор идентификаторов запрашивается), 100% страниц данных могут быть прочитаны.
Вариант № 2: Поскольку данные будут запрашиваться только для небольшого подмножества идентификаторов за один раз, определите кластерный индекс (и первичный ключ) как [id], [date]. Не беспокойтесь о создании секционированной таблицы.
Ожидаемый результат № 2: Ожидаемый огромный удар по производительности при загрузке данных, поскольку мы больше не можем быстро ограничивать по дате. Ожидаемый огромный выигрыш в производительности, когда речь заходит о моих аналитических запросах, так как это минимизирует количество прочитанных страниц данных.
Вариант № 3: Кластеризация (и первичный ключ) следующим образом: [id], [date]; функция / схема разбиения «скользящее окно» на дату.
Ожидаемый результат № 3: Не уверен, чего ожидать. Учитывая, что первый столбец в кластеризованном индексе - это [id] и, таким образом (насколько я понимаю), данные упорядочены по ID, я ожидаю хорошей производительности от моих аналитических запросов. Однако данные разбиты по дате, что противоречит определению кластеризованного индекса (но все равно выравнивается, поскольку дата является частью индекса). Я не нашел много документации, в которой говорилось бы об этом сценарии и о том, какие преимущества от производительности я могу получить от этого, что подводит меня к моему последнему бонусному вопросу:
Если я создаю таблицу в одной файловой группе на одном диске с кластеризованным индексом в одном столбце, есть ли какое-либо преимущество (кроме переключения разделов при загрузке данных), которое дает определение раздела в том же столбце?