【问题标题】:converting clustered index into non-clustered index?将聚集索引转换为非聚集索引?
【发布时间】:2011-04-05 11:31:09
【问题描述】:

是否可以将聚集索引转换为非聚集索引或 非聚集索引到 sql server 2005 中的聚集索引。

请将此查询转换为聚集索引:

create index index1 on mytable(firstcolumn)

请将此查询转换为非聚集索引:

create clustered index clusindex1 on mytable(cluscolumn)

【问题讨论】:

    标签: sql sql-server clustered-index non-clustered-index


    【解决方案1】:

    我还想知道是否可以将聚集索引转换(更改)为非聚集索引。我不相信这可以做到。必须首先删除现有的聚集索引,然后必须创建新的非聚集索引(可能与聚集索引同名)。将非聚集索引转换为聚集索引也是如此。

    我不知道您为什么要求转换“查询”,但@Tahbaza 是正确的,因为您在问题中包含的代码并不是真正的查询。它们是用于更改“数据定义”(即数据库的架构 [结构])的 T-SQL 语句。

    【讨论】:

      【解决方案2】:

      它的意义远不止眼前所见

      创建聚集索引

      drop index mytable.clusindex1 
      go
      
      create clustered index clusindex1 on mytable(cluscolumn)
      

      创建非聚集索引

      drop index mytable.clusindex1 
      go
      
      create index clusindex1 on mytable(cluscolumn) --non clustered is default
      

      话虽如此,每个表只能有一个聚集索引,所以如果你尝试删除一个索引并将其重新创建为聚集索引,如果你已经有一个聚集索引,它将失败。每当您删除聚集索引时,所有非聚集索引也将被删除并重新创建指向堆,然后在您创建聚集索引时再次删除并重新创建,现在指向聚集索引(查找 WITH DROP_EXISTING 子句)

      在开始删除和重新创建索引之前,我会说在 Books On Line 中查找索引是如何工作的

      【讨论】:

      • 如果添加一个包含所有列的索引(无论是在索引中,还是作为包含的列),这与第二个聚集索引基本相同
      • 如果你的表超过 900 字节宽或者你的表中有超过 16 列,这将不起作用
      • AFAIK 最多可以包含 1023 个任意宽度的列。
      【解决方案3】:

      那些不是查询;它们是 DDL 命令。 根据需要删除并重新创建索引,如下所示:

      drop index mytable.index1
      go
      
      create nonclustered index index1 on mytable (firstcolumn asc)
      go
      

      【讨论】:

        猜你喜欢
        • 2013-08-07
        • 2021-01-14
        • 1970-01-01
        • 2020-08-04
        • 2016-01-05
        • 2021-09-07
        • 1970-01-01
        • 2014-08-27
        相关资源
        最近更新 更多