Кластеризованный индекс на временной таблице
Я пытаюсь оптимизировать процедуру, которая имеет следующий код:
CREATE TABLE #t1 (c1 int, c2 varchar(20), c3(varchar(50)...)
CREATE CLUSTERED INDEX ix_t1 ON #t1(c3) ON [PRIMARY]
Я хотел улучшить это, переместив кластеризованный индекс в объявление таблицы (более удобное кэширование), но c3 не является уникальным, поэтому это не работает:
CREATE TABLE #t1 (c1 int, c2 varchar(20), c3 varchar(50)..., UNIQUE CLUSTERED (c3))
Существует ли способ объявить кластер, который не является уникальным в объявлении временной таблицы?
3 ответов:
Нет, не существует...возможность определения кластеризации в качестве опции при создании таблиц заключается в поддержке объявления ограничений первичного ключа и уникального столбца, которые сами создают индексы. Другими словами,
CLUSTEREDв оператореCREATE TABLEуказывает, должен ли индекс, созданный ограничениемUNIQUE, быть кластеризованным или некластеризованным, что важно, поскольку таблица может иметь только один кластеризованный индекс.
Да, это возможно в 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
Это можно сделать, добавив столбец
identity, например:ВключениеCREATE TABLE #t1 (rowID int not null identity(1,1), c1 int, c2 varchar(20), c3 varchar(50), UNIQUE CLUSTERED (c3,rowID) )В индекс гарантирует, что он уникален, даже если
c3не является таковым.Вы проверяете индекс, созданный с помощью:
EXEC tempdb.dbo.sp_helpindex '#t1'
Comments