索引入門

在數據庫學習中,索引的使用是最重要的一環;
        索引是一種查詢優化手段,意思就是即便不使用索引,同樣能得出正確結果;索引存在的意義就是提高查詢性能。在學習索引的概念時,須要咱們瞭解 B樹,堆,數據庫頁,區,填充因子,碎片,文件組等等這些知識。html

        在SQL SERVER中,存儲的單位最小是頁(PAGE),頁是不可再分的最小存儲單位。這意味着,SQL SERVER對於頁的讀取,要麼整個讀取,要麼徹底不讀取,沒有折中.
        數據以堆heap的形式存儲,若是要查找一個數據,須要在整個表包含的數據庫頁中全盤掃描。而磁盤IO掃描每每是數據庫檢索最耗時的一塊,因此在數據量上來後,沒有索引的數據表很是耗時。數據庫

那麼索引是什麼
        索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。索引的存儲結構是B樹,B樹的設計初衷就是爲了減小對磁盤的掃描次數。性能

索引又分爲彙集索引和非彙集索引
字面上看它們的不一樣就在「彙集」兩個字上;什麼叫彙集呢?
爲了提升某個屬性(或屬性組)的查詢速度,把這個或這些屬性(稱爲彙集碼)上具備相同值的元組集中存放在連續的物理塊稱爲彙集。
在SQL SERVER中,彙集的做用就是將某一列(或是多列)的物理順序改變爲和邏輯順序相一致學習

        彙集索引:以B樹爲存儲結構,B樹的葉子節點直接存儲真實數據。也就是說彙集索引改變了所對應表的物理存儲順序;因此彙集索引一個表最多隻能有一個。優化

由於每一個表只能有一個彙集索引,若是咱們對一個表的查詢不只僅限於在彙集索引上的字段。咱們又對彙集索引列以外還有索引的要求,那麼就須要非彙集索引了.spa

        非彙集索引,本質上來講也是彙集索引的一種.非彙集索引並不改變其所在表的物理結構,而是額外生成一個彙集索引的B樹結構,但葉子節點是對於其所在表的引用,這個引用分爲兩種,若是其所在表上沒有彙集索引,則引用行號。若是其所在表上已經有了彙集索引,則引用匯集索引的頁.設計

能夠看到,非彙集索引須要額外的空間進行存儲,按照被索引列進行彙集索引,並在B樹的葉子節點包含指向非彙集索引所在表的指針.指針

建立索引須要的注意事項:
(1)經過非彙集索引和彙集索引的原理能夠看出,若是其所在表的物理結構改變後,好比加上或是刪除彙集索引,那麼全部非彙集索引都須要被重建,這個對於性能的損耗是至關大的。
因此最好要先創建彙集索引,再創建對應的非彙集索引.htm

(2)索引列越少,列類型佔字節越少,索引的非葉子節點就越少(索引的中間層級),索引就越快;因此建立索引選擇列須要多嘗試。blog


索引的使用

索引的使用並不須要顯式使用,創建索引後查詢分析器會自動找出最短路徑使用索引.
可是有這種狀況.當隨着數據量的增加,產生了索引碎片後,不少存儲的數據進行了不適當的跨頁,會形成碎片(關於跨頁和碎片以及填充因子的介紹,我會在後續文章中說到)咱們須要從新創建索引以加快性能:
好比前面的test_tb2上創建的一個彙集索引和非彙集索引,能夠經過DMV語句查詢其索引的狀況:

SELECT index_type_desc,alloc_unit_type_desc,avg_fragmentation_in_percent,fragment_count,avg_fragment_size_in_pages,page_count,record_count,avg_page_space_used_in_percent
FROM    
sys.dm_db_index_physical_stats(DB_ID('AdventureWorks'),OBJECT_ID('test_tb2'),NULL,NULL,'Sampled')

咱們能夠經過重建索引來提升速度:
ALTER INDEX idx_text_tb2_EmployeeID ON test_tb2 REBUILD
 
還有一種狀況是,當隨着表數據量的增大,有時候須要更新表上的統計信息,讓查詢分析器根據這些信息選擇路徑,使用:
UPDATE STATISTICS 表名
那麼何時知道須要更新這些統計信息呢,就是當執行計劃中估計行數和實際表的行數有出入時:

參考:http://www.cnblogs.com/CareySon/archive/2011/12/22/2297568.html

相關文章
相關標籤/搜索