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