【03】SAP ABAP性能優化 - DB的存在性檢查

存在性檢查是經常使用的一個數據庫操作,然而在實際工作中,作者發現很多人並沒有在意這一點,DB的存在性檢查寫的很隨意,並不規範。

本篇博客列出了DB檢查的常見錯誤寫法,並給出了ABAP進行DB的存在性檢查的常用方式。

1.常見錯誤

請看下面代碼:

DATA: lv_count   TYPE i,
      ls_sflight TYPE sflight.
SELECT COUNT(*) FROM sflight
  INTO lv_count WHERE carrid = 'LH'.
IF lv_count > 0.
  WRITE: 'exist'.
ELSE.
  WRITE: 'not exist'.
ENDIF.

這是最常見的一種錯誤寫法,通過COUNT(*)來檢查數據是否存在。但是,如果並不需要統計數據的數目,那麼就不要引入額外的DB數據運算!!在DB數量巨大時,這樣的一種寫法會對程序的性能產生明顯的影響。

類似的,下面的代碼中,錯誤地混淆了COUNT(*)和UP TO n ROWs的用法,使用下面這種方式進行存在性檢查也是錯誤的。

SELECT COUNT(*) FROM sflight
  UP TO 1 ROWS
  INTO lv_count WHERE carrid = 'LH'.

2.正確寫法

在指定檢查條件的前提下,直接使用UP TO 1 ROWS。如果有數據返回,則說明存在;否則即不存在。

DATA: lv_count   TYPE i,
      ls_sflight TYPE sflight.
SELECT * FROM sflight
  INTO ls_sflight UP TO 1 ROWS
  WHERE carrid = 'LH'.
ENDSELECT.
IF sy-subrc = 0.
  WRITE: 'exist'.
ELSE.
  WRITE: 'not exist'.
ENDIF.

或者,當檢查某一字段是否存在時,可進一步明確字段名稱。

DATA: lv_count   TYPE i,
      ls_sflight TYPE sflight.
SELECT carrid  FROM sflight
  INTO ls_sflight-carrid 
  UP TO 1 ROWS
  WHERE carrid = 'LH'.
ENDSELECT.
IF sy-subrc = 0.
  WRITE: 'exist'.
ELSE.
  WRITE: 'not exist'.
ENDIF.

3.小結

在對DB進行存在性檢查時,應使用最精簡的程序邏輯完成需求,不要自增複雜度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章