Вы путаете первичный ключ и кластерный индекс. Нет причин для того, чтобы они были одним и тем же. Вы можете иметь кластеризованный индекс на FILE_UPLOADED_DATE
и отдельный некластеризованный первичный ключ на FILE_ID
. На самом деле вы уже делаете нечто подобное для столбца DocGUID:
CREATE TABLE [dbo].[FILE](
[FILE_ID] [int] IDENTITY(1,1) NOT NULL,
[DOCUMENT] [varbinary](max) FILESTREAM NULL,
[FILE_UPLOADED_DATE] [datetime] NOT NULL,
[FILE_INT] [int] NOT NULL,
[FILE_EXTENSION] [varchar](10) NULL,
[DocGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
constraint UniqueDocGUID UNIQUE NONCLUSTERED ([DocGUID])
ON [PRIMARY])
ON DocPartScheme ([FILE_UPLOADED_DATE])
FILESTREAM_ON DocFSPartScheme;
CREATE CLUSTERED INDEX cdx_File
ON [FILE] (FILE_UPLOADED_DATE)
ON DocPartScheme ([FILE_UPLOADED_DATE])
FILESTREAM_ON DocFSPartScheme;
ALTER TABLE [dbo].[FILE]
ADD CONSTRAINT PK_File PRIMARY KEY NONCLUSTERED (FILE_ID)
ON [PRIMARY];
Однако такая конструкция приведет к невыровненным индексам, которые могут вызвать очень серьезные проблемы с производительностью, а также заблокирует все быстрые операции переключения разделов. См. Специальное руководство для секционированных индексов :
Для каждой таблицы сортировки требуется минимальный объем памяти. Когда ты
строят секционированный индекс, который выровнен с его базовой таблицей,
Таблицы сортировки создаются по одной за раз, используя меньше памяти. Однако когда
вы создаете не выровненный секционированный индекс, таблицы сортировки
построен в то же время.
В результате должно быть достаточно памяти для обработки этих
одновременные сорта. Чем больше количество разделов, тем больше памяти
требуется. Минимальный размер каждой таблицы сортировки для каждого раздела
40 страниц, по 8 килобайт на страницу. Например, неприсоединившийся
для секционированного индекса с 100 разделами требуется достаточно памяти для
последовательно сортируйте 4000 (40 * 100) страниц одновременно. Если эта память
доступно, операция сборки будет выполнена успешно, но производительность может
страдать. Если эта память недоступна, операция сборки завершится неудачей
В вашем дизайне уже есть невыровненный индекс для DocGUID, поэтому проблемы с производительностью, скорее всего, уже присутствуют. Если вы должны сохранять свои индексы выровненными, то вы должны допустить один из побочных эффектов выбора схемы секционирования: у вас больше не будет логического первичного ключа или принудительного применения уникальных ограничений, если ключ не содержит ключ секционирования.
И, наконец, нужно спросить: зачем использовать секционированную таблицу? Они всегда медленнее, чем альтернатива без разделов. Если вам не нужны быстрые операции переключения разделов для ETL (которые вы уже создаете из-за невыровненного индекса для DocGUID), в основном нет стимула использовать разделенную таблицу. (Упреждающий комментарий: кластеризованный индекс для FILE_UPLOADED_DATE гарантированно является лучшей альтернативой, чем «исключение раздела»).