2008-04-21

SQL Server 2005 - 索引的維護作業

SQL Server 2005 - 索引的維護作業 - Part 1
  • 500
  • SQL Server 2005
  • 好文轉寄
  • 平均分數:0 顆星    投票人數:0
    我要評分:     


    或 許您認為,索引建立之後,就無事一身輕了,其實不然,您仍然必須時時去維護它們,以確認它們仍保有最佳效率。比方說,資料表經過一段時日的使用後,資料必 定會變得片段,此狀況可能會影響系統執行效率,我們必須學會如何改善此情況;再者,基於作業上的需求與變更,可能必須去改變索引的相關設定…凡此種種都屬 於索引維護作業的範疇。本文將指導大家使用相關工具與陳述式來完成索引的各項維護作業。

    變更索引的相關設定

    索引建立後,您可以隨時視需要變更其相關設定,比方說,您可以更改其名稱、改變鍵值欄、在叢集與非叢集間切換、變更存放的檔案群組•••等等。不過筆者必須提醒大家,如果資料表擁有極多筆資料記錄,改變索引的某些設定可能必須耗費極長的時間,此點大家不可不察。

    欲以視覺化操作來變更索引的相關設定,請採用下列兩種方法之一:

    ■ 使用「索引/索引鍵」視窗

    操作步驟如下所示:

    1. 開啟資料表的結構定義畫面,使用滑鼠按一下工具列中的「管理索引和索引鍵」按鈕 。

    2. 當「索引/索引鍵」視窗開啟後,從「選取的 主/唯一索引鍵或索引」下拉式清單中選取所需的索引,並變更其各項設定。

    3. 反覆步驟 2 的操作,直到您已將需要變動之各個索引設定完畢後,按下「關閉」按鈕。

    4. 從「檔案」功能表中選取「儲存<資料表的名稱>」指令將資料表存檔。

    ■  使用「索引屬性」視窗

    操作步驟如下所示:

    1. 於「物件總管」中您欲變更其索引的名稱上,按一下滑鼠右鍵,接著選取「屬性」指令來開啟索引的「索引屬性」視窗。

    2. 按一下「選取頁面」中的選項頁面來切換到不同的設定頁面,根據您的需要修改索引的設定。

    3. 反覆步驟 2 的操作,直到您已完成各個需要變動之索引的設定後,按下「確定」按鈕,此時 SQL Server 就會將您所變動的索引加以存檔。

    4. 反覆步驟 1∼3 的操作,直到您已完成各個需要變動之索引的設定。

    筆者必須提醒大家,上述兩種做法中,只有使用「索引/索引鍵」對話視窗才能更改索引的名稱。其實您可以在「物件總管」中欲更名其索引的名稱上,按一下滑鼠右鍵,接著選取「重新命名」指令來更改索引的名稱。如果您想要以程式控制方式更改索引的名稱,請使用系統預存程序 sp_rename。比方說,我們想要將資料表"我的資料表"之索引"我的既有索引"的名稱更改成"我的新索引",請執行下列陳述式:

    EXEC sp_rename '我的資料表.我的既有索引', '我的新索引', 'INDEX'

    附註:
    系統預存程序 sp_rename 的用法已在「SQL Server 2005 完全實戰」一書的第五章詳細介紹過,於此不再贅述。

    或許您正思考著,我們能否以程式控制方式來變更索引的相關設定呢?答案當然是肯定的。其實使用「索引/索引鍵」視窗來變更索引相關設定的方法,就是先使用 DROP INDEX 陳述式將索引刪除,再使用 CREATE INDEX 陳述式建立一個符合目前設定的索引。顯然此做法是拐個彎來變更索引的相關設定,它雖然行得通,但是速度卻非常慢。大家別忘了,當您刪除一個叢集索引,此資 料表的所有非叢集索引都必須重建一次,同樣的,當您建立一個叢集索引,此資料表的所有非叢集索引亦必須重建一次,因此如果您採取先刪除再建立的方式去變更 一個叢集索引的相關設定,將導致資料表的所有非叢集索引被重建"兩次",其間所造成的速度低落是極其嚴重的(資料表的資料記錄愈多,索引建立速度愈慢)。

    以程式控制方式來變更索引之相關設定的正統做法,是使用加入關鍵字 WITH DROP_EXISTING=ON CREATE INDEX 陳述式。其實這也是以重建索引的方式來變更索引的相關設定,但它的重建作業卻是在單一步驟內完成,而在單一步驟內重建索引有下列好處:

    ■ 使得 SQL Server 僅僅去重新組織一個既存的索引,而不需要先刪除再重建,當然就不會發生所有的非叢集索引被重建兩次的狀況。

    ■  它會使用既存之索引中已排序的資料,不需要將資料再排序一次。除非這個索引陳述式是要建立一個非叢集索引,同時 ONLINE 選項設被指定為 OFF

    ■  此法能直接更改 PRIMARY KEYUNIQUE 條件約束之索引的相關設定。

    當您使用關鍵字 WITH DROP_EXISTING 時,務必注意下列事項:

    ■  CREATE INDEX . . . WITH DROP_EXISTING 陳述式能夠將一個非叢集索引改變成一個叢集索引,但是不能將一個叢集索引改變成一個非叢集索引。

    此外務必小心的是,雖然 CREATE INDEX . . . WITH DROP_EXISTING 陳述式能夠直接更改 PRIMARY KEYUNIQUE 條件約束之索引的相關設定,但是此法不能將 PRIMARY KEYUNIQUE 條件約束的索引從叢集索引變更成非叢集索引,亦不能將 PRIMARY KEYUNIQUE 條件約束的索引從非叢集索引變更成叢集索引。

    ■  使用 CREATE INDEX . . . WITH DROP_EXISTING 陳述式去變更一個叢集索引的相關設定時,需要資料表大小之 1.2 倍的剩餘空間來實際重組資料。

    ■  您不能使用 CREATE INDEX . . . WITH DROP_EXISTING 陳述式去變更系統資料表之既存索引的相關設定。

    ■  請注意,CREATE INDEX . . . WITH DROP_EXISTING 陳述式是去變更一個既存索引的相關設定,而不是去新建立一個索引,因此如果指定名稱的索引並不存在,將出現錯誤。

    ■  如果您已經停用叢集索引,在執行 CREATE INDEX . . . WITH DROP_EXISTING 陳述式時,就必須將 ONLINE 選項設為 OFF,此舉也將啟用被停用的叢集索引。

    ■ 如果您已經停用非叢集索引,而所要建立的新索引並未關聯到已經停用之叢集索引,在執行 CREATE INDEX . . . WITH DROP_EXISTING 陳述式時,不論 ONLINE 選項的設定是 ON 或是 OFF 都可以,此舉也將啟用被停用的非叢集索引。

    變更索引的範例

    在以下的執行步驟中,我們會先替資料庫"索引調校練習"中的資料表 Vfpman 建立一個索引,然後再變更此索引的相關設定:("索引調校練習"資料庫已附於「SQL Server 2005 完全實戰」一書的範例光碟中)

    1. 執行下列程式碼替資料表 Vfpman 建立一個索引:

    CREATE NONCLUSTERED
      INDEX IX_Name_Vfpman ON Vfpman (name)
      WITH (PAD_INDEX = ON,FILLFACTOR = 80);

    2. 下面的程式碼會更改前一個步驟所建立之索引的鍵值欄與填充係數,並使其成為一個唯一索引:

    CREATE UNIQUE
      INDEX IX_Name_Vfpman ON Vfpman (name,tele,birthday)
      WITH (PAD_INDEX = ON,FILLFACTOR = 50,DROP_EXISTING = ON);

    3. 下面的程式碼會更改索引的名稱:

    EXEC sp_rename 'Vfpman.IX_Name_Vfpman','IX_NTB_Vfpman','INDEX';

    待續......

    http://blog.xuite.net/alwaysfuturevision/liminzhang/8507586

    SQL Server 2005 - 索引的維護作業 - Part2

  • 522
  • SQL Server 2005
  • 好文轉寄
  • 平均分數:0 顆星    投票人數:0
    我要評分:     


    資料片段

    當 那些會影響索引的資料被修改時,資料庫中之索引的資訊便有可能分割成為片段。比方說,當新增或修改資料表的資料記錄,或是索引之鍵值欄的內容被修改, SQL Server 就必須調整索引分頁以便能容納這些異動並維護索引資料的儲存。此一索引分頁的調整也就是先前提過的分頁重分配。分頁重分配會加大資料表的大小,並增加查詢 所需的時間。

    有兩個方法來管理資料片段的問題。第一個方法是先移除一個叢集索引,再重新建立它,而於重新建立時,必須指定一個填充係數。第二個方法是以單一步驟重建索引,並指定一個填充係數。

    資料片段是利或弊,要視應用系統的環境而定:

    ■ 在一個 OLTP 環境中,資料片段是有益的,此乃因一個 OLTP 環境是以寫入作業為主。一個典型的 OLTP 系統通常會有極多的使用者同時新增與修改資料。

    ■ 在一個 OLAP 服務環境中,資料片段是有害的,此乃因一個典型的 OLAP 系統是以讀取資料為主,而資料過於片段會使得讀取作業花費較長的時間才能完成。

    檢視資料片段情況

    欲查詢某個索引的資料片段狀態,請於 SQL Server Management Studio「物件總管」中依序展開欲檢視其索引資料片段的「資料庫╱資料表╱索引」項目,用滑鼠選取您欲檢視的索引名稱,然後按下滑鼠右鍵選擇「屬性」指令,按一下「選取頁面」中的「片段」項目,在「片段總計」文字方塊中會列示資料片段的大小,以圖表 1 為例,表示索引分頁被填滿到 27.27% 的狀態,就是說索引之葉層分頁中失序之分頁有 27.27%。


    圖表 1

    一般來說,當「片段總計」文字方塊中的資料片段大小超過 30% 時,我們會建議重建索引;而當資料片段大小小於或等於 30% 時,只會進行重組索引。如果要重建或重組某個索引的資料片段,請於「物件總管」中依序展開此索引所在的「資料庫╱資料表╱索引」項目,接著用滑鼠右鍵按一下此索引的名稱,依照您的需要選擇「重建」「重新組織」指令。從下一節開始,我們會有兩個小節介紹使用指令方式來重建與重組索引。

    附註:
    欲檢視某一個資料表之資料與索引更詳細的資料片段情況,可以使用 sys.dm_db_index_physical_stats 這個動態管理函數。

    重建索引

    要改善索引資料過於片段大小超過 30% 的情形很簡單,只需重建索引即可。基本上,重建索引有下列功效:

    ■ 藉由壓縮或擴充資料記錄來重組葉層分頁。

    ■ 使資料連續地相鄰排列,而去除零散片段的情況。

    ■ 重新計算索引統計資訊。

    ■ 啟用先前被停用的索引。

    如果您想要重建索引,除了上一節使用圖形介面操作之外,應採用在單一步驟內即可重建索引的方式,而不該採用先刪除索引再重新建立索引的做法。欲於單一步驟內重建索引,可使用下列兩道陳述式之一:

    CREATE INDEX . . . WITH DROP_EXISTING

    -或-

    ALTER INDEX . . . REBUILD

    CREATE INDEX . . . WITH DROP_EXISTING 陳述式的用法與特性已經說明過,此處就不再浪費篇幅說明。至於 ALTER INDEX . . . REBUILD 陳述式的最大特色則是,它可以一次重新建立資料表的某一個或全部的索引,而不需每一個索引個別去重新建立,此陳述式的語法如下所示:

    ALTER INDEX { index_name∣ALL }
      ON [ database_name. [ schema_name ] .∣schema_name. ]
          table_or_view_name
    REBUILD
    [ WITH
    ( { PAD_INDEX={ ON│OFF }
      │FILLFACTOR=fillfactor
      │SORT_IN_TEMPDB={ ON│OFF }
      │IGNORE_DUP_KEY={ ON│OFF }
      │STATISTICS_NORECOMPUTE={ ON│OFF }
      │ONLINE={ ON│OFF }
      │ALLOW_ROW_LOCKS={ ON│OFF }
      │ALLOW_PAGE_LOCKS={ ON│OFF }
      │MAXDOP=max_degree_of_parallelism }
       [ ,...n ] ) ]
    [ ; ]

    語法中的 index_name 引數用來指定您要重建其索引之資料表的名稱。許多引數我們先前已經說明過,於此不再贅述。大家必須注意,如果您要重建某一個資料表的所有索引,只需使用 index_name 引數指定資料表的名稱,而不需要加入 ALL 關鍵字。比方說,我們要重建資料庫"索引調校練習"之資料表 Vfpman 的所有索引,可執行如下的程式碼:

    ALTER INDEX ALL ON Vfpman REBUILD;

    當您使用使用 ALTER INDEX . . . REBUILD 陳述式時,請注意下列事項:

    1. ALTER INDEX . . . REBUILD 陳述式能夠直接去重建 PRIMARY KEYUNIQUE 條件約束的索引。

    2. 如果您的伺服器有多顆 CPU,在執行 ALTER INDEX . . . REBUILD 時,SQL Server 會自動使用更多的 CPU 來執行重建索引作業。

    3. 您可以不用手動去啟動先前被停用的索引,SQL Server 會先重建並自動啟用這些被停用的索引。

    4. SQL Server僅會重建您所指定的索引,除非您使用 ALL 關鍵字指定重建所有的索引。

    重新組織索引

    要改善索引資料過於片段大小小於或等於 30% 的情形很簡單,只需重新組織索引即可。基本上,重新組織索引有下列功效:

    ■ 重新調整葉層分頁的順序,以由左至右來排列鍵值的邏輯順序。

    ■ 在既有的分頁中重組索引,不會將索引放置於新的分頁中。

    ■ 壓縮索引分頁,並移除壓縮後空的分頁,以便釋放出硬碟空間。

    ALTER INDEX 陳述式的語法如下所示:

    ALTER INDEX { index_name∣ALL }
      ON [ database_name. [ schema_name ] .∣schema_name. ]
          table_or_view_name
    REORGANIZE
    [ ; ]

    比方說,我們要替資料庫"索引調校練習"之資料表 Vfpman 重新組織其索引 PK_Vfpman,可執行如下的程式碼:

    ALTER INDEX PK_Vfpman ON Vfpman REORGANIZE;

    附註:
    重組作業會自動在線上執行,而不會發生無法存取資料庫的問題。當您重新組織索引之後,效能還是沒有改善時,請重建整個索引。


    http://blog.xuite.net/alwaysfuturevision/liminzhang/8521399

    SQL Server 2005 - 索引的維護作業 - Part 3
  • 535
  • SQL Server 2005
  • 好文轉寄
  • 平均分數:0 顆星    投票人數:0
    我要評分:     


    統計資訊

    所 有的索引都會擁有統計資訊(Statistical Information),統計資訊是用來描述索引中之鍵值的辨識度與分布狀況。於處理查詢時,查詢最佳化工具(Query Optimizer)會使用統計資訊來決定該採用資料表掃描或是利用某一個索引來提取資料,也就是說,統計資訊能夠幫助SQL Server決定出一個最佳的查詢策略,以便以最有效率的方式執行查詢。

    統計資訊是查詢最佳化工具最佳化查詢的依據,統計資訊的精確度愈 高,最佳化的效果愈好。每當您建立索引時, SQL Server 會自動替索引之鍵值欄中的資料建立統計資訊,並將它儲存起來,然而問題是,隨著資料表被新增、修改、與刪除資料記錄,索引之鍵值欄中的資料亦會跟著異動, 這將使得統計資訊成為過時,而造成查詢最佳化工具所做出的查詢策略不是最正確的。別緊張,SQL Server 會視資料表的異動情況"自動"去更新統計資訊,不過為了避免因更新統計資訊的頻率過高而造成系統效率低落,SQL Server 並不是資料表一有更新索引之鍵值欄的異動時,就去更新統計資訊。實際的做法是,資料異動的頻率與總量將決定統計資訊何時會被自動更新。比方說,如果資料表 擁有 10,000 筆資料記錄,而其中有 2,000 筆資料記錄的鍵值欄被修改,2,000 筆資料記錄顯然佔整個資料表極大的比重,所以此時統計資訊就會自動被更新;但是如果資料表擁有 10,000,000 筆資料記錄,則就算有 1,000 筆資料記錄的鍵值欄被修改,也會因為 1,000 筆資料記錄佔整個資料表極小的比重,使得 SQL Server 不會自動去更新統計資訊。一般來說,大約只要有 20% 的資料記錄被修改,SQL Server 就會自動更新統計資訊。

    請注意:
    您於 Transact-SQL 查詢編輯器中以圖形方式顯示某一個查詢的執行計劃時,若發現資料表的名稱以紅色文字顯示,表示其索引的統計資訊已經過時或遺失了。

    以人為方式建立統計資訊

    如前所述,SQL Server 會自動替索引的鍵值欄建立與維護統計資訊。事實上,SQL Server 允許您以人為方式自行替資料表中一個或一個以上的欄位建立統計資訊,而且不管這些欄位是否為索引的鍵值欄皆可。或許您會問,這樣做的目的何在呢?原因如下所示:

    ■ 大家必須瞭解一個事實,如果您建立的是一個多重鍵值索引,則 SQL Server 只會替欄位組合中的第一個欄位建立與維護統計資訊。如果您想替多重鍵值索引之第一個鍵值欄以外的欄位建立統計資訊,必須自行以人為方式來建立。

    比方說,如果您替 Name PhoneNumber 兩欄位的組合建立一個多重鍵值索引,則 SQL Server 只會替 Name 欄位建立統計資訊,如果您想替 PhoneNumber 欄位建立統計資訊,必須以人為方式來完成。

    ■ 於實務系統中,我們不可能替每一個欄位建立索引,但是如果某一個未建立索引的欄位經常使用於查詢中,應該替此欄位建立統計資訊。

    縱上所述可以瞭解,自行替特定的欄位建立統計資訊,無非是希望在不增加系統負荷與降低索引之維護成本的前提下,讓查詢最佳化工具較有機會建立一個較佳的執行計劃。

    欲以人為方式建立統計資訊,請使用語法如下的 CREATE STATISTICS 陳述式:

    CREATE STATISTICS statistics_name
    ON { table∣view } ( column [ ,... ] )
      [ WITH [ FULLSCAN│SAMPLE number { PERCENT∣ROWS } [ , ] ]
        [ NORECOMPUTE ]
      ] [ ; ]

    語法中的 statistics_name 用來指定所要建立之統計資訊的名稱;table∣view 引數係指定其欄位要建立統計資訊之資料表或檢視表的名稱。請特別注意,這個檢視表必須要有叢集索引,才能讓 SQL Server 建立統計資料。( column [ ,... ] )  引數則是指定要建立統計資訊之欄位的名稱,如果要替多個欄位建立統計資訊,請將它們以逗號分隔,但是請注意,SQL Server 不允許您替 xml 資料型別的欄位建立統計資訊,但會特別替 charvarcharvarchar(max)ncharnvarcharnvarchar(max)textntext 資料型別的欄位建立"字串摘要"統計資訊,來讓查詢陳述式有使用 LIKE 運算子時,有更好的查詢效率。

    統計資訊其實是去分析資料表的資料記錄,然後歸納其結果,關鍵在於,要去分析多少筆資料記錄呢?基本上,您有下列兩種選擇:

    ■ 如果您希望去分析資料表的所有資料記錄,請加入關鍵字 FULLSCAN。分析所有的資料記錄雖然能取得最完整且正確的統計資訊,但是需要較長的時間來完成。

    ■ 另外一種做法,則是從資料表隨機取樣多少筆資料記錄或多少百分比的資料記錄來分析。如果您要隨機取樣特定筆數的資料記錄,請加入引數 SAMPLE number ROWS(例如:SAMPLE 20 ROWS);如果您要隨機取樣特定百分比的資料記錄,請加入引數 SAMPLE number PERCENT(例如:SAMPLE 20 PERCENT)。

    如果您沒有指定要使用 SAMPLE FULLSCAN 的作法時,SQL Server 會自動去計算一個要取樣分析的筆數是多少。

    關鍵字 NORECOMPUTE 用來設定 SQL Server 是否要自動去更新您自行建立的統計資訊。如果您沒有加入關鍵字 NORECOMPUTE,則爾後欄位內容若有異動,SQL Server 會自動去更新統計資訊;如果您加入關鍵字NORECOMPUTE,則即使爾後欄位內容有異動,SQL Server 也不會去更新統計資訊。建議您除非必要,請勿加入關鍵字 NORECOMPUTE

    最後要提醒大家,只有資料表的擁有者有權使用 CREATE STATISTICS 陳述式替資料表建立統計資訊,而且不論資料表是否擁有資料記錄,皆可執行此項作業。

    程式範例 1

    以下的程式碼表示從資料表 Vfpman 隨機取樣 20% 的資料記錄來替 Name Tele 欄位建立一個名為 NameTele 的統計資訊:

    CREATE STATISTICS NameTele
      ON Vfpman (Name, Tele)
      WITH SAMPLE 20 PERCENT;

    程式範例 2

    以下的程式碼表示從資料表 Customers 取樣所有的資料記錄來替 CompanyName ContactName 欄位建立一個名為 CCName 的統計資訊,而且設定 SQL Server 不去自動維護與更新此一統計資訊:

    CREATE STATISTICS CCName
      ON Customers (CompanyName, ContactName)
      WITH FULLSCAN, NORECOMPUTE;

    以人為方式更新統計資訊

    不論是 SQL Server 自動替索引之鍵值欄建立的統計資訊,或是您自行以 CREATE STATISTICS 陳 述式建立的統計資訊,SQL Server 都會自動去維護與更新。如前所述,當SQL Server 發現資料表有較大程度的異動時,便會自動去更新統計資訊,問題在於,SQL Server 自動去更新統計資訊時,係隨機取樣部分資料記錄來分析,然而在某些狀況下,隨機取樣部分資料記錄可能無法很正確地歸納出資料的特性。如果您想要自行控制於 更新統計資訊時,必須取樣多少筆資料記錄,則應採取人為方式來更新統計資訊。此外,在我們針對資料表執行 TRUNCATE TABLE 陳述式,亦或是索引之鍵值欄中的資料被大量新增、修改、與刪除之後,想要確實立即更新統計資訊,亦需以人為方式來完成。

    請注意:
    如果資料表的大小在 8 MB 之下,SQL Server 於自動更新統計資訊時,會取樣資料表的所有資料記錄。

    一般來說,如果您決定要自行維護與更新某一個欄位或索引的統計資訊,通常會先設定當欄位或索引之鍵值欄有任何異動,SQL Server 不會自動去更新統計資訊。欲設定 SQL Server 不自動去更新統計資訊,可視情況採用下列方法:

    ■ 於 CREATE INDEX 陳述式中加入關鍵字 STATISTICS_NORECOMPUTE 或指定 STATISTICS_NORECOMPUTE=OFF

    ■ 於「索引屬性」視窗的「選項」選取頁面中,取消勾選核取方塊 □ 自動重新計算統計資料(A)

    ■ 於「索引/索引鍵」視窗中,將「資料表設計工具」分類項目中的「重新計算統計資料」設定成否。

    ■ 於 CREATE STATISTICS 陳述式中加入關鍵字NORECOMPUTE

    ■ 於 UPDATE STATISTICS 陳述式中加入關鍵字 NORECOMPUTE

    ■ 在「資料庫屬性」視窗的「選項」選取頁面中,將「自動」分類項目中的「自動更新統計資料」「自動建立統計資料」設定成 False

    ■ 使用系統預存程序 sp_autostats

    一旦您設定 SQL Server 不會自動去更新統計資訊,就必須自行適時使用語法如下的 UPDATE STATISTICS 陳述式去更新統計資訊:

    UPDATE STATISTICS { table∣view }
      [ index│(statistics_name [ ,...n ]) ]
      [ WITH [ [FULLSCAN]│SAMPLE number {PERCENT│ROWS} ] ]
      [ [ , ] [ALL│COLUMNS│INDEX ]
      [ [ , ] NORECOMPUTE ]
      ] [ ; ]

    語法中的 table∣view 引數係指定您欲替其索引或欄位更新統計資訊之資料表或檢視表的名稱。如果您要更新某一個索引的統計資訊,請使用 index 引數指定此索引的名稱;如果您要更新先前使用 CREATE STATISTICS 陳述式所建立的一或多個統計資訊,請使用 (statistics_name [ ,...n ]) 引數來指定。

    如果您希望更新統計資訊時,取樣資料表所有的資料記錄,請加入引數 WITH FULLSCAN;如果您希望更新統計資訊時,取樣資料表特定百分比的資料記錄,請加入引數 WITH SAMPLE number PERCENT;如果您希望更新統計資訊時,取樣資料表特定筆數的資料記錄,請加入引數 WITH SAMPLE number ROWS。值得一提的是,如果 SQL Server 發現您所要求取樣的資料記錄太少,它會自動取樣較足夠的資料記錄。

    如果您並未加入 index(statistics_name, [. . .n]) 引數,則可以使用 ALL│COLUMNS│INDEX 引數指定 UPDATE STATISTICS 陳述式去更新哪一類的統計資訊。如果您加入關鍵字 ALL,則所有欄位與索引的統計資訊都會被更新;如果您加入關鍵字 COLUMNS,則所有欄位的統計資訊都會被更新;如果您加入關鍵字 INDEX,則所有索引的統計資訊都會被更新。請注意,如果您並未加入 index(statistics_name, [. . .n]) 引數,而且也沒有加入關鍵字 ALLCOLUMNS INDEX,則所有欄位與索引的統計資訊都會被更新。

    如果您加入關鍵字 NORECOMPUTE,則本此所更新的統計資訊自此之後將不會被 SQL Server 自動更新。爾後如果又希望此統計資訊會自動被更新,只需再次執行沒有加入關鍵字 NORECOMPUTE UPDATE STATISTICS 陳述式,或是使用系統預存程序 sp_autostats

    範例

    在以下的執行步驟中,將示範如何替資料表建立索引、替特定的欄位建立統計資訊、並以人為方式更新統計資訊。

    1. 以下的程式碼替資料表 Foxman 建立兩個索引,其中 IX_Name_Tele_Foxman 索引的統計資訊會由 SQL Server 自動維護與更新,而 IX_Birthday_Foxman 索引的統計資訊則不會由 SQL Server 自動維護與更新:

    CREATE INDEX IX_Name_Tele_Foxman ON Foxman(name,tele);

    CREATE INDEX IX_Birthday_Foxman ON Foxman(birthday)
      WITH STATISTICS_NORECOMPUTE;

    2. 以下的程式碼係從資料表 Foxman 取樣 50% 的資料記錄來替欄位 tele 建立一個名為 Tele_Statistics 的統計資訊,並設定它不會被自動更新:

    CREATE STATISTICS Tele_Statistics ON Foxman (tele)
      WITH SAMPLE 50 PERCENT,NORECOMPUTE;

    3. 假設我們現在要取樣資料表 Foxman 所有的資料記錄來更新它所有既存的統計資訊,請執行下列程式碼:

    UPDATE STATISTICS Foxman WITH FULLSCAN;

    4. 假設我們現在要取樣資料表 Foxman 百分之五十的資料記錄來更新其索引  的統計資訊,請執行下列程式碼:

    UPDATE STATISTICS Foxman IX_Birthday_Foxman
      WITH SAMPLE 50 PERCENT;

    5. 假設我們現在要取樣資料表 Foxman 所有的資料記錄來更新步驟二所建立的統計資訊 Tele_Statistics,請執行下列程式碼:

    UPDATE STATISTICS Foxman (Tele_Statistics)
      WITH FULLSCAN;

    6. 以下的程式碼表示取樣資料表 Foxman 五百筆的資料記錄去更新索引 IX_Name_Tele_Foxman 的統計資訊,並將它設定成不會由 SQL Server 自動維護與更新:

    UPDATE STATISTICS Foxman IX_Name_Tele_Foxman
      WITH SAMPLE 500 ROWS,NORECOMPUTE;

    檢視統計資訊

    如果您想要檢視某個索引或先前以人為方式建立之統計資訊目前的內容,請使用語法如下的 DBCC SHOW_STATISTICS 陳述式:

    DBCC SHOW_STATISTICS ( 'table'∣' view', target )
    [ WITH [ NO_INFOMSGS ]
      [ STAT_HEADER∣DENSITY_VECTOR∣HISTOGRAM ] [ , n ]
    ] [ ; ]

    語法中的 'table'∣'view' 是資料表或檢視表的名稱,target 則是索引或人為方式建立之統計資訊的名稱。如果沒有加上關鍵字 WITH NO_INFOMSGS,當 DBCC SHOW_STATISTICS 陳述式執行完畢之後,您會在「結果」窗格(當工具列中的「以文字顯示結果」保持凹陷的狀態)或「訊息」窗格(當工具列中的「以方格顯示結果」保持凹陷的狀態)最後一行看到如下的訊息:

    DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。

    加上引數 STAT_HEADER∣DENSITY_VECTOR∣HISTOGRAM 將不會顯示某些統計資料。我們的建議是不要加上這些引數,避免遺漏部分的統計資料。

    比方說,我們想要檢視前一個段落替資料表 Foxman Tele 欄位所建立之統計資訊 Tele_Statistics 目前的內容,請執行下列程式碼:

    DBCC SHOW_STATISTICS ('foxman',Tele_Statistics);

    又例如,我們想要檢視前一個段落替資料表 Foxman 所建立之索引 IX_Name_Tele_Foxman 的統計資訊內容,請執行下列程式碼:

    DBCC SHOW_STATISTICS ('foxman',IX_Name_Tele_Foxman);

    DBCC SHOW_STATISTICS 以文字顯示結果所傳回之統計資訊類似圖表 2 所示。

    圖表 2

    刪除統計資訊

    如果您想要刪除先前以 CREATE STATISTICS 陳述式建立的統計資訊,請執行語法如下的 DROP STATISTICS 陳述式:

    DROP STATISTICS table.statistics_name∣view.statistics_name [ ,...n ] [ ; ]

    範例

    以下的程式碼示範如何建立統計資訊,然後再將它們刪除:

    /* 替欄位 Hire_Salary 與 Cur_Salary 建立統計資訊 */
    CREATE STATISTICS Salary
      ON Foxman (Hire_Salary,Cur_Salary)
      WITH FULLSCAN,NORECOMPUTE;

    /* 替欄位 Sex 建立統計資訊 */
    CREATE STATISTICS Sex
      ON Foxman (sex)
      WITH FULLSCAN,NORECOMPUTE;

    /* 將統計資訊 Salary 與 Sex 刪除 */
    DROP STATISTICS Foxman.Salary,Foxman.Sex;


    http://blog.xuite.net/alwaysfuturevision/liminzhang/8521725


    --
    [垃圾桶] 裡沒有會話群組?

    沒有留言: