Давайте предположим, что у вас есть один массивный стол с тремя колоннами, как показано ниже:SQL Server - Разделенные таблицы и кластерный индекс?
[id] INT NOT NULL,
[date] SMALLDATETIME NOT NULL,
[sales] FLOAT NULL
предположить Также вы ограничены одного физического диска и одной файловой группы (PRIMARY). Вы ожидаете, что эта таблица будет продавать 10 000 000+ идентификаторов за 100 лет (легко 1Б + записи).
Как и во многих сценариях хранения данных, данные, как правило, будут расти последовательно по дате (т. Е. Каждый раз, когда вы выполняете загрузку данных, вы будете вставлять новые даты и, возможно, обновлять некоторые более поздние даты данных). В аналитических целях данные часто запрашиваются и агрегируются для случайного набора из ~ 10000 идентификаторов, которые будут указаны посредством соединения с другой таблицей. Часто эти запросы не указывают диапазоны дат или указывают очень широкие диапазоны дат, что приводит меня к моему вопросу: как лучше всего индексировать/разделять эту таблицу?
Я думал об этом некоторое время, но я застрял с противоречивыми решениями:
Вариант № 1: Как будут загружены данные последовательно по дате, определите кластерный индекс (и первичный ключ) в виде [ дата], [id]. Также создайте функцию/схему разделения «скользящего окна» в дате, что позволяет быстро перемещать новые данные в/из таблицы. Потенциально создайте некластеризованный индекс для id, чтобы помочь с запросом.
Ожидаемый результат # 1: Эта установка будет очень быстро для целей загрузки данных, но неоптимальным, когда речь идет об аналитической гласит, в худшем случае (без ограничения по датам, повезло с набором идентификаторов queried), можно прочитать 100% страниц данных.
Вариант № 2: Поскольку данные будут запрашиваться только для небольшого подмножества идентификаторов за раз, определите кластеризованный индекс (и первичный ключ) как [id], [date]. Не беспокойтесь, чтобы создать секционированную таблицу.
Ожидаемый результат №2: Ожидаемый огромный рост производительности при загрузке данных, поскольку мы не можем более быстро ограничивать дату. Ожидаемая огромная производительность, когда дело доходит до моих аналитических запросов, так как это минимизирует количество прочитанных страниц данных.
Вариант № 3: Кластерный (и первичный ключ) следующим образом: [id], [date]; «Скользящее окно», раздел/схема на дату.
Ожидаемый результат № 3: Не уверен, чего ожидать. Учитывая, что первый столбец в кластерном индексе имеет значение [id] и, следовательно, (я понимаю), данные упорядочены по идентификатору, я бы ожидал хорошей производительности из своих аналитических запросов. Однако данные разделяются по дате, что противоречит определению кластерного индекса (но все же выровнено, поскольку дата является частью индекса). Я не нашел много документации, которая говорит об этом сценарии, и что, если таковые имеются, выгоды от производительности, которые я могу получить от этого, что приводит меня к моему окончательному вопросу о бонусе:
Если я создаю таблицу в одной файловой группе на один диск с кластеризованным индексом в одном столбце, есть ли какое-либо преимущество (помимо переключения разделов при загрузке данных), которое происходит от определения раздела в том же столбце?
Ваш последний пункт интересен. Какую выгоду вы ожидаете от конвертации в числовые из float? – 2008-09-23 13:42:40
Вы можете быть более точным относительно данных, которые вы храните, а числовой тип данных - это точный номер, где поплавок является приблизительным числом. – GateKiller 2008-09-23 18:04:46