關聯式資料庫的查詢優化策略

2021-05-04 11:21:40 字數 3632 閱讀 2783

1  引言

隨著計算機應用技術的不斷普及和發展,資料庫系統正越來越多的走進人們的日常生活。在要求查詢結果正確無誤的同時,人們越來越關心查詢的效率問題。影響查詢效率的因素很多,諸如處理器的速度、i/o速度、儲存器的容量、作業系統、採取何種的資料庫服務系統等。但是對於特定伺服器來說查詢的效率主要取決於dba(資料庫管理員)所給定的查詢語句。

2   合理使用索引

資料庫伺服器對資料進行訪問一般採用下面的兩種方式:①索引掃瞄,通過索引訪問資料;②表掃瞄,讀表中的所有頁。當對乙個表進行查詢時,如果返回的行數佔全表總行數的10%到15%時,使用索引可以極大的優化查詢的效能。但是如果查詢涉及到全表40%以上的行時,表掃瞄的效率比使用索引掃瞄的效率高。在具體使用的過程中,要結合實際的資料庫和使用者的需求來確定要不要索引以及在什麼欄位上建立什麼樣的索引。下面給出一些通用的規則:

1.       在經常用作過濾器或者查詢頻率較高字段上建立索引;

2.       在sql語句中經常進行group by、order by的字段上建立索引;

3.       在不同值較少的字段上不必要建立索引,如性別字段;

4.       對於經常訪問的列避免建立索引;

5.       用於聯接的列(主健/外健)建立索引;

6.       在經常訪問的多個列上建立復合索引,但要注意復合索引的建立順序要按照使用的頻度來確定。

2.1  聚集索引

聚集索引是指行的物理順序與行的索引順序相同的索引。乙個表只能有乙個聚集索引。非聚集索引是指定表的邏輯順序的索引,行的物理順序與索引順序不盡相同,每個表可以有多個非聚集索引。預設情況下建立的是非聚集索引,但是在一些特定的情況下建立非聚集索引會極大的縮短查詢的時間。有大量重複值、且經常有範圍查詢(between,>,<,>=,<=)和orderby、groupby發生的列,可考慮建立聚集索引,而對於頻繁修改的列、或者返回小數目的不同值的這些情況應該避免建立聚集索引。

使用聚集索引的最大好處就是能夠根據查詢要求,迅速縮小查詢範圍,避免全表掃瞄。比如要返回2023年4月1日到2023年10月1日之間的資料,如果在日期的字段建立了聚集索引,那麼資料本來就是按照日期的順序排列的,只要找到開始和結尾日期的資料就可以了,可以極大的節省時間。而如果使用非聚集索引,必須查到這個時間段中每個日期對應的位置,然後在根據位置訪問資料,明顯效率很低。顯而易見,使用聚集索引的優勢很明顯。乙個表只能按照乙個固定的順序來儲存資料,因此,在建立聚集索引的時候一定要和實際查詢相結合,看哪個字段對於查詢貢獻大,而且操作不是很頻繁。

索引有助於提高檢索效能,但過多或不當的索引也會導致系統低效。因為使用者在表中每新增乙個索引,資料庫就要做更多的工作。過多的索引甚至會導致索引碎片。所以說,我們要合理使用索引體系,特別是對索引的建立,更應精益求精,使資料庫的效能得到更好的發揮。

3   書寫高效的sql語句

雖然特定的資料庫伺服器都會對輸入的查詢語句進行一定的優化操作,但是查詢效率主要取決於dba所書寫的sql語句的好壞。為確保編寫的sql語句有較好的效能,應考慮以下的優化方法:

⑴儘量減少使用負邏輯的操作符和函式,因為它們會導致全表掃瞄,而且容易出錯。可以把含有not、<> 、!= 等負邏輯的條件表示式轉化為意思相當的正邏輯。

⑵字段提取要多少,取多少,避免使用「select *」格式,因為在資料量較大的時候,影響查詢效能的最大因素不在與資料的查詢,而在於物理i/o的操作。

⑶避免使用like、exists、in等標準表示式,他們會使字段上的索引無效,引起全表掃瞄。儘量減少表的聯接操作,不可避免的時候要適當增加一些冗餘條件,使參與聯接的字段集盡量少。

⑷ or會使字段上的索引失效,引起全表掃瞄。下面的例子中,可以把or子句分開,在把結果做加法和算,也可以編寫乙個儲存過程來避免索引的失效。

select work-name, work-dept from work where work-id=』2』 or work-id=』3』;

⑸儘量減少使用聯接欄位而把所有的條件分列出來用and來進行連線,可以充分的利用在某些欄位上已經存在的索引。

select work-id from salary where work-salary||」|| work-dept=』$2000 teacher』 ;

如果把條件分開來寫成下面的格式,系統的查詢效能可以得到一定的提高。

select work-no from salary where work-salary=$2000 and work-dept=』 teacher 』;

⑹盡量避免使用相關的巢狀查詢,

3.1  where字句的影響

where子句說明查詢的條件,直接決定查詢的效能。因此在where子句的書寫及應用中要多加注意。書寫where 子句時盡量避免使用不相容的資料型別,避免對where 子句中的條件引數使用其他的數學操作符,盡可能的把操作轉化到式子的左邊,這樣可以有效的利用已有的索引技術。對於where字句中的多個選擇條件,要選取結果集小的先執行。下面給出一些不規範書寫。

select work-id from salary where work-salary>4000;

select work-id from salary where work-salary*2>$4000;

對於第乙個查詢來說,4000是整數,而工人的工資時money格式的,系統在查詢的時候需要耗費時間來進行格式轉化。對於第二個例子,任何在運算子左邊的操作都會使sql採用全表掃瞄,對錶中的每個資料項做相應的操作來比較是否滿足條件,如果這個欄位有索引,則索引失效。因此上面兩個例子最好可以寫成下面的格式:

select work-no from salary where work-salary>$4000;

select work-no from salary where work-salary>$2000;

4   儲存過程的使用

儲存過程由sql語句和spl語言的語句組成,建立後轉換為可執行**,作為資料庫的乙個物件儲存在資料庫中,儲存過程的**駐留在伺服器端,因而執行時不需要將應用程式**向伺服器端傳送,可以大大減輕網路負載,加快系統響應時間。同時,由於儲存過程已編譯為可執行**,不需要每次執行時進行分析和優化工作,從而減少了預處理所花費的時間,提高了系統的效率。

在工程中,我們可以把經常用到的查詢動作編寫成乙個儲存過程,並利用引數實現動態查詢過程來響應客戶的要求;可以實現在伺服器端進行批量資料處理等操作;可以使用儲存過程作為強制安全性工具;還可以利用系統為使用者定義的管理級別儲存過程實現資料的管理、配置和監控等。合理使用儲存過程可以有效的提高系統效率。

5    檢視的應用

利用檢視不僅可以提高資料的保密性,方便的設定使用者的許可權,而且也可以提高資料的精煉性。在dbms中有著許多不同的角色,他們對資料的要求是不同的,針對不同類別的使用者分別建立合適的檢視,可以在有效的條件下提高資料的有用性,提高系統對不同使用者的查詢響應時間。此外使用者訪問資料庫一般要求得到的是最近的資料,比如查詢話費,最常用的資料是最近三個月的。因此在許多情況下,可以按照時間對資料庫中的資料進行水平分片,把最近一段時間的資料呈現給使用者。當使用者需要查詢「過期」資料時再把相應的塊調進來。由於這種情況極少發生,在一定的情況下,可以有效的減少資料量,縮小資料查詢範圍。使用這種方法要注意分割槽資料的維護,因此一定要在權衡維護和查詢代價的基礎上確定是否要使用分片。如果經常要訪問全庫資料進行綜合對比的話,這種方法就不適用。

6     小結

關聯式資料庫的優化是乙個和實際資料庫結構密切相關的問題,在實際應用中應該結合具體的資料庫伺服器,深入的理解伺服器的運作模式、資源配置,優化伺服器的執行環境,選擇合適的作業系統,最大限度的發揮伺服器的效能。

關聯式資料庫的查詢優化

關係查詢優化是影響關聯式資料庫管理系統效能的關鍵因素。查詢優化的優點不僅在於使用者不必考慮如何最好地表達查詢以獲得較高的效率,而且在於系統可以比使用者程式的 優化 做得更好。1.優化可以從資料字典中獲得更多統計資訊。2.如果資料庫的物理統計資訊改變了,系統可以自動對查詢進行重新優化以選擇相適應的執行...

關聯式資料庫查詢優化的初次體驗

最近一直在看關係資料庫系統知識,主要還是從概念上去了解關聯式資料庫的一些知識,之前沒有系統的學習這方面的知識,現在重新去構建這塊的知識體系。學習到關係查詢優化這塊的知識,通過對書本上的分析,了解到查詢優化這塊的知識,起初在我的知識裡,我認為rdbms會優化查詢這塊的內容,即認為所有人寫的查詢被rdb...

關聯式資料庫與非關聯式資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...