sqlserver索引重建和索引重組的區別和操作方法
ALTER INDEX REORGANIZE重新組織索引使用的系統資源最少,並且是聯機操作。也就是說,不保留長期阻塞性表鎖,且對基礎表的查詢或更新可以在ALTER INDEX REORGANIZE事務處理期間繼續進行。
ALTER INDEX REBUILD重新生成索引會刪除並重新建立索引。這可以聯機完成,也可以離線完成,重新生成索引聯機執行(ON),則索引操作期間可以用此表中的資料進行查詢和修改資料。預設為OFF。
重建表上的所有索引
alter index all on table_name rebuild with (>
重建表上的某個索引
alter index index_name on table_name rebuild with (>
重新組織表上的所有索引
alter index all on table_name reorganize
重新組織表上的某個索引
alter index index_name on table_name reorganize
總結:
1、sqlserve建議使用ALTER INDEX語句來重建或重組索引,已經不推薦使用DBCC INDEXDEFRAG、DBCC DBREINDEX
2、重新組織索引是線上重整Index,不會對Table鎖定,重新生成索引會對Table進行鎖定,當然重新生成索引期間加上>
3、重新組織索引的100%進度可以透過sys.dm_exec_requests的欄位percent_complete來看,重新生成索引無法透過該方法來看
DBCC INDEXDEFRAG
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , { index_name | index_id } [ , { partition_number | 0 } ] ]
)
[ WITH NO_INFOMSGS ]
比如DBCC INDEXDEFRAG(DB1, TABLE1, INDEX1) WITH NO_INFOMSGS
database_name | database_id | 0
包含要進行碎片整理的索引的資料庫。 如果指定 0,則使用當前資料庫。
table_name | table_id | view_name | view_id
包含要進行碎片整理的索引的表或檢視。
index_name | index_id
要進行碎片整理的索引的名稱或 ID。 如果未指定,該語句將針對指定表或檢視的所有索引進行碎片整理。
partition_number | 0
要進行碎片整理的索引的分割槽號。 如果未指定或指定 0,該語句將對指定索引的所有分割槽進行碎片整理。
DBCC INDEXDEFRAG 對索引的葉級進行碎片整理,以便頁的物理順序與葉節點從左到右的邏輯順序相匹配,因此可提高索引掃描效能。
與 DBCC DBREINDEX(或通常的索引生成操作)不同,DBCC INDEXDEFRAG 是聯機操作。 它不長期保持鎖。 因此,DBCC INDEXDEFRAG 不會阻塞執行查詢或更新。 因為碎片整理所需的時間與碎片整理的級別相關,若索引的碎片相對較少,則該索引的碎片整理速度比生成一個新索引要快。 對碎片太多的索引進行整理可能要比重建索引花更多的時間。
DBCC DBREINDEX (table_name[ , index_name [ , fillfactor ] ]) [ WITH NO_INFOMSGS ]
比如DBCC DBREINDEX(TABLE1, '', 0)
table_name
包含要重新生成的指定索引的表的名稱。
index_name
要重新生成的索引名。 索引名稱必須符合識別符號規則。 如果已指定 index_name,則必須指定 table_name 。 如果未指定 index_name 或者該值為“ ”,則重新生成表的所有索引 。
fillfactor
在建立或重新生成索引時,每個索引頁上用於儲存資料的空間的百分比。 建立索引後,fillfactor 將替換填充因子,從而成為該索引以及重新生成的任何其他非聚集索引(因為重新生成了聚集索引)的新預設值 。
當 fillfactor 為 0 時,DBCC DBREINDEX 將使用上次為索引指定的填充因子值 。 該值儲存在 sys.indexes 目錄檢視中 。
如果已指定 fillfactor,則必須指定 index_name 。 如果未指定 fillfactor,則使用預設填充因子 100 。
DBCC DBREINDEX 重新生成表的一個索引或為表定義的所有索引。 透過允許動態重新生成索引,可以重新生成強制 PRIMARY KEY 或 UNIQUE 約束的索引,而不必刪除並重新建立這些約束。 這意味著無需瞭解表的結構或其約束,即可重新生成索引。 這可能在將資料大容量複製到表中以後發生。
DBCC DBREINDEX 可以在一條語句中重新生成表的所有索引。 這要比對多條 DROP INDEX 和 CREATE INDEX 語句進行編碼更容易。 由於這項工作是透過一條語句執行的,因此 DBCC DBREINDEX 自動成為原子性的,而單個 DROP INDEX 和 CREATE INDEX 語句則必須包含在事務中才能成為原子性的。 此外,DBCC DBREINDEX 提供了比單個 DROP INDEX 和 CREATE INDEX 語句更多的最佳化效能。
與 DBCC INDEXDEFRAG 或具有 REORGANIZE 選項的 ALTER INDEX 不同,DBCC DBREINDEX 是一個離線操作。 如果重新生成了非聚集索引,則在該操作的持續時間內,相關表持有共享鎖。 這可以禁止對錶進行修改。 如果重新生成了聚集索引,則持有排他表鎖。 這可以禁止任何表訪問,因此可以有效地使表離線。 為了執行聯機索引重新生成,或控制索引重新生成操作期間的並行度,可使用具有 ONLINE 選項的 ALTER INDEX REBUILD 語句。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2656646/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 主鍵索引 (聚集索引) 和普通索引 (輔助索引) 的區別索引
- SQLServer索引優化(3):對於建組合索引的要求SQLServer索引優化
- Sqlserver表和索引壓縮SQLServer索引
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- mysql索引型別Normal,Unique,Full Text區別以及索引方法Btree,Hash的區別MySql索引型別ORM
- SQLServer索引優化(2):對於索引中include的理解SQLServer索引優化
- 方法重置和重寫的區別
- 過載和重寫的區別
- HugeGraph之索引重建和刪除索引
- mssql sqlserver 索引專題SQLServer索引
- phoenix全域性索引和本地索引 概述,使用場景,區別等詳解索引
- 聚簇索引和非聚簇索引到底有什麼區別?索引
- (1)掌握SqlServer索引的基本概念SQLServer索引
- mysql組合索引,abc索引命中MySql索引
- 索引與null(二):組合索引索引Null
- Mysql InnoDB B+樹索引和雜湊索引的區別? MongoDB 為什麼使用B-樹?MySql索引MongoDB
- 10.int和Integer的區別(重點)
- SQLServer索引優化(1):對於有order by欄位的建索引策略SQLServer索引優化
- mongodb建立索引和刪除索引和背景索引backgroundMongoDB索引
- indexedDB 索引與primarykey主鍵區別Index索引
- mysql的組合索引MySql索引
- Sqlserver自動查詢缺失索引及拼出建立索引的語句的指令碼SQLServer索引指令碼
- Python Numpy 切片和索引(高階索引、布林索引、花式索引)Python索引
- MySQL 字串索引和字首索引MySql字串索引
- MySQL的索引型別和實現原理MySql索引型別
- 唯一索引和普通索引的選擇索引
- 淺析InnoDB引擎的索引和索引原理索引
- MySQL索引的型別MySql索引型別
- SQLserver-MySQL的區別和用法ServerMySql
- 【SqlServer】管理全文索引(FULL TEXT INDEX)SQLServer索引Index
- SQLSERVER 的主鍵索引真的是物理有序嗎?SQLServer索引
- MySQL 唯一索引和普通索引MySql索引
- 幽默:重建模、重建和重構
- 索引設計(組合索引適用場景)索引
- (2) SqlServer表與索引的結構的補充SQLServer索引
- Mysql RC/RR隔離原理和區別 不可重複讀和可重複讀MySql
- 使用Elasticsearch的動態索引和索引優化Elasticsearch索引優化
- oracle 索引和不走索引的幾種形式Oracle索引