在临时表上创建聚集索引

8

我正在尝试优化一个程序,其中有以下代码:

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个回答

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

1
这可以通过添加一个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'

1

不,没有...定义聚集作为表创建选项的能力的存在是为了支持声明主键和唯一列约束条件,它们本身创建索引。换句话说,在CREATE TABLE语句中的CLUSTERED指定了由UNIQUE约束条件创建的索引是否应该是聚集或非聚集的,这很重要,因为一个表只能有一个聚集索引。


感谢您的支持。通过向索引添加一列使其唯一,解决了该问题。 - David Mathis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接