●聚集索引結構
在sql server中,索引是按b+樹結構來進行組織的。聚集索引的資料排列順序與資料的物理排列順
序相同。
●聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致.
聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,
因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。
聚集索引的缺點是對錶進行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,
而把記錄插入到資料頁的相應位置,必須在資料頁中進行資料重排,降低了執行速度。
建議使用聚集索引的場合為:
①此列包含有限數目的不同值;
②查詢的結果返回乙個區間的值;
③查詢的結果返回某值相同的大量結果集。
●非聚集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致,
聚集索引和非聚集索引都採用了b+樹的結構,但非聚集索引的葉子層並不與實際的資料頁相重疊,
而採用葉子層包含乙個指向表中的記錄在資料頁中的指標的方式。非聚集索引比聚集索引層次多,
新增記錄不會引起資料順序的重組.
建議使用非聚集索引的場合為:
①此列包含了大量數目不同的值;
②查詢的結束返回的是少量的結果集;
③where字句用經常使用的列。
④經常需要連線或分組的列。
⑤order by 子句中使用了該列。
涵蓋索引可以提高查詢效能,因為符合查詢要求的全部資料都存在於索引本身中。也就是說,只需要索
引頁,而不需要表的資料頁或聚集索引來檢索所需資料,因此,減少了總體磁碟 i/o。例如,對某一表
(其中對列 a、列 b 和列 c 建立了組合索引)的列 a 和列 b 的查詢,僅僅從該索引本身就可以檢索
指定資料。將插入或修改盡可能多的行的查詢寫入單個語句內,而不要使用多個查詢更新相同的行。僅使用乙個語句,就可以利用優化的索引維護。評估查詢型別以及如何在查詢中使用列。例如,在完全匹配查詢型別中使用的列就適合用於非聚集索引或聚集索引。
列注意事項
設計索引時,應考慮以下列準則:
對於聚集索引,請保持較短的索引鍵長度。另外,對唯一列或非空列建立聚集索引可以使聚集索引獲益
不能將 ntext、text、image、varchar(max)、nvarchar(max) 和 varbinary(max) 資料型別的列指定為索引鍵列。不過,varchar(max)、nvarchar(max)、varbinary(max) 和 xml 資料型別的列可以作為非鍵索引列參與非聚集索引。
xml 資料型別的列只能在 xml 索引中用作鍵列。
檢查列的唯一性。在同乙個列組合的唯一索引而不是非唯一索引提供了有關使索引更有用的查詢優化器
的附加資訊。有關詳細資訊,請參閱唯一索引設計指南。
在列中檢查資料分布。通常情況下,為包含很少唯一值的列建立索引或在這樣的列上執行聯接將導致長
時間執行的查詢。這是資料和查詢的基本問題,通常不識別這種情況就無法解決這類問題。例如,如果
物理**簿按姓的字母順序排序,而城市裡所有人的姓都是 smith 或 jones,則無法快速找到某個人。
有關資料分布的詳細資訊,請參閱索引統計資訊。
如果索引包含多個列,則應考慮列的順序。用於等於 (=)、大於 (>)、小於 (<) 或 between 搜尋條件
的 where 子句或者參與聯接的列應該放在最前面。其他列應該基於其非重複級別進行排序,就是說,從
最不重複的列到最重複的列。
例如,如果將索引定義為 lastname、firstname,則該索引在搜尋條件為 where lastname = 'smith' 或 where lastname = smith and firstname like 'j%' 時將很有用。不過,查詢優化器不會將此索引用於基於 firstname (where firstname = 'jane') 而搜尋的查詢。
考慮對計算列進行索引。
索引的特徵
在確定某一索引適合某一查詢之後,可以選擇最適合具體情況的索引型別。索引包含以下特性:
聚集還是非聚集
唯一還是非唯一
單列還是多列
索引中的列是公升序排序還是降序排序
您也可以通過設定選項(例如 fillfactor)自定義索引的初始儲存特徵以優化其效能或維護。有關詳細
資訊,請參閱設定索引選項。而且,通過使用檔案組或分割槽方案可以確定索引儲存位置來優化效能。
資料庫索引 1
資料庫索引 概念 索引是對資料庫表中一列或者多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。如果想按特定職員的姓名來查詢他或她,則在表中搜尋所有的行進行比較,索引有助於更快的獲取資訊。索引分為聚簇索引和非聚簇索引,聚簇索引是按照資料存放的物理位置為順序的,而非聚簇索引不一樣 聚簇...
資料庫型別雜談
專題一 資料庫型別 如果有人這樣問,資料庫型別有那些呀?可能就有人說,這還不簡單,有mysql,sql server 2000,sql server 2005 sql server 2008,oracal 等等.這就是答案嗎?也許,有人這樣問過,也有人這樣答過,或許,從來就沒有人提過這個問題.說的也...
資料庫索引漫談(整理)1
不良的 sql往往來自於不恰當的索引 設計 不充份的 連 接條件和不可 優 化的 where 子句。在 對 它們進 行適當的 優 化後,其執行速度有了明 顯 地提高!下面我將從 這 三個方面分 別進 行 總結 一 不合理的索引 設計 例 表record 有 620000 行,試 看在不同的索引下,下...