1. 程式人生 > >第十章——維護索引(3)——通過重建索引提高效能

第十章——維護索引(3)——通過重建索引提高效能

前言:

重建一個索引只是在內部刪除並重建索引,使得碎片消失、統計資訊更新、物理順序重新排列組織。它會壓縮資料頁,按照填充因子填充適當的資料。如果有需要,也會新增新的資料頁。這些操作有利於提高資料查詢的速度,但是這個工作如果發生在大表上面,將是非常耗時耗資源的。

準備工作:

首先先要決定是否達到了重建索引的臨界值。否則,重組索引會更好。當碎片超過30%,那麼重建索引會比較好。

重建索引有兩種方式,在重建之前應該考慮使用哪種會更好:

1、 離線:離線重建索引是預設選項。它會鎖住整個表,知道重建結束,沒有人可以訪問這個表。如果表非常大,這將持續幾個小時甚至更久。但是它執行得更快,並且佔用Tempdb的資源更少。

2、 聯機:如果環境不允許離線,那麼可以使用聯機重建,但是會佔用非常多的資源,如果表資料型別為varchar(max),nvarchar(max)和text型別,將不會在聯機模式下工作。

注意:是否聯機重建索引只有開發版和企業版可用。其他版本只有離線重建。

步驟:

1、 建立測試表:

USE [AdventureWorks]
GO
 
IF EXISTS( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'[dbo].[ordDemo]')
                    AND type IN( N'U' ) )
    DROP TABLE [dbo].[ordDemo]
GO
 
CREATE TABLE [dbo].[ordDemo]
    (
      [OrderID] [int] IDENTITY(1, 1)
                      NOT NULL ,
      [OrderDate] [datetime] NULL ,
      [Amount] [money] NULL ,
      [Refno] [int] NULL
    )
ON  [PRIMARY]
 
GO


再建立一個聚集索引idx_refno:
 USE [AdventureWorks]
GO

IF EXISTS ( SELECT  *
            FROM    sys.indexes
            WHERE   object_id = OBJECT_ID(N'[dbo].[ordDemo]')
                    AND name = N'idx_refno' ) 
    DROP INDEX [idx_refno] ON [dbo].[ordDemo] WITH ( ONLINE = OFF )
GO


現在使用下面的指令碼重建索引:

 --使用聯機方式重建索引idx_refno 
ALTER INDEX [idx_refno] ON [ordDemo] REBUILD WITH (FILLFACTOR=80,ONLINE =ON)
GO

--使用離線方式重建索引idx_refno 
ALTER INDEX [idx_refno] ON [ordDemo] REBUILD WITH (FILLFACTOR=80,ONLINE =OFF)
GO

--使用離線方式重建表上所有索引:
ALTER INDEX ALL ON [ordDemo] REBUILD WITH (FILLFACTOR=80,ONLINE =OFF )
GO

--使用DROP_EXISTING 來重建索引:
CREATE CLUSTERED INDEX [idx_refno] ON [ordDemo](Refno)
WITH (DROP_EXISTING=ON ,FILLFACTOR=70,ONLINE=ON )
GO

--使用DBCC DBREINDEX重建標上所有索引:
DBCC DBREINDEX('ordDemo')
GO

--重建帶有填充因子的索引:
DBCC DBREINDEX('ordDemo','idx_refno',90)
GO



2、 注意,DBCC DBREINDEX命令將在未來版本刪除,所以不建議使用,並儘快改成其他方式實現。 

分析:

在重建索引時,會鎖住資源,直到程序完畢為止。重建會移除空白或者未使用的頁,建立新的頁,如果達到填充因子的限定,會分頁,並以B-TREE方式存放這些資料頁。

擴充資訊:

基於個人經驗,建議重建大表的索引時,把恢復模式改成大容量日誌或者簡單模式,避免日誌檔案的過度增長。但是更改恢復模式應該慎重,並在更改後立即做日誌備份。

因為重建大表索引會非常耗時,所以不要不耐煩並停止重建操作,這樣會引起一些危險的後果,並可能使得資料庫進入恢復模式。

重建索引需要有sysadmin、db_onwer或者db_ddladmin角色。

相關推薦

——維護索引3——通過重建索引提高效能

前言:重建一個索引只是在內部刪除並重建索引,使得碎片消失、統計資訊更新、物理順序重新排列組織。它會壓縮資料頁,按照填充因子填充適當的資料。如果有需要,也會新增新的資料頁。這些操作有利於提高資料查詢的速度,但是這個工作如果發生在大表上面,將是非常耗時耗資源的。準備工作:首先先要

04-VTK基礎3

