【问题标题】:Clustered index on temp table临时表上的聚集索引
【发布时间】:2011-12-01 14:44:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql sql-server tsql temp-tables clustered-index


    【解决方案1】:

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

    【讨论】:

    • 谢谢。通过向索引添加一列使其唯一来解决该问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      是的,在 SQL Server 2014 及更高版本中是可能的,Create table on 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-26
        • 2019-02-13
        • 2018-05-08
        • 1970-01-01
        • 2013-08-07
        • 2015-07-04
        • 2011-08-21
        相关资源
        最近更新 更多