临时表上的聚集索引

Dav*_*rge 5 sql t-sql sql-server temp-tables clustered-index

我正在尝试优化具有如下代码的过程:

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

CREATE CLUSTERED INDEX ix_t1 ON #t1(c3) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我想通过将 CLUSTERED 索引移动到表声明中来改进它(更适合缓存),但是 c3 不是唯一的,所以这不起作用:

CREATE TABLE #t1 (c1 int, c2 varchar(20), c3 varchar(50)..., UNIQUE CLUSTERED (c3))
Run Code Online (Sandbox Code Playgroud)

有没有办法声明一个在临时表声明中不是唯一的集群?

Pet*_*ell 5

是的,在 SQL Server 2014 及更高版本中可以,在 MSDN 上创建表。从 2014 年开始,您可以在创建表语句中指定内联索引。

 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
Run Code Online (Sandbox Code Playgroud)


小智 1

不,没有……在表创建中将集群定义为选项的能力的存在是为了支持声明主键和唯一列约束,它们本身会创建索引。换句话说,CLUSTEREDCREATE TABLE语句中指定约束创建的索引UNIQUE应该是聚集索引还是非聚集索引,这一点很重要,因为一张表只能有一个聚集索引。