1. 概述
在實際應用會出現多資料集聯動報表,報表的展現速度會很慢,使用 SQL 語句聯動多個資料表又十分複雜。FineReport 提供「動態參數注入」功能,可加快報表的展現速度,又不用編寫複雜的 SQL 語句。
動態參數注入,是透過注入的值對資料庫中的資料進行操作的,只取對應的資料,進而提高報表的效能。本文將簡單對比資料欄過濾,複雜 SQL 和動態參數注入三種方法的展現效率。
注:動態參數注入只適用於「小資料量」的範本加快速度使用。大數據量的範本反而會降低載入速度。
例如 4 萬筆資料注入到兩個資料集裏面,實際上會依次載入 8 萬筆資料,反而會變慢。
2. 範本準備
2.1 資料欄過濾
2.1.1 建立報表
建立兩個資料集,ds1:SELECT * FROM 訂單;ds2:SELECT * FROM 訂單明細
報表樣式如下圖所示:
2.1.2 設定過濾條件
選擇 D2 儲存格,對 D2 儲存格設定過濾條件,可選列為訂單 ID,運算子為等於,對應儲存格為A2。如下圖所示:
2.2 動態參數注入
2.2.1 修改 SQL 語句
將上述範本中,資料集 ds2 的 SQL 語句,修改成:SELECT * FROM 訂單明細 where 訂單ID =${orderid}
將參數orderid預設值設定為訂單 ID 中的一個值,如:10248
2.2.2 參數注入設定
雙擊原進行過濾的 D2 儲存格,在彈出資料欄對話框中,點選「動態參數注入」按鈕,彈出「動態參數注入對話框」。
插入參數orderid,設定值為 A2儲存格,同時刪除過濾條件。如下圖所示:
2.3 複雜 SQL 語句
建立資料集,SQL 語句為: select a.訂單ID,訂購日期,到貨日期,發貨日期,產品ID,單價,數量,進價,折扣 from 訂單 a,訂單明細 b where a.訂單ID=b.訂單ID
報表樣式參考本文 2.1.1 節。
3. 方法對比
3.1 資料欄過濾
分頁預覽本文 2.1 節制作的報表,從日誌中可看出,是將第二個資料集中的資料全部取出了,如下圖所示:
注:若將資料全部取出會降低報表的效能,因此會降低報表的展現速度。
3.2 複雜 SQL
若將兩個資料集定義成一個資料集,則 SQL 語句非常複雜,容易寫錯且難排查問題。
3.3 動態參數注入
分頁預覽本文 2.2 節制作的報表,日誌中可看出每執行一行就只是取出的對應訂單 ID 的那筆資料,如下圖所示:
4. 總結
方式 | 推薦使用場景 |
---|---|
資料欄過濾 | 當資料量較小時,可使用資料欄過濾進行設定 |
複雜 SQL | 任意場景下均可使用,當資料量較大時推薦使用 新計算引擎 |
動態參數注入 | 當資料量較小或適中時,建議使用參數注入功能,可以降低寫 SQL 的時間,並使得範本運作速度有所提升 |