zoukankan      html  css  js  c++  java
  • 在SQL Server里禁用聚集索引——真的好么?

    有人问了我一个最有意思的问题:“你能禁用聚集索引么?

    对这个问题,我先是吓了一跳,因为我从未想过禁用聚集索引,因为聚集索引代表表数据,对这个最有趣问题,我立即答道:“我认为可以,但是...

    好吧,我们现在来讨论下“但是”。你禁用聚集索引,但我真的不知道SQL Server会如何反应,因此我们来试验下。

    (以下代码运行在AdventureWorks2008R2数据库)

    1 -- Let's disable a Clustered Index
    2 ALTER INDEX PK_Person_BusinessEntityID ON Person.Person DISABLE
    3 GO

    哈!语句还是可以正常执行的!但是你收到很多不同的外键约束也被禁用的警告。

    好,我们已经禁用了表的聚集索引,但我们也有效的禁用了表本身。我们对禁用的聚集索引运行一个简单的SELECT语句。

    1 -- Let's run a SELECT statement against the disabled Clustered Index
    2 SELECT * FROM Person.Person
    3 GO

    这下玩完了!!!查询处理器无法生成计划,我们弄坏了我们的SQL语句。

    当你开始考虑它的时候,很能想到这是有道理的:我们禁用了聚集索引,也禁用了表本身!但这不应该真的有关系,因为表上有非聚集索引,也可以作为我们获取数据的路径。

    我们再想下。我们是否可以通过非聚集索引来访问表数据?理论上是可以的,只要选择的非聚集索引是覆盖非聚集索引。如果你通过从聚集索引的书签查找来请求一些其它列,你还是会有大问题,因为聚集索引已经禁用。因此我们来通过查询sys.index来看下非聚集索引的状态:

    1 SELECT object_id , name ,index_id ,type ,type_desc , is_disabled  FROM sys.indexes WHERE object_id=OBJECT_ID('Person.Person')

    哇!我们所有的的非聚集索引也被禁用了!现在根本没有方法访问我们的数据了。这是完全有道理的,因为不然的话会引入需要书签查找的巨大问题。现在我们通过禁用聚集索引已经完全把表下线了!

    怎么恢复表在线呢?简单:我们需要重建我们的聚集索引:

    1 -- Let's rebuild the Clustered Index
    2 ALTER INDEX PK_Person_BusinessEntityID ON Person.Person REBUILD
    3 GO

    很简单,是不是?但当我们再次查询sys.index时,我们会看到我们的非聚集索引“还是禁用的”

    因此我们“也要”重建我们的非聚集索引,让它们恢复在线。

    教训:绝不禁用表的聚集索引!

    感谢关注!

    原文链接:

    http://www.sqlpassion.at/archive/2016/04/11/disabling-clustered-indexes-in-sql-server-a-really-good-idea/

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/woodytu/p/5381341.html
Copyright © 2011-2022 走看看