ABAP 查询性能提高之我见
?索引簡介:
各位應(yīng)該都知道,我們說到數(shù)據(jù)庫的查詢速度優(yōu)化問題,不得不提到索引,它是提高查詢性能的重要方面(當(dāng)然同時它會影響其它修改類SQL的性能)。通俗的講,就像我們讀一本書不得不有個目錄,索引就相當(dāng)我們每本書的目錄,而書中的實(shí)際內(nèi)容就相當(dāng)我們某個具體的數(shù)據(jù)表。要在書中查找某部分內(nèi)容的時候,我們不會一頁一頁去翻書,而是先從目錄中找到相關(guān)內(nèi)容所在頁碼,然后再按頁碼去找相關(guān)內(nèi)容,從而大大提高了查找速度。關(guān)于各類數(shù)據(jù)庫的索引知識,實(shí)在是太多太復(fù)雜,在此不敢多說,我們主要來說說SAP概念上的索引。
?
SAP表索引重要分兩種:
1、? 主索引,它是依據(jù)表的主關(guān)鍵字自動建立的(因為一個滿足第三范式的數(shù)據(jù)表都會有一個主關(guān)鍵字,所以每個表都應(yīng)該有一個主索引,如果主索引丟失,會有相應(yīng)的錯誤提示)
2、? 二級索引,簡單的說主索引就是除主索引以外的索引,它與主索引的主要區(qū)別就是,主索引表的物理排列次序和表的物理排列次序是相同的。由于這種特性,在查詢批量數(shù)據(jù)的時候,主索引可以按照地址段去表里面取數(shù)據(jù),而二級索引可能同樣要一個一個地去數(shù)據(jù)表中取數(shù)據(jù),導(dǎo)致利用主索引比利用二級索引查詢數(shù)據(jù)要快得多(當(dāng)然如果是查詢單條記錄的話,兩者的性能就是一樣的)。
在SAP中查看數(shù)據(jù)表索引的方法:
查看主索引:SE11進(jìn)入數(shù)據(jù)字典初始界面——》輸入表名點(diǎn)顯示——》字段。現(xiàn)在我們看到的主鍵欄位上打鉤的字段就是我們的主鍵字段,同時依據(jù)它建立的默認(rèn)主索引名稱為:00。
查看二級索引:SE11進(jìn)入數(shù)據(jù)字典初始界面——》輸入表名點(diǎn)顯示——》索引。將彈出此表的所有二級索引的列表,然后你可以雙擊每一行去查看每個索引的詳細(xì)信息。
?
以上是索引的一些簡單知識,它對我們查詢語句中WHERE條件的設(shè)計至關(guān)重要。
?
SAP SQL語句優(yōu)化:
1、? 在查詢語句的SELECT取字段列表中,我們應(yīng)該盡量避免用“SELECT *”,而應(yīng)該取多少字段我們就列多少字段。這樣做的理由有三:
一、當(dāng)使用“SELECT *”的時候,查詢在執(zhí)行的時候是會將“*”解析為相應(yīng)的字段的,這無疑需要花費(fèi)時間。
二、大量的無用的字段信息的取出是要占用數(shù)據(jù)庫的DATA CACH空間的(這理所當(dāng)然的會占用其他有用數(shù)據(jù)的空間,引起數(shù)據(jù)置換),大家知道,我們在從數(shù)據(jù)庫中去數(shù)據(jù)的時候,首先會到緩存中去查找有沒有相同的數(shù)據(jù),如果有就直接從緩存中取,如果沒有則要去讀取數(shù)據(jù)文件,而同樣的數(shù)據(jù)從CACH中取比從數(shù)據(jù)文件中取大約要快10~100倍。
三、SAP在設(shè)計的時候為了提高數(shù)據(jù)查詢性能本身也設(shè)計了緩存(SAP的緩存包括公共緩存及用于存儲用戶特有背景信息的緩存,這方面的內(nèi)容有時間再和大家詳談),而此處的緩存和數(shù)據(jù)庫的患存類似的是,多余的信息同樣會占用空間。并且SAP用戶從緩存中取背景數(shù)據(jù)到用戶私有緩存區(qū)時,是按照一個固定的大小一部分一部分取的,這樣多余的信息無疑會增加SAP用戶讀取背景信息的次數(shù),增加背景信息轉(zhuǎn)入轉(zhuǎn)出時間,從而降低性能!
?
?
?
2、? WHERE條件中索引(包括主索引和二級索引)限制字段的排列次序,分兩種情況:
?
一、????????????? 索引字段都在查詢的WHERE條件中,此種情況,我們可以不注意限制字段的排列次序,效果都一樣,因此不多說。
二、????????????? 當(dāng)某個索引中的某些字段在WHERE條件中,而某些又不在時候,我們應(yīng)該嚴(yán)格按照索引中字段的排列次序來在WHERE條件中安排字段次序,因為數(shù)據(jù)庫它在查找索引表的時候,是嚴(yán)格按照索引次序來在索引表中查詢地址信息的。另,當(dāng)某幾個連續(xù)的索引字段中的一個不在WHERE條件中的時候,其實(shí)此字段后的索引字段對性能的提高已經(jīng)失去了意義。例如:所以A,它包括A1、A2、A3、A4四個索引字段,當(dāng)我們在WHERE條件中用到A1、A2、A4,此時A4其實(shí)在索引表中查詢數(shù)據(jù)地址段的時候已經(jīng)不會用到,也就失去了意義(當(dāng)然限制在具體的數(shù)據(jù)表中還是有限制性的,只是不能提高性能而已)。
?
3、? WHERE條件中非索引字段的排列次序。應(yīng)該將篩選作用大的字段排在右邊(專業(yè)地講就是將選擇性大的字段放在右邊),因為SQL中解析WHERE條件的次序是從右至左的,這樣先最大限度地篩選數(shù)據(jù),有利于提高數(shù)據(jù)查詢性能。
?
4、? 當(dāng)要進(jìn)行某列或某幾列數(shù)據(jù)的聚合運(yùn)算時候,讓這中運(yùn)算在數(shù)據(jù)庫中用聚合函數(shù)(SUM、AVG、MAX……)來實(shí)現(xiàn)呢,還是先將數(shù)據(jù)取出來,然后到應(yīng)用程序中進(jìn)行運(yùn)算處理。這就要視情況而定,大量的數(shù)據(jù)聚合函數(shù)運(yùn)用會極大地影響數(shù)據(jù)庫性能,而傳輸大量的原始數(shù)據(jù)到應(yīng)用程序,在處理會在增加網(wǎng)絡(luò)的傳輸量(當(dāng)數(shù)據(jù)庫服務(wù)器和應(yīng)用服務(wù)器不在同一臺機(jī)器上時)。本人建議應(yīng)該盡量減少數(shù)據(jù)層次的運(yùn)算,因為數(shù)據(jù)庫的性能是會影響整個系統(tǒng)的,而網(wǎng)絡(luò)傳輸量大影響的性能可能只影響某個用戶(這里沒有考慮等待資源的問題)。
?
5、? 在WHERE語句中應(yīng)該盡量避免使用IN關(guān)鍵字,而應(yīng)該根據(jù)具體的情況用LIKE、<>、=等關(guān)鍵字或運(yùn)算符號去替代它。經(jīng)驗表明,IN關(guān)鍵字的查詢性能是最差的。
?
6、? ?不要循環(huán)從數(shù)據(jù)庫中查詢數(shù)據(jù)。即,當(dāng)你運(yùn)行兩個查詢,其中第二個查詢要以第一個查詢的結(jié)果為條件的時候,你不應(yīng)該先將第一個查詢的數(shù)據(jù)放入一個內(nèi)表,然后循環(huán)這個內(nèi)表,去執(zhí)行第二個查詢。而應(yīng)該先在缺少第一個內(nèi)表數(shù)據(jù)的情況下,將第二個內(nèi)表的數(shù)據(jù)取出來,然后再在應(yīng)用程序中去匹配處理。這樣會大大地減少訪問數(shù)據(jù)庫的次數(shù),減少讀取IO,特別是數(shù)據(jù)庫服務(wù)器和應(yīng)用服務(wù)器不在同一臺機(jī)器上時,更是萬分必要。
?
7、? 用SELECT語句取數(shù)據(jù)的時候,應(yīng)該讓SELECT后面跟的字段次序與你要放入的內(nèi)表的次序一樣。比如你定義了內(nèi)表BEGIN OF ITAB,
??????????????????? A1 AS ..
??????????????????? A2 AS ..
??????????????????? A3 AS ..
??????????????????? A4 AS ..
??????????????????? END OF ITAB.
那你在查詢語句中也應(yīng)該對應(yīng)為SELECT A1 A2 A3 A4 INTO ITAB FROM……..。
?
以上SQL語句中的一些簡單原則,當(dāng)然具體問題還得具體分析,所以懂的每種數(shù)據(jù)SQL優(yōu)化器的原理,及SQL語句的執(zhí)行計劃,然后靈活運(yùn)用才是最重要的。
?
并且由于現(xiàn)在我們系統(tǒng)剛上線,系統(tǒng)性能比較好,暫時體現(xiàn)不出優(yōu)化的顯著效果,但長時間運(yùn)行后效果就會就會非常明顯,正如我們不能很容易地區(qū)分一秒鐘和兩秒鐘的差別,但很能很容易區(qū)分一個小時和兩個小時的差別一樣。
?
習(xí)慣決定風(fēng)格,所以各位在讓自己程序?qū)崿F(xiàn)功能的同時,更應(yīng)該注意程序的可讀性、健壯性及可用性。一個劣質(zhì)性能的程序在大系統(tǒng)中必然會被淘汰,因為它不僅自己運(yùn)行速度慢還會影響其它程序的運(yùn)行性能。
總結(jié)
以上是生活随笔為你收集整理的ABAP 查询性能提高之我见的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈SAP索引
- 下一篇: Field-Symbols总结