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



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



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))


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

762   3  

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

    Ничего не найдено.