.net http tput 作用 lte osi amp 組成 演示 【譯者:這個系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一書作的中文翻譯(出版時間2010年,ISBN: 978-1-930934-2

【計算機網路】 網路層3

四.DHCP協議 1. 如何獲得IP地址 (1)靜態配置:硬編碼   ·手動配置IP地址、子網掩碼、預設閘道器   ·手動配置DNS伺服器名稱及IP地址 (2)動態配置:動態主機配置協議(DHCP)   ·從伺服器動態獲取引數,即插即用   ·允許地址重用、在用地址續租   ·支援移動使用者加

9 應用層3_telnet協議和遠端桌面協議RDP

3.1 telnet簡介 (1)telnet是一個簡單的遠端終端協議,也是因特網的正式標準。使用者使用telnet連線到遠端執行telnet服務的裝置(可以是網路裝置、比如路由器、交換機,也可以是作業系統)進行遠端管理。 (2)telnet能將使用者的鍵盤指令傳到遠端主機,同時也能將遠端主機

C++進階語法篇11 設計模式3

11.3.4模板模式 模板模式:定義一個操作中的演算法骨架,將一些步驟延遲到子類中。模板模式使得子類可以不改變一個演算法的介面即可重定義該演算法的某些特定步驟。 模板模式是行為型模式中最簡單的一種,在實際應用中會經常使用。注:模板模式和前面的類/函式模板不同。 案例:現在公司組2個隊伍,

C語言程式設計8.13

** 利用矩陣相乘公式程式設計計算mn階矩陣A和nm階矩陣B之積 ** #include<stdio.h> #define ROW 2 #define COL 3 /*函式功能:計算矩陣相乘之積,結果存於二維陣列c中*/ void MultiplyM

會話管理 會話驗證

Shiro 提供了會話驗證排程器,用於定期的驗證會話是否已過期,如果過期將停止會話;出於效能考慮,一般情況下都是獲取會話時來驗證會話是否過期並停止會話的;但是如在web環境中,如果使用者不主動退出是不知道會話是否過期的,因此需要定期的檢測會話是否過期,Shiro 提供了會話

會話管理 sessionFactory

sessionFactory 是建立會話的工廠,根據相應的Subject 上下文資訊來建立會話;預設提供了SimpleSessionFactory用來建立SimpleSession會話。 首先自定義一個Session: public class OnlineSession

《利用python進行資料分析》 時間序列

stamp = ts.index[2] print ts[stamp],'\n' #還有更方便的用法,傳入可以被解釋為日期的字串 print ts['1/10/2011'] print ts['20110110'],'\n' #對於較長的時間序列,只需傳入“年”或“年月”即可輕鬆選取資料切片 long_ts

——維護索引7——使用索引檢視提高效能

前言:檢視是一個包含了一個或多個表的資料列的虛擬表。通常情況下,它僅僅是儲存了查詢的物件,一個檢視可以當作一個表,可以用於儲存過程、JOIN、使用者自定義函式等等。檢視包含了下面兩個主要特性:1、 提供了一個安全機制,用於限制使用者只能訪問特定的資料。2、 使得開發人員能定製

高等數學: 無窮級數3正弦級數、餘弦級數、週期為2L的周期函式的傅立葉級數

§11.9  正弦級數和餘弦級數 一、奇函式偶函式的傅立葉級數 一般說來,一個函式的傅立葉級數既含有正弦項,又含有餘弦項。但是,有些函式的傅立葉級數只含有正弦項或只含有餘弦項,究其原因,它與所給函式的奇偶性有關。 【定理】以為週期的奇函式展開成傅立葉級數時,它的傅立葉係數適

資料庫系統概論: 資料庫恢復技術

第十章  資料庫恢復技術10.1  事務的基本概念10.1.1.事務 1、事務(Transaction)是使用者定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。 2、事務和程式是兩個概念 (1)在關係資料庫中,一個事務可

C++Primer五版 習題答案1~10

1:這個比較簡單,類比下 find() 函式也就知道了。 #include<iostream> #include<algorithm> #include<vector> using namespace std; void main() {

04-VTK基礎2

輸入 per 系統 相關 bsp 開發者 框模型 bject -h 【譯者:這個系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一書作的中文翻譯(出版時間2010年,ISBN: 978-1-930934-23-8),

8 傳輸層1_TCP/UDP協議的應用場景

一個數 選擇 str 根據 connect .cn eight 安全 器) 1. 傳輸層的兩個協議 1.1 TCP和UDP協議的應用場景 (1)TCP協議:如果要傳輸的內容比較多,需要將發送的內容分成多個數據包發送。這就要求在傳輸層用TCP協議,在發送方和接收方建立連接

8 傳輸層2_UDP協議

之前 用戶數 發送數據 1-1 效率 沒有 strong 而是 系統 2. 用戶數據報協議(UDP) 2.1 UDP的特點 (1)UDP是無連接的,即發送數據之前不需要建立連接,因此減少了開銷和發送數據之前的時延。 (2)UDP使用了盡最大努力交付,即不保證可靠交付,因此主

8 傳輸層6_擁塞控制

法線 enter 部分 col alt 概念 接下來 tran 增加 6. 擁塞控制 6.1 擁塞控制的原理 (1)理想狀態下:路由器R1和R2向R3提供負載不超過1000Mb/s,都能從R3發送到R4。當提供的負載超過1000Mb/s後,不能再提高了,多余的數據包將被

9 應用層4_超文本傳輸協議HTTP

span 關閉連接 多圖 帳戶 通過 從服務器 -668 傳輸協議 分享 5. 超文本傳輸協議HTTP 5.1 統一資源定位符URL (1)URL的一般形式:<協議>://<主機>:<端口>/<路徑>   ①協議後面必須寫上“

9 應用層5_文件傳輸協議FTP

public 被動模式 更多 保留 允許 服務器端 磁盤 stat 命令 6. 文件傳輸協議FTP 6.1 FTP主動和被動模式 (1)FTP協議   ①與其他協議不同,FTP協議在客戶端訪問FTP服務器時需要建立兩個TCP連接。一個用來傳輸FTP命令,一個用來傳輸數據。

《Java從小白到大牛精簡版》之6 運算符

java java小 白 java初學者 Java語言中的運算符(也稱操作符)在風格和功能上都與C 和C++極為相似。本章為大家介紹Java語言中一些主要的運算符,包括算術運算符、關系運算符、邏輯運算符、位運算符和其他運算符。6.1 算術運算符Java中的算術運算符主要用來組織數值類型數據的算術運