程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 數據庫性能調優技術-索引調優

數據庫性能調優技術-索引調優

編輯:關於SqlServer
 

一、概述
隨著數據庫在各個領域的使用不斷增長,越來越多的應用提出了高性能的要求。數據庫性能調優是知識密集型的學科,需要綜合考慮各種復雜的因素:數據庫緩沖區的大小、索引的創建、語句改寫等等。總之,數據庫性能調優的目的在於使系統運行得更快。
調優需要有廣泛的知識,這使得它既簡單又復雜。
說調優簡單,是因為調優者不必糾纏於復雜的公式和規則。許多學術界和業界的研究者都在嘗試將調優和查詢處理建立在數學基礎之上。
稱調優復雜,是因為如果要完全理解常識所依賴的原理,還需要對應用、數據庫管理系統、操作系統以及硬件有廣泛而深刻的理解。
數據庫調優技術可以在不同的數據庫系統中使用。如果需要調優數據庫系統,最好掌握如下知識:1)查詢處理、並發控制以及數據庫恢復的知識;2)一些調優的基本原則。
這裡主要描述索引調優。
二、索引調優
索引是建立在表上的一種數據組織,它能提高訪問表中一條或多條記錄的特定查詢效率。因此,適當的索引調優是很重要的。
對於索引調優存在如下的幾個誤區:
誤區1:索引創建得越多越好?
實際上:創建的索引可能建立後從來未使用。索引的創建也是需要代價的,對於刪除、某些更新、插入操作,對於每個索引都要進行相應的刪除、更新、插入操作。從而導致刪除、某些更新、插入操作的效率變低。
誤區2:對於一個單表的查詢,可以索引1進行過濾再使用索引2進行過濾?
實際上:假設查詢語句如下select * from t1 where c1=1 and c2=2,c1列和c2列上分別建有索引ic1、ic2。先使用ic1(或ic2)進行過濾,產生的結果集是臨時數據,不再具有索引,所以不可使用ic2(或ic1)進行再次過濾。
索引優化的基本原則:
1.將索引和數據存放到不同的文件組
沒有將表數據和索引數據存儲到不同的文件組,而不加區別地將它們存儲到同一文件組。這樣,不但會造成I/O競爭,也為數據庫的維護工作帶來不變。
2.組合索引的使用
假設存在組合索引it1c1c2(c1,c2),查詢語句select * from t1 where c1=1 and c2=2能夠使用該索引。查詢語句select * from t1 where c1=1也能夠使用該索引。但是,查詢語句select * from t1 where c2=2不能夠使用該索引,因為沒有組合索引的引導列,即,要想使用c2列進行查找,必需出現c1等於某值。
根據where條件的不同,歸納如下:
1) c1=1 and c2=2:使用索引it1c1c2進行等值查找。
2) c1=1 and c2>2:使用索引it1c1c2進行范圍查找,可以有兩種方法。
方法1,使用通過索引鍵(1,2)在B樹中命中一條記錄,然後向後掃描找出 第一條符合條件的記錄,從此記錄往後的每一條記錄都是符合條件的。這種方法的弊端在於:如果c1=1 and c2=2對應的記錄數很多,會產生很多無效的掃描。
方法2,如果c2對應的int型數據,可以使用索引鍵(1,3)在B樹中命中一條記錄,從此記錄往後的每一條記錄都是符合條件的。
本文中的例子均采用方法1。
3)c1>1 and c2=2:因為索引的第一個列不是等於號的,索引即使後面出現了c2=2,也不能將c2=2應用於索引查找。這裡,通過索引鍵(1,- ∞)在B樹中命中一條記錄,向後掃描找出第一條符合c1>1的記錄,此後的每一條記錄判斷是否符合c2=2,如果符合則輸出,否則過濾掉。這裡我們稱c2=2沒有參與到索引運算中去。這種情況在實際應用中經常出現。
4)c1>1:通過索引鍵(1,- ∞) 在B樹中命中一條記錄,以此向後掃描找出第一條符合c1>1的記錄,此後的每條記錄都是符合條件的。
3.唯一索引與非唯一索引的差異
假設索引int1c1(c1)是唯一索引,對於查詢語句select c1 from t1 where c1=1,達夢數據庫使用索引鍵(1)命中B樹中一條記錄,命中之後直接返回該記錄(因為是唯一索引,所以最多只能有一條c1=1的記錄)。
假設索引it1c2(c2)是非唯一索引,對於查詢語句select c2 from t2 where c2=2,達夢數據庫使用索引鍵(2)命中B樹中一條記錄,返回該記錄,並繼續向後掃描,如果該記錄是滿足c=2,返回該記錄,繼續掃描,直到遇到第一條不符合條件c2=2的記錄。
於是,我們可以得知,對於不存在重復值的列,創建唯一索引優於創建非唯一索引。
4.非聚集索引的作用
每張表只可能一個聚集索引,聚集索引用來組織真實數據。語句“create table employee (id int cluster primary key,name varchar(20),addr varchar(20))”。表employee的數據用id來組織。如果要查找id=1000的員工記錄,只要用索引鍵(1000)命中該聚集索引。但是,對於要查找name=’張三’的員工記錄就不能使用該索引了,需要進行全表掃描,對於每一條記錄判斷是否滿足name=’張三’,這樣會導致查詢效率非常低。
要使用聚集索引,必需提供id,我們只能提供name,於是需要引入一個輔助結構實現name到id的轉換,這就是非聚集索引的作用。該非聚集索引的鍵是name,值是id。於是語句“select * from employee where name=’張三’”的執行流程是:通過鍵(’張三’)命中非聚集索引,得到對應的id值3(假設’張三’對應的id為3),然後用鍵(3)命中聚集索引,得到相應的記錄。
5.是不是使用非聚集索引的查詢都需要進行聚集的查詢?
不是的,雖然在上一點中查詢轉換為聚集索引的查找,有時候可以只需要使用非聚集索引。
創建表並創建相應的索引:create table t1(c1 int,c2 int,c3 int);create index it1c2c3 on t1(c2,c3)。查詢語句為:select c3 from t1 where c2=1。
因為索引it1c2c3(c2,c3)覆蓋查詢語句中的列(c2,c3)。所以,該查詢語句的執行流程為:通過索引鍵(1,- ∞)命中索引it1c2c3,對於該記錄直接返回c3對應的值,繼續向後掃描,如果索引記錄中c1還是等於1,那麼輸出c3,以此類推,直到出現第一條c1不等於1的索引記錄,結束查詢。
6.創建索引的規則
創建索引首先要考慮的是列的可選擇性。比較一下列中唯一鍵的數量和表中記錄的行數,就可以判斷該列的可選擇性。如果該列的“唯一鍵的數量/表中記錄行數”的比值越接近於1,則該列的可選擇行越高。在可選擇性高的列上進行查詢,返回的數據就較少,比較適合索引查詢。相反,比如性別列上只有兩個值,可選擇行就很小,不適合索引查詢。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved