溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sqlserver索引重建和索引重組有什么區別

發布時間:2021-09-04 18:50:16 來源:億速云 閱讀:226 作者:chen 欄目:關系型數據庫

這篇文章主要介紹“sqlserver索引重建和索引重組有什么區別”,在日常操作中,相信很多人在sqlserver索引重建和索引重組有什么區別問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”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來看,重新生成索引無法通過該方法來看

https://docs.microsoft.com/zh-cn/sql/t-sql/database-console-commands/dbcc-indexdefrag-transact-sql?view=sql-server-2017

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 不會阻塞運行查詢或更新。 因為碎片整理所需的時間與碎片整理的級別相關,若索引的碎片相對較少,則該索引的碎片整理速度比生成一個新索引要快。 對碎片太多的索引進行整理可能要比重建索引花更多的時間。

https://docs.microsoft.com/zh-cn/sql/t-sql/database-console-commands/dbcc-dbreindex-transact-sql?view=sql-server-2017

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 語句。

到此,關于“sqlserver索引重建和索引重組有什么區別”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女