Кластерный индекс временной таблицы

Я пытаюсь оптимизировать процедуру с таким кодом:

CREATE TABLE #t1 (c1 int, c2 varchar(20), c3(varchar(50)...)

CREATE CLUSTERED INDEX ix_t1 ON #t1(c3) ON [PRIMARY]

Я хотел улучшить это, переместив индекс CLUSTERED в объявление таблицы (более удобный для кеширования), но c3 не уникален, поэтому это не работает:

CREATE TABLE #t1 (c1 int, c2 varchar(20), c3 varchar(50)..., UNIQUE CLUSTERED (c3))

Есть ли способ объявить кластеризованный, который не является уникальным в объявлении временной таблицы?


person David George    schedule 05.10.2011    source источник


Ответы (3)


Нет, нет ... наличие возможности определять кластеризацию в качестве опции при создании таблицы означает поддержку объявления ограничений первичного ключа и уникальных столбцов, которые сами по себе создают индексы. Другими словами, CLUSTERED в операторе CREATE TABLE указывает, должен ли индекс, созданный ограничением UNIQUE, быть кластеризованным или некластеризованным, что важно, поскольку таблица может иметь только один кластеризованный индекс.

person Wil    schedule 05.10.2011
comment
Благодарю. Решил проблему, добавив столбец в индекс, чтобы сделать его уникальным. - person David George; 05.10.2011

Да, это возможно в SQL Server 2014 и выше, Создать таблицу в MSDN. С 2014 года вы можете указывать индексы, встроенные в оператор create table.

 if object_id('tempdb..#t1') is not null drop table #t1;

CREATE TABLE #t1 (
    c1 int, 
    c2 varchar(20), 
    c3 varchar(50), 

    index [CIX_c3] CLUSTERED (c3),
    index [IX_c1] nonclustered (c1)
)

insert #t1(c3) values ('a'), ('a'), ('a')

select * from #t1
person Peter Henell    schedule 04.10.2017

Это можно сделать, добавив столбец identity, например:

CREATE TABLE #t1 (rowID int not null identity(1,1),
                     c1 int, c2 varchar(20), c3 varchar(50),
                     UNIQUE CLUSTERED (c3,rowID)
                 )

Включение rowID в индекс гарантирует его уникальность, даже если c3 нет.

Вы проверяете индекс, созданный с помощью:

EXEC tempdb.dbo.sp_helpindex '#t1'
person Greg V    schedule 04.10.2017