国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL Server誤區30日談 第29天 有關堆碎片的誤區

2024-08-31 00:56:53
字體:
來源:轉載
供稿:網友
誤區 #29:可以通過對堆建聚集索引再DROP后進行堆上的碎片整理
Nooooooooooooo!!!

對堆建聚集索引再DROP在我看來是除了收縮數據庫之外最2的事了。
如果你通過sys.dm_db_index_physical_stats(或是老版本的DBCC SHOWCONTIG)看到堆上有碎片,絕對不要通過建立聚集索引再刪除聚集索引來整理堆碎片。好的做法應該是建立聚集索引之后不再刪除,已經有非常多的資料闡述如何選擇一個理想的聚集索引鍵--窄,很少變動,唯一,自增。Kimberly有一篇文章對此做了一個總結:Ever-increasing clustering key - the Clustered Index Debate..........again!(注意,是基于SQL Server 2005版本),對此我也有一個例子:An example of a nasty cluster key。
你也可以在SQL Server 2008中通過ALTER TABLE ... REBUILD來清除堆碎片,但這個做法和建立聚集索引后再刪除同樣邪惡。
如果你想問為什么我對此甚有成見?好吧,那我解釋一下:非聚集索引中每一行都會指向一個RID或是聚集索引鍵的鏈接(詳情請看:What Happens if I Drop a Clustered Index?),這個鏈接會以下面兩種方式之一出現:
  • 如果非聚集索引所在的表是堆,那么這個鏈接就是一個RID。
  • 如果非聚集索引所在的表是聚集索引,那么這個鏈接就是聚集索引鍵。
    如果你希望對此有更多了解,請看文章底部的鏈接。
    因此不難看出,如果你希望將堆變為聚集索引,那么非聚集索引的所有RID就失效了,因此所有的非聚集索引都需要被重建。同樣,如果刪除聚集索引鍵,那么所有非聚集索引上存儲的聚集索引鍵都會失效,因此也需要重建所有的非聚集索引。
    簡單點說,如果你建立再刪除聚集索引后,所有的非聚集索引都會被重建兩次。
    如果你使用SQL Server 2008的ALTER TABLE ... REBUILD來整理堆碎片,那么同樣也需要重建所有的非聚集索引,因為所有的RID都會變動。
    那么,如果對于“重建”聚集索引呢?這取決于SQL Server的版本以及你是進行rebuild索引亦或是改變索引。一個常見的誤區是對表進行分區將會改變聚集索引鍵,但事實上不會。對于那些會引起非聚集索引重建的操作,請看如下列表:Indexes From Every Angle: What happens to non-clustered indexes when the table structure is changed?。
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 庆云县| 都匀市| 晋城| 茂名市| 临夏市| 佳木斯市| 兴安县| 安溪县| 洛宁县| 寿宁县| 安塞县| 山东省| 图木舒克市| 汾西县| 县级市| 阳江市| 锡林浩特市| 车险| 如皋市| 肥城市| 西平县| 绥德县| 阜新| 望城县| 临泉县| 巨鹿县| 偏关县| 客服| 益阳市| 宁安市| 霞浦县| 西安市| 昭觉县| 南安市| 金阳县| 杂多县| 黔江区| 平舆县| 阿巴嘎旗| 湛江市| 抚州市|