如何提高查詢速度是基于WEB的軟件系統設計里的一個非常重要的問題,如果一開始就沒有控制好數據的查詢速度,面對諸多用戶,隨著系統中數據量的增加,很可能出現數據擁塞現象,同時訪問訪問的人不斷增多,系統速度也會越來越慢,一旦用戶達到峰值,系統隨時都有可能癱瘓。下面我們一起來討論下如何提高查詢速度。
1.通過使用索引提高系統性能
索引是用于加速訪問速度的一種建立在數據表上的數據庫對象。建立索引時,在索引頁中保存鍵值,以及指向其他索引的指針或數據頁。相對于直接進行表掃描訪問數據來說,通過索引訪問數據庫中數據的速度會快得多。通過表掃描訪問數據,是將數據頁中的數據記錄全部掃描一遍,而不是在找到符合條件的數據后立即停止。所以表的記錄數目會不斷增加,性能也會下降的明顯加快。為了顯著提高系統的性能,就必須設計合理的索引。如果建立的是不合理的索引,那么對特定的查詢不具備足夠的選擇性,終歸又變成了進行表掃描 。
2.查詢優化程序過程
編寫程序時肯定要用到大量的數據庫查詢語句,一般來說,針對一條復雜的查詢語句,相同的查詢條件可以有多種不同的方法來進行表達,而對應不同的表達,數據庫的響應速度也將大相徑庭,因此若要提高軟件的性能,就必須要提高SQL語句的質量。SQL語言是面向結果而不是面向過程的查詢語言,所以一般來說,支持SQL語言的大型關系型數據庫都需要使用一個基于成本的優化器,目的在于為即時查詢提供最佳執行策略。這個執行策略就是執行這個查詢所需要的一系列步驟。這一個優化算法就體現了數據庫的反應速度。查詢策略和查詢步驟不同,則服務器的反應也不同,因此要使系統性能大大提高,采用適當的查詢策略才行。
SQL查詢語句可以有多種執行策略,優化器會找出預估的所有執行方法中成本最低的一種,也就是所需時間最少的那種。一般來說,使用什么索引和采用何種表的連接手段最為重要,而所有優化的進行都是基于查詢語句中的where子句。通常來說硬盤訪問是成本最高的操作,對用戶來說,對字段索引進行操作是優化查詢的關鍵。
2.1使用優化器優化where子句可以分為以下幾類:
(l)參數搜索
數據庫搜索參數的核心是能否使用表中字段的索引來查詢數據。只需帶有=、<、>、>=、<=等操作符的條件便可直接使用索引,而不必直接查詢記錄中的數據。有時優化器可以將非搜索參數轉化為搜索參數,如: 將“>$200*15,,轉化為“>3000”;將“BETWEENAND”轉化為“>=AND。”等。
因此可以適當提供一些冗余的參數進行搜索,給優化器增加更多的選擇余地。例如a和b兩張表是一對多的關系,相同的查詢條件可以有如下三種表現方法:
①WHERE a.xh=b.xh AND b.xh=’200913’
②WHERE a.xh=b.xh AND a.xh=’200913’
③WHERE a.xh=b.xh AND a.xh=’200913’AND b.xh=’200913’
不難看出,三種方法中第三種方法最好,因為它給優化器提供了更寬闊的選擇空間。
(2)鏈接條件
在進行查詢時,優化器首先列舉出所有連接的方法,然后計算每種連接的成本,再選擇最低成本的那一個。如果無法獲得連接時用到的數據,系統則會估算可能的命中率,一般使用平均密度作為依據。
(3)‘或’運算
在查詢語句中包含IN關鍵詞時,優化器會自動轉化其中的內容以OR并列條件。數據庫管理系統查詢每一個OR從句,并將所有的結果進行合并,然后再去掉重復項形成最終結果。
2.2基于對數據庫優化器的理解,采用以下技巧優化查詢語句:
(l)避免數據類型不兼容。
不兼容的數據類型有可能使優化器無法執行一些原本可執行的優化操作。那么在編程時就要將類型轉化掉,如varchar和char、int和float是互相不兼容的。
(2)避免使用其他數學操作符
如下語句:
SELECT*FORM a WHERE x>200
SELECT*FORM a WHERE id like‘A%’
而不要寫成:
SELECT*FORM a WHERE x*15>3000
SELECT*FORM a WHERE SUBSTRING(id,1,1,)=’A’
2.3避免使用!=或<>之類的操作符.
這會使得系統去直接搜索表數據,而不是使用索引,那么優化器就無法通過索引來確定將要命中的行數。
2.4盡量避免鏈接
選擇數據庫表時,會自動鏈接各個表中的相同屬性名(域也相同),這種自動鏈接大多數是有益的,但是在某些情況下還是需要取消鏈接。
如可以通過兩種方法查詢條件為a、b、c表的學號為’200913’:
WHERE(a.xh=b.xh and b.xh=c.xh and a.xh=’200913’)
② WHERE(a.xh=’200913’AND b.xh =’200913’AND c.xh=’200913’
第一種方法是在自動生成的基礎上添加a.xh=’200913’,這種方法看似簡單,其實存在不必要的鏈接,它大大降低了執行效率。第二種方法則要先取消鏈接,然后再重新寫WHERE語句。
以上便是提高查詢速度的一些基本方法,這也是通過反復測試,比較不同的語句得到的較快解決方案。當然,如果要得到更快的響應性能,還是需要通過調整數據庫管理系統的參數得以更有效實現。
參考文獻
趙強.SQL Server數據庫編程技法范例[M].北京:清華大學出版社,2005
彭暉.SQL Server安全性[M].北京:清華大學出版社,2004.
趙啟志.PHP+SQL Server完整自學方案[M].北京:中國鐵道出版社,2001.