ABAP 查詢性能提高之我見

 索引簡介:

各位應該都知道,我們說到數據庫的查詢速度優化問題,不得不提到索引,它是提高查詢性能的重要方面(當然同時它會影響其它修改類SQL的性能)。通俗的講,就像我們讀一本書不得不有個目錄,索引就相當我們每本書的目錄,而書中的實際內容就相當我們某個具體的數據表。要在書中查找某部分內容的時候,我們不會一頁一頁去翻書,而是先從目錄中找到相關內容所在頁碼,然後再按頁碼去找相關內容,從而大大提高了查找速度。關於各類數據庫的索引知識,實在是太多太複雜,在此不敢多說,我們主要來說說SAP概念上的索引。

 

SAP表索引重要分兩種:

1、  主索引,它是依據表的主關鍵字自動建立的(因爲一個滿足第三範式的數據表都會有一個主關鍵字,所以每個表都應該有一個主索引,如果主索引丟失,會有相應的錯誤提示)

2、  二級索引,簡單的說主索引就是除主索引以外的索引,它與主索引的主要區別就是,主索引表的物理排列次序和表的物理排列次序是相同的。由於這種特性,在查詢批量數據的時候,主索引可以按照地址段去表裏面取數據,而二級索引可能同樣要一個一個地去數據表中取數據,導致利用主索引比利用二級索引查詢數據要快得多(當然如果是查詢單條記錄的話,兩者的性能就是一樣的)。

在SAP中查看數據表索引的方法:

查看主索引:SE11進入數據字典初始界面——》輸入表名點顯示——》字段。現在我們看到的主鍵欄位上打鉤的字段就是我們的主鍵字段,同時依據它建立的默認主索引名稱爲:00。

查看二級索引:SE11進入數據字典初始界面——》輸入表名點顯示——》索引。將彈出此表的所有二級索引的列表,然後你可以雙擊每一行去查看每個索引的詳細信息。

 

以上是索引的一些簡單知識,它對我們查詢語句中WHERE條件的設計至關重要。

 

SAP SQL語句優化:

1、  在查詢語句的SELECT取字段列表中,我們應該儘量避免用“SELECT *”,而應該取多少字段我們就列多少字段。這樣做的理由有三:

一、當使用“SELECT *”的時候,查詢在執行的時候是會將“*”解析爲相應的字段的,這無疑需要花費時間。

二、大量的無用的字段信息的取出是要佔用數據庫的DATA CACH空間的(這理所當然的會佔用其他有用數據的空間,引起數據置換),大家知道,我們在從數據庫中去數據的時候,首先會到緩存中去查找有沒有相同的數據,如果有就直接從緩存中取,如果沒有則要去讀取數據文件,而同樣的數據從CACH中取比從數據文件中取大約要快10~100倍。

三、SAP在設計的時候爲了提高數據查詢性能本身也設計了緩存(SAP的緩存包括公共緩存及用於存儲用戶特有背景信息的緩存,這方面的內容有時間再和大家詳談),而此處的緩存和數據庫的患存類似的是,多餘的信息同樣會佔用空間。並且SAP用戶從緩存中取背景數據到用戶私有緩存區時,是按照一個固定的大小一部分一部分取的,這樣多餘的信息無疑會增加SAP用戶讀取背景信息的次數,增加背景信息轉入轉出時間,從而降低性能!

 

 

 

2、  WHERE條件中索引(包括主索引和二級索引)限制字段的排列次序,分兩種情況:

 

一、              索引字段都在查詢的WHERE條件中,此種情況,我們可以不注意限制字段的排列次序,效果都一樣,因此不多說。

二、              當某個索引中的某些字段在WHERE條件中,而某些又不在時候,我們應該嚴格按照索引中字段的排列次序來在WHERE條件中安排字段次序,因爲數據庫它在查找索引表的時候,是嚴格按照索引次序來在索引表中查詢地址信息的。另,當某幾個連續的索引字段中的一個不在WHERE條件中的時候,其實此字段後的索引字段對性能的提高已經失去了意義。例如:所以A,它包括A1、A2、A3、A4四個索引字段,當我們在WHERE條件中用到A1、A2、A4,此時A4其實在索引表中查詢數據地址段的時候已經不會用到,也就失去了意義(當然限制在具體的數據表中還是有限制性的,只是不能提高性能而已)。

 

3、  WHERE條件中非索引字段的排列次序。應該將篩選作用大的字段排在右邊(專業地講就是將選擇性大的字段放在右邊),因爲SQL中解析WHERE條件的次序是從右至左的,這樣先最大限度地篩選數據,有利於提高數據查詢性能。

 

4、  當要進行某列或某幾列數據的聚合運算時候,讓這中運算在數據庫中用聚合函數(SUM、AVG、MAX……)來實現呢,還是先將數據取出來,然後到應用程序中進行運算處理。這就要視情況而定,大量的數據聚合函數運用會極大地影響數據庫性能,而傳輸大量的原始數據到應用程序,在處理會在增加網絡的傳輸量(當數據庫服務器和應用服務器不在同一臺機器上時)。本人建議應該儘量減少數據層次的運算,因爲數據庫的性能是會影響整個系統的,而網絡傳輸量大影響的性能可能隻影響某個用戶(這裏沒有考慮等待資源的問題)。

 

5、  在WHERE語句中應該儘量避免使用IN關鍵字,而應該根據具體的情況用LIKE、<>、=等關鍵字或運算符號去替代它。經驗表明,IN關鍵字的查詢性能是最差的。

 

6、   不要循環從數據庫中查詢數據。即,當你運行兩個查詢,其中第二個查詢要以第一個查詢的結果爲條件的時候,你不應該先將第一個查詢的數據放入一個內表,然後循環這個內表,去執行第二個查詢。而應該先在缺少第一個內表數據的情況下,將第二個內表的數據取出來,然後再在應用程序中去匹配處理。這樣會大大地減少訪問數據庫的次數,減少讀取IO,特別是數據庫服務器和應用服務器不在同一臺機器上時,更是萬分必要。

 

7、  用SELECT語句取數據的時候,應該讓SELECT後面跟的字段次序與你要放入的內表的次序一樣。比如你定義了內表BEGIN OF ITAB,

                    A1 AS ..

                    A2 AS ..

                    A3 AS ..

                    A4 AS ..

                    END OF ITAB.

那你在查詢語句中也應該對應爲SELECT A1 A2 A3 A4 INTO ITAB FROM……..。

 

以上SQL語句中的一些簡單原則,當然具體問題還得具體分析,所以懂的每種數據SQL優化器的原理,及SQL語句的執行計劃,然後靈活運用纔是最重要的。

 

並且由於現在我們系統剛上線,系統性能比較好,暫時體現不出優化的顯著效果,但長時間運行後效果就會就會非常明顯,正如我們不能很容易地區分一秒鐘和兩秒鐘的差別,但很能很容易區分一個小時和兩個小時的差別一樣。

 

習慣決定風格,所以各位在讓自己程序實現功能的同時,更應該注意程序的可讀性、健壯性及可用性。一個劣質性能的程序在大系統中必然會被淘汰,因爲它不僅自己運行速度慢還會影響其它程序的運行性能。

發佈了9 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章