Я работаю в SQL Server 2008 R2
В рамках полной перестройки схемы я создаю таблицу, которая будет использоваться для хранения эффективности рекламной кампании по почтовому индексу по дням.Настройка таблицы, о которой я думаю, выглядит примерно так:
CREATE TABLE [dbo].[Zip_Perf_by_Day] (
[CampaignID] int NOT NULL,
[ZipCode] int NOT NULL,
[ReportDate] date NOT NULL,
[PerformanceMetric1] int NOT NULL,
[PerformanceMetric2] int NOT NULL,
[PerformanceMetric3] int NOT NULL,
and so on... )
Теперь комбинация CampaignID, ZipCode и ReportDate является идеальным естественным ключом, они однозначно идентифицируют одну сущность и не должныбыть 2 записи для одной и той же комбинации значений.Кроме того, почти все мои запросы к этой таблице будут отфильтрованы по одному или нескольким из этих трех столбцов.Однако, думая о моем кластерном индексе для этой таблицы, я сталкиваюсь с проблемой.Эти 3 столбца не увеличиваются с течением времени.ReportDate в порядке, но CampaignID и Zipcode будут повсюду при вставке строк.Я даже не могу заказать их заранее, потому что результаты поступают из разных источников в течение дня, поэтому данные для CampaignID 50000 могут быть вставлены в 10:00, а CampaignID 30000 могут быть введены в 14:00.Если я использую PK в качестве кластерного индекса, я столкнусь с проблемами фрагментации.
Поэтому я подумал, что мне нужен столбец Identity ID, назовем его PerformanceID.Я не вижу ни одного случая, когда бы я использовал PerformanceID ни в списке выбора, ни в предложении где-либо из запросов.Должен ли я использовать PerformanceID в качестве моего PK и кластеризованного индекса, а затем установить уникальные ограничения и некластеризованные индексы для CampaignID, ZipCode и ReportDate?Должен ли я сохранить эти 3 столбца в качестве моего PK и просто иметь свой кластеризованный индекс PerformanceID?(<- Это вариант, к которому я сейчас склоняюсь) Можно ли иметь слегка фрагментированный стол?Есть ли другой вариант, который я не рассмотрел?Я ищу то, что дало бы мне лучшую производительность при чтении, но не полностью ухудшило бы производительность записи. </p>
Некоторая фактическая информация об использовании.Эта таблица будет записана в пакетном режиме.Ленты поступают в разное время в течение дня, обрабатываются, и эта таблица записывается.Он будет внимательно читаться, так как здесь важна повседневная производительность.Когда я заполню эту таблицу, она должна иметь около 5 миллионов строк и будет расти со скоростью около 8 000–10 000 строк в день.