DB2性能調(diào)優(yōu)SAP應(yīng)用程序中對SQL查詢性能的提高
以下的文章主要向大家講述的是DB2性能調(diào)優(yōu)之SAP應(yīng)用程序中對SQL查詢性能的提高,如果你對DB2性能調(diào)優(yōu)之SAP應(yīng)用程序中對SQL查詢性能的提高有興趣的話,你就可以對以下的文章點(diǎn)擊觀看了。
SAP 提供了下面接口和數(shù)據(jù)庫通訊:
應(yīng)用程序?qū)懭?ABAP
SAP Open SQL
自然 SQL 通過 ADBC 接口(ABAP 數(shù)據(jù)庫連接)
自然 SQL,以 EXEC SQL 語句開始并以 ENDEXEC 語句結(jié)束
JDBC 用于 SAP Java 應(yīng)用程序
SAP ABAP 應(yīng)用程序主要使用 SAP Open SQL 來訪問數(shù)據(jù)庫。 SAP Open SQL 由一組執(zhí)行數(shù)據(jù)庫操作的 ABAP 語句組成。被開發(fā)來為 SAP 支持的所有關(guān)系數(shù)據(jù)庫平臺提供一個(gè)通用接口。 SAP Open SQL 語句在 SAP 數(shù)據(jù)庫接口中被轉(zhuǎn)換為自然 SQL 。
SAP NetWeaver BI 使用 SAP BI 發(fā)布的 ADBC 。對于自然 SQL 接口 ADBC 是一個(gè)基于類的 API,它支持執(zhí)行動(dòng)態(tài)生成 SQL 語句。在 ABAP 環(huán)境中使用 ADBC 和在 Java 環(huán)境中使用 JDBC 類似。
用戶他們自己寫的 report 和事務(wù)可以使用任何一個(gè)可用接口來訪問數(shù)據(jù)庫。
在 SAP Open SQL 中使用 DB2 參數(shù)
SAP 支持一批 DB2 參數(shù),它們可以添加到 Open SQL 語句中以影響從 Open SQL 生成的自然 SQL 語句如何在數(shù)據(jù)庫層編譯和運(yùn)行。客戶可以在他們自己寫的 report 和事務(wù)中使用這些 DB2 參數(shù)來提高 SQL 查詢性能。
注意,對前面描述的 DB2 SAP 指定參數(shù)設(shè)置,他應(yīng)該只需要在特殊情況下使用這些參數(shù)。只有發(fā)生數(shù)據(jù)庫DB2性能調(diào)優(yōu)問題需要快速解決方案和替代解決方案時(shí)才使用它們。
對 Open SQL ,SAP 支持下列 DB2 參數(shù)
OPT_FOR_ROWS N:如果 N > 0,一個(gè) OPTIMIZE FOR N ROWS 子句就被添加到 SQL 語句中。對 ABAP 語句它包含 UP TO N ROWS 子句,OPTIMIZE FOR N ROWS 是自動(dòng)生成的。 OPT_FOR_ROWS 0 被用于防止自動(dòng)生成 OPTIMIZE FOR N ROWS 。
USE_OPTLEVEL X:這個(gè)參數(shù)可以被用來指定語句處理的 DB2 查詢優(yōu)化級別。默認(rèn)情況下,SAP 使用優(yōu)化級別 5,這為大多數(shù)情況提供了合理的語句編譯和執(zhí)行時(shí)間。在某些情況下,一個(gè)較低或較高的優(yōu)化級別可能生成一個(gè)對特定語句并具有更高DB2性能調(diào)優(yōu)的訪問計(jì)劃。在這些情況下,參數(shù)可以被用作短期解決方案或替代方案。
&SUBSTITUTE LITERALS&:對于 SAP 內(nèi)核版本 4.6,這個(gè)參數(shù)需要把 SAP 配置參數(shù) dbs/db6/dbsl_substitute_literals 設(shè)置為 1 。這個(gè)參數(shù)使 ABAP 語句文本中的文字被作為 SQL 語句的文字實(shí)現(xiàn)(而不是作為參數(shù)標(biāo)記)。如果這些文字被使用,優(yōu)化器可以使用涉及這些列的表中的分布信息。注意,存在這種可能,沒有對這個(gè)表搜集分布統(tǒng)計(jì)信息。
&SUBSTITUTE VALUES&:對于 SAP 內(nèi)核版本 4.6,這個(gè)參數(shù)需要把 SAP 配置參數(shù) dbs/db6/dbsl_substitute_literals 設(shè)置為 1 。這個(gè)參數(shù)使在 ABAP 語句中的所有輸入值都被作為 SQL 語句文本的文字實(shí)現(xiàn)。就像 &SUBSTITUTE LITERALS&,DB2 優(yōu)化器可以使用關(guān)于涉及表中的分布信息。然而,由于值的替換因?yàn)檎Z句文本改變了,這個(gè)語句每次運(yùn)行的時(shí)候都需要重新準(zhǔn)備。
CONVERT_FAE_TO_CTE:對于內(nèi)核版本早于 7.0 的 SAP,這個(gè)參數(shù)用來給控制有 FOR ALL ENTIRES 結(jié)構(gòu)的 ABAP 語句生成 SQL 。
使用正確的 SAP 配置參數(shù)來控制為 FOR ALL ENTIRES Open SQL 查詢生成 SQL
FOR ALL ENTRIES (FAE) 語句是一個(gè)通用的 SAP ABAP 語句結(jié)構(gòu)。這個(gè)參數(shù)允許 ABAP 程序員用一個(gè) ABAP 內(nèi)部表連接一個(gè)或幾個(gè)數(shù)據(jù)庫表。 FAE 語句總是返回一個(gè)唯一的結(jié)果集。 SAP 數(shù)據(jù)庫接口將刪除任何從數(shù)據(jù)庫返回的重復(fù)數(shù)據(jù)。
例如:
- SELECT … FROM <dbtable> FOR ALL ENTRIES IN <itab>
- WHERE <col> = <itab>~<col>
SAP 提供了下列配置參數(shù)來控制把多少語句被轉(zhuǎn)化為 SQL:
rsdb/prefer_in_itab_opt:如果這個(gè)參數(shù)被設(shè)置為 1 而且如果 FAE 語句只在 WHERE 子句中涉及一個(gè)內(nèi)部表列,那么一個(gè)有 IN 列表的自然 SQL 語句就被生成出來:
- SELECT … FROM <dbtable> WHERE
- <col> IN (<itab>[1]~<col>,
- <itab>[2]~<col>, … , <itab>[N]~<col> )
rsdb/prefer_join:這個(gè)參數(shù)是在 SAP 內(nèi)核版本 7.0 或以后可用。如果這個(gè)參數(shù)被設(shè)置為 1 并且如果 FAE 語句不包含任何多表之間的連接,那么 FAE 語句就被實(shí)現(xiàn)為一個(gè)連接: SELECT
- …
- FROM <dbtable> t1,
- ( SELECT * FROM ( VALUES(<itab>[2]~<col>, <itab>[2]~<col>, … ,
- <itab>[N]~<col> ) )
- AS t2_tmp ( <coL> ) GROUP BY <col> )
- AS T2
- WHERE t1.<col> = t2.<col>
rsdb/prefer_union_all:如果這個(gè)參數(shù)被設(shè)置為 1,那么將為內(nèi)部表中的每一個(gè)值都會(huì)生成一個(gè) SQL 語句并且通過 UNION ALL 鏈接起來: SELECT … FROM <dbtable> WHERE <col> =
- <itab>[1]~<col> UNION ALL
- SELECT … FROM <dbtable> WHERE <col> = <itab>[2]~<col> UNION ALL
- …
- SELECT … FROM <dbtable> WHERE <col> = <itab>[N]~<col>
如果這個(gè)參數(shù)被設(shè)為 0,那么將生成由 OR 鏈接的條件:
- SELECT … FROM <dbtable> WHERE
- <col> = <itab>[1]~<col> OR
- <col> = <itab>[2]~<col> OR
- …
- <col> = <itab>[N]~<col> OR
這個(gè)參數(shù)在 rsdb/prefer_join 參數(shù)被設(shè)置為 1 的情況下不被使用。
如果上面的轉(zhuǎn)換一個(gè)都沒有發(fā)生,F(xiàn)AE 語句將被轉(zhuǎn)換為帶 OR 的自然 SQL 語句。
下面附加的 SAP 配置參數(shù)通過一個(gè)自然 SQL 語句控制內(nèi)部 ABAP 表中輸入的數(shù)目。
- rsdb/max_blocking_factor
- rsdb/max_in_blocking_factor
- rsdb/prefer_fix_blocking
- rsdb/min_blocking_factor
- rsdb/min_in_blocking_factor
如果內(nèi)部表包含更多輸入,一些自然 SQL 語句會(huì)被生成出來而且結(jié)果搜集在 SAP 數(shù)據(jù)庫接口中。更多細(xì)節(jié),參見 SAP note 48230 。
SAP 用于控制 FAE 語句的執(zhí)行的配置參數(shù)在整個(gè) SAP 系統(tǒng)的很大范圍內(nèi)對關(guān)鍵數(shù)據(jù)庫命令和DB2性能調(diào)優(yōu)影響上都有非常大的效果。因此,只有在進(jìn)行了詳細(xì)問題分析之后或是 SAP 技術(shù)支持推薦的情況下覆蓋這些配置參數(shù)的默認(rèn)設(shè)置。
對 SAP 內(nèi)核 7.0 之后的版本,rsdb/prefer_join=1 選項(xiàng)是不可用的??捎?IN 列表,UNION ALL 語句或在 WHERE 子句中有 OR 鏈接條件的語句來替換。 SAP 的參數(shù) CONVERT_FAE_TO_CTE 可以被添加到 ABAP FAE 語句中來轉(zhuǎn)換成一個(gè) DB2 通用表的表達(dá)式(CTE)。這提高了性能,因?yàn)?DB2 優(yōu)化器可以產(chǎn)生更好的訪問計(jì)劃 – 因?yàn)閮?nèi)部表中的重復(fù)值已經(jīng)在 CTE 中被刪除了。#p#
對 SAP BI 有問題的查詢進(jìn)行 SQL 性能調(diào)優(yōu)
在 YDB6BWEXT 報(bào)告中,兩個(gè)用戶可用于提供一個(gè)更快的其他選擇以提高長時(shí)間運(yùn)行 SAP BI 有問題的查詢的性能。
對 reporting 查詢,SAP NetWeaver BI 使用 ADBC 和自然 SQL 語句。這個(gè)語句在 SAP NetWeaver BI Read Interface 中生成并運(yùn)行,在 SQL 語句執(zhí)行前后會(huì)有兩個(gè)出口。例如,一個(gè) SAP BI 查詢的 DB2 優(yōu)化級別或 SQL 查詢級別可以在出口指定。
對可用出口而言,客戶需要應(yīng)用 YDB6BWEXT 報(bào)告的 queryoptbefore 與 queryoptafter 兩個(gè)表和在 SAP NetWeaver BI 7.0 以及更高版本上的 SAP note 1143736 以及對早期版本應(yīng)用 SAP note 872397 。
要獲取如何實(shí)施在 YDB6BWEXT 中的出口指南請聯(lián)系 SAP 開發(fā)支持。
避免查詢條件中的復(fù)雜表達(dá)式
避免表達(dá)式中連接謂詞
避免本地謂詞中對列應(yīng)用表達(dá)式
避免接列數(shù)據(jù)類型不匹配
避免不相等的連接謂詞
避免 DISTINCT 關(guān)鍵字的聚集
避免不必要的外連接
把 FETCH FIRST N ROWS ONLY 子句和 OPTIMIZE FOR N ROWS 子句一起使用
如果你在使用星型模式連接,確保你的插敘滿足標(biāo)準(zhǔn)要求
避免多余的查詢約束
使用約束以提高查詢優(yōu)化
在復(fù)雜查詢中 REOPT 綁定選項(xiàng)與輸出變量同時(shí)使用
為你的工作負(fù)載選擇最佳的優(yōu)化級別
設(shè)置 DB2_REDUCED_OPTIMIZATION 注冊變量
為 SAP 應(yīng)用程序,設(shè)置 DB2_WORKLOAD 注冊變量
收集正確的編目統(tǒng)計(jì)信息,包括高級統(tǒng)計(jì)功能
最小化 RUNSTATS 的影響
避免手動(dòng)更新編目統(tǒng)計(jì)信息
對 SAP 應(yīng)用程序,使用自動(dòng)統(tǒng)計(jì)信息收集
對值分布不均勻的 SAP BI 表使用統(tǒng)計(jì)視圖
使用 SAP BI 聚集
在 SAP Open SQL 中使用 DB2 參數(shù)
對 FOR ALL ENTRIES Open SQL 查詢使用正確的 SAP 配置參數(shù)來控制 SQL 生成
如果其他調(diào)優(yōu)選項(xiàng)沒有得到可以接受的結(jié)果,就使用優(yōu)化配置。
以上的相關(guān)內(nèi)容就是對DB2性能調(diào)優(yōu)之SAP應(yīng)用程序中提高 SQL 查詢性能的介紹,望你能有所收獲。
【編輯推薦】