熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows系統管理 >> 正文

CREATE INDEX

2022-06-13   來源: Windows系統管理 

  為給定表或視圖創建索引
  
  只有表或視圖的所有者才能為表創建索引表或視圖的所有者可以隨時創建索引無論表中是否有數據可以通過指定限定的數據庫名稱為另一個數據庫中的表或視圖創建索引
  
  語法
  CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
  ON { table | view } ( column [ ASC | DESC ] [ n ] )
  [ WITH < index_option > [ n] ]
  [ ON filegroup ]
  
  < index_option > ::=
  { PAD_INDEX |
    FILLFACTOR = fillfactor |
    IGNORE_DUP_KEY |
    DROP_EXISTING |
  STATISTICS_NORECOMPUTE |
  SORT_IN_TEMPDB 
  }
  
  參數
  UNIQUE
  
  為表或視圖創建唯一索引(不允許存在索引值相同的兩行)視圖上的聚集索引必須是 UNIQUE 索引
  
  在創建索引時如果數據已存在Microsoft® SQL Server&#; 會檢查是否有重復值並在每次使用 INSERT 或 UPDATE 語句添加數據時進行這種檢查如果存在重復的鍵值將取消 CREATE INDEX 語句並返回錯誤信息給出第一個重復值當創建 UNIQUE 索引時有多個 NULL 值被看作副本
  
  如果存在唯一索引那麼會產生重復鍵值的 UPDATE 或 INSERT 語句將回滾SQL Server 將顯示錯誤信息即使 UPDATE 或 INSERT 語句更改了許多行但只產生了一個重復值也會出現這種情況如果在有唯一索引並且指定了 IGNORE_DUP_KEY 子句情況下輸入數據則只有違反 UNIQUE 索引的行才會失敗在處理 UPDATE 語句時IGNORE_DUP_KEY 不起作用
  
  SQL Server 不允許為已經包含重復值的列創建唯一索引無論是否設置了 IGNORE_DUP_KEY如果嘗試這樣做SQL Server 會顯示錯誤信息重復值必須先刪除才能為這些列創建唯一索引
  
  CLUSTERED
  
  創建一個對象其中行的物理排序與索引排序相同並且聚集索引的最低一級(葉級)包含實際的數據行一個表或視圖只允許同時有一個聚集索引
  
  具有聚集索引的視圖稱為索引視圖必須先為視圖創建唯一聚集索引然後才能為該視圖定義其它索引
  
  在創建任何非聚集索引之前創建聚集索引創建聚集索引時重建表上現有的非聚集索引
  
  如果沒有指定 CLUSTERED則創建非聚集索引
  
  
  
  說明 因為按照定義聚集索引的葉級與其數據頁相同所以創建聚集索引時使用 ON filegroup 子句實際上會將表從創建該表時所用的文件移到新的文件組中在特定的文件組上創建表或索引之前應確認哪些文件組可用並且有足夠的空間供索引使用文件組的大小必須至少是整個表所需空間的 這一點很重要
  
  
  NONCLUSTERED
  
  創建一個指定表的邏輯排序的對象對於非聚集索引行的物理排序獨立於索引排序非聚集索引的葉級包含索引行每個索引行均包含非聚集鍵值和一個或多個行定位器(指向包含該值的行)如果表沒有聚集索引行定位器就是行的磁盤地址如果表有聚集索引行定位器就是該行的聚集索引鍵
  
  每個表最多可以有 個非聚集索引(無論這些非聚集索引的創建方式如何是使用 PRIMARY KEY 和 UNIQUE 約束隱式創建還是使用 CREATE INDEX 顯式創建)每個索引均可以提供對數據的不同排序次序的訪問
  
  對於索引視圖只能為已經定義了聚集索引的視圖創建非聚集索引因此索引視圖中非聚集索引的行定位器一定是行的聚集鍵
  
  index_name
  
  是索引名索引名在表或視圖中必須唯一但在數據庫中不必唯一索引名必須遵循標識符規則
  
  table
  
  包含要創建索引的列的表可以選擇指定數據庫和表所有者
  
  view
  
  要建立索引的視圖的名稱必須使用 SCHEMABINDING 定義視圖才能在視圖上創建索引視圖定義也必須具有確定性如果選擇列表中的所有表達式WHERE 和 GROUP BY 子句都具有確定性則視圖也具有確定性而且所有鍵列必須是精確的只有視圖的非鍵列可能包含浮點表達式(使用 float 數據類型的表達式)而且 float 表達式不能在視圖定義的其它任何位置使用
  
  若要在確定性視圖中查找列請使用 COLUMNPROPERTY 函數(IsDeterministic 屬性)該函數的 IsPrecise 屬性可用來確定鍵列是否精確
  
  必須先為視圖創建唯一的聚集索引才能為該視圖創建非聚集索引
  
  在 SQL Server 企業版或開發版中查詢優化器可使用索引視圖加快查詢的執行速度要使優化程序考慮將該視圖作為替換並不需要在查詢中引用該視圖
  
  在創建索引視圖或對參與索引視圖的表中的行進行操作時 個 SET 選項必須指派特定的值SET 選項 ARITHABORTCONCAT_NULL_YIELDS_NULLQUOTED_IDENTIFIERANSI_NULLSANSI_PADDING 和 ANSI_WARNING 必須為 ONSET 選項 NUMERIC_ROUNDABORT 必須為 OFF
  
  如果與上述設置有所不同對索引視圖所引用的任何表執行的數據修改語句 (INSERTUPDATEDELETE) 都將失敗SQL Server 會顯示一條錯誤信息列出所有違反設置要求的 SET 選項此外對於涉及索引視圖的 SELECT 語句如果任何 SET 選項的值不是所需的值則 SQL Server 在處理該 SELECT 語句時不考慮索引視圖替換在受上述 SET 選項影響的情況中這將確保查詢結果的正確性
  
  如果應用程序使用 DBLibrary 連接則必須為服務器上的所有 個 SET 選項指派所需的值(默認情況下OLE DB 和 ODBC 連接已經正確設置了除 ARITHABORT 外所有需要的 SET 選項
  
  如果並非所有上述 SET 選項均有所需的值則某些操作(例如 BCP復制或分布式查詢)可能無法對參與索引視圖的表執行更新在大多數情況下將 ARITHABORT 設置為 ON(通過服務器配置選項中的 user options)可以避免這一問題
  
  強烈建議在服務器的任一數據庫中創建計算列上的第一個索引視圖或索引後盡早在服務器范圍內將 ARITHABORT 用戶選項設置為 ON
  
  有關索引視圖注意事項和限制的更多信息請參見注釋部分
  
  column
  
  應用索引的列指定兩個或多個列名可為指定列的組合值創建組合索引在 table 後的圓括號中列出組合索引中要包括的列(按排序優先級排列)
  
  
  
  說明 由 ntexttext 或 image 數據類型組成的列不能指定為索引列另外視圖不能包括任何 textntext 或 image 列即使在 CREATE INDEX 語句中沒有引用這些列
  
  
  當兩列或多列作為一個單位搜索最好或者許多查詢只引用索引中指定的列時應使用組合索引最多可以有 個列組合到一個組合索引中組合索引中的所有列必須在同一個表中組合索引值允許的最大大小為 字節也就是說組成組合索引的固定大小列的總長度不得超過 字節有關組合索引中可變類型列的更多信息請參見注釋部分
  
  [ASC | DESC]
  
  確定具體某個索引列的升序或降序排序方向默認設置為 ASC
  
  n
  
  表示可以為特定索引指定多個 columns 的占位符
  
  PAD_INDEX
  
  指定索引中間級中每個頁(節點)上保持開放的空間PAD_INDEX 選項只有在指定了 FILLFACTOR 時才有用因為 PAD_INDEX 使用由 FILLFACTOR 所指定的百分比默認情況下給定中間級頁上的鍵集SQL Server 將確保每個索引頁上的可用空間至少可以容納一個索引允許的最大行如果為 FILLFACTOR 指定的百分比不夠大無法容納一行SQL Server 將在內部使用允許的最小值替代該百分比
  
  
  
  說明 中間級索引頁上的行數永遠都不會小於兩行無論 FILLFACTOR 的值有多小
  
  
  FILLFACTOR = fillfactor
  
  指定在 SQL Server 創建索引的過程中各索引頁葉級的填滿程度如果某個索引頁填滿SQL Server 就必須花時間拆分該索引頁以便為新行騰出空間這需要很大的開銷對於更新頻繁的表選擇合適的 FILLFACTOR 值將比選擇不合適的 FILLFACTOR 值獲得更好的更新性能FILLFACTOR 的原始值將在 sysindexes 中與索引一起存儲
  
  如果指定了 FILLFACTORSQL Server 會向上捨入每頁要放置的行數例如發出 CREATE CLUSTERED INDEX FILLFACTOR = 將創建一個 FILLFACTOR 為 % 的聚集索引假設 SQL Server 計算出每頁空間的 % 為 SQL Server 將其向上捨入這樣每頁就放置
  
  
  
  說明 顯式的 FILLFACTOR 設置只是在索引首次創建時應用SQL Server 並不會動態保持頁上可用空間的指定百分比
  
  
  用戶指定的 FILLFACTOR 值可以從 如果沒有指定值默認值為 如果 FILLFACTOR 設置為 則只填滿葉級頁可以通過執行 sp_configure 更改默認的 FILLFACTOR 設置
  
  只有不會出現 INSERT 或 UPDATE 語句時(例如對只讀表)才可以使用 FILLFACTOR 如果 FILLFACTOR 為 SQL Server 將創建葉級頁 % 填滿的索引如果在創建 FILLFACTOR 為 % 的索引之後執行 INSERT 或 UPDATE會對每次 INSERT 操作以及有可能每次 UPDATE 操作進行頁拆分
  
  如果 FILLFACTOR 值較小( 除外)就會使 SQL Server 創建葉級頁不完全填充的新索引例如如果已知某個表包含的數據只是該表最終要包含的數據的一小
From:http://tw.wingwit.com/Article/os/xtgl/201311/9018.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.