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語句的執行計劃,然后靈活運用才是最重要的。
?
并且由于現在我們系統剛上線,系統性能比較好,暫時體現不出優化的顯著效果,但長時間運行后效果就會就會非常明顯,正如我們不能很容易地區分一秒鐘和兩秒鐘的差別,但很能很容易區分一個小時和兩個小時的差別一樣。
?
習慣決定風格,所以各位在讓自己程序實現功能的同時,更應該注意程序的可讀性、健壯性及可用性。一個劣質性能的程序在大系統中必然會被淘汰,因為它不僅自己運行速度慢還會影響其它程序的運行性能。
總結
以上是生活随笔為你收集整理的ABAP 查询性能提高之我见的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈SAP索引
- 下一篇: Field-Symbols总结