使用字面量或者繫結變數在HANA Studio裡執行SQL語句

weixin_33861800發表於2018-02-08

在SAP note 2000002 – FAQ: SAP HANA SQL Optimization裡提到了SQL語句的兩種執行方式,具體差異體現在where語句裡搜尋條件的指定方式上。

所謂Literals, 就是我們通常所說的hard code – 硬編碼,在下面的例子裡已經寫得很清楚了。

而Bind variables – 繫結變數, 就是指在出現在SQL語句的where條件是維護在變數裡,這些變數的值根據應用程式的邏輯計算出來。一個典型的例子如下:

關於這兩種執行方式,SAP note裡有這樣的提示:

It can make a significant difference in terms of execution plan, performance and resource consumption if a SQL statement is executed with explicit literals or with bind variables. Therefore it is recommended that you analyze an expensive SQL statement that uses bind variables in the same way, i.e. also with bind variables.

大意是說: 這兩種執行方式會影響執行計劃, 效能和執行時的資源消耗。因此SAP建議,如果您在分析一個存在效能問題的ABAP OPEN SQL時,如果該ABAP OPEN SQL是通過繫結變數的方式執行,那麼,您在HANA Studio裡使用各種工具分析該語句時,也要保證也使用繫結變數的方式執行。

看個具體的例子。在SAP CRM裡,我寫了下列一個簡單的report,來搜尋其抬頭的描述欄位包含了指定輸入的關鍵字的那些服務訂單。

這段程式碼呼叫BOL的API dquery實現資料庫查詢,最後會執行如下的OPEN SQL。

可以看到OPEN SQL的where語句裡的條件都是執行期動態計算填充的,在編譯期不可見。這屬於上文介紹的第二種執行方式:繫結變數。

因此,如果我們想將對應的SQL語句在HANA Studio裡執行以便利用那裡各種有用的效能分析工具,我們要注意需要用正確的方式把SQL貼上到HANA Studio裡。

錯誤的做法

從Edit->Display Execution Plan->For Recorded Statement找到需要貼上的statement:

如果把下面這段紅色的SQL語句貼上到HANA Studio裡執行,那就沒能夠完全模擬我的測試report執行的ABAP Open SQL,因為這裡貼上的SQL的where語句已經被轉換成字面量方式了(下圖藍色區域),而我的ABAP Open SQL的where語句從上圖介紹來看是通過繫結變數來執行的。根據SAP note,這兩者不等價。

正確的做法

把下面這段SQL貼上到HANA Studio裡。注意藍色區域的繫結變數的風格,和”錯誤的做法”裡的字面量風格相比較。

把SQL statement貼上到HANA Studio裡,執行,能看到下列這個tab: Prepared SQL。右鍵,選擇Add Parameter Values。

輸入下列字串: 504,BUS2000116,BUS2000116,BUS2000140,BUS2000105,BUS2000137,BUS2000131,BUS2000146,BUS2000159,BUS2000153,BUS2000199,,Y,,%2017-12-21%,SRVO,100

這些值即被自動填充到SQL語句where條件對應的繫結變數裡。

執行SQL,得到結果。通過這種方式在HANA Studio裡執行SQL語句才能真正保證和我在SAPGUI裡執行ABAP report進而執行的SQL語句效能完全一致。

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:

相關文章