1. 取數原理sql
設計器拼出最終的SQL,將SQL語句傳給數據庫,數據庫執行,將數據返回給設計器。數據庫
因爲計算過程首先要經過SQL語句從數據庫中取數據,咱們能夠經過控制數據量的大小和對數據的提早預處理來提升報表的性能。下面是一些優化的方法。服務器
2. 優化SQL網絡
FineReport報表的數據集採用的是表模型,也就是說經過SQL這種DSL語言,從數據庫經過簡單查詢或各類組合關聯查詢獲得一個關係表,而這部分SQL查詢根據各類數據庫產商長時間的優化(好比創建索引),已經很是成熟。數據集通常要經過FineReport報表模型的複雜處理才能生成最終的表樣。所以,從數據庫SQL查詢取出數據量越少,FineReport報表模型須要作的複雜處理和計算就越少,所花的時間和內存就少,從而能夠提升性能。ide
2.1 SQL語句取具體的字段性能
咱們通常會用select * from 這樣的形式將一個數據庫表中全部的字段都取出來,而其中一些字段是報表中不須要用到的,例如報表中只須要用到三個字段,可是數據庫中實際的表有十個字段,一些初學者習慣性的用select * from table1,這樣至關於把十個字段的數據都取到報表服務器端,增長了報表服務器端的內存佔用以及減慢了運算速度,因此SQL語句中儘可能不要用「*」號,而是寫上具體的字段,可以減小報表服務器端的內存佔用,加快報表的運算速度。優化
2.2 SQL中直接分組代替報表中分組spa
一些彙總類型的報表,例如製做一張訂單總額的表,可能會從訂單明細表中取出大量的數據記錄,而後進行數據彙總,即進行分組彙集運算,報表計算過程當中咱們能夠在SQL中提早進行一次分組彙集,可以大大減小取到的報表服務器的記錄數,加快取數和報表運算的速度。設計
SQL語句:SELECT 成本價,類別ID FROM 產品orm
從數據庫中選擇如上兩個字段,而後根據類別ID進行成本價的彙總,此時數據庫返回給報表處理的數據就有77條。以下:
優化的SQL語句:SELECT sum(成本價),類別ID FROM 產品 group by 類別ID
通過SQL優化後,報表須要處理的數據就只剩8條了。以下:
優化分析:
第一種作法,不只僅取到報表服務器上記錄數多了,取數速度慢,並且報表模型須要對錶數據列進行分組運算,增長了報表運行時間;
第二種作法,數據庫雖然要進行分組運算,可是數據庫中有索引,運算速度快,且取到報表服務器端的記錄數大大減小,取數速度大大加快,所以在報表模型進行分組運算的時候只要對不多的記錄數進行,報表的運算速度大大加快了。
實驗結果以及分析代表,第二種作法的性能遠優於第一種。因此,分組應該儘可能在sql裏進行。
2.3 SQL中直接排序代替報表中排序
報表計算過程當中不少時候須要對數據進行排序,雖然排序運算能夠在報表端進行,不過咱們仍是建議在SQL中提早將數據排序,這是由於數據庫中索引功能,一般是C/C++語言(每每在效率上比Java好)寫的,會使得排序運算的速度很快。
2.4 SQL中直接過濾代替報表中過濾
報表計算過程當中不少時候並不須要對錶中的全部記錄進行操做,而只是須要對部分知足條件的記錄進行操做,雖然能夠在報表設計器中對數據過濾,不過咱們建議在SQL中對數據提早過濾,這樣數據庫返回的數據就減小了,既加快了取數速度,也加快了報表的運算速度。
3. 使用視圖、存儲過程
視圖是由SELECT語句組成的查詢定義的虛擬表,由一張或多張數據庫實際的表中的數據組成的,從數據庫系統外部來看,視圖就如同一張表同樣。
存儲過程經過流控制與SQL語句,能夠對數據進行強大的運算與處理,對於業務比較複雜的應用,經常須要將原始數據經過存儲過程處理後再供報表使用。另外存儲過程運行前,數據庫會對其進行語法和句法的分析,並進行優化,這種已經編譯好的存儲過程極大地改善SQL語句的性能。在報表端也只須要書寫較短的調用語句來得到結果,從而下降網絡的通訊量。
因此表與表的鏈接、複雜的SQL儘可能在數據庫中使用視圖或者存儲過程直接進行,這樣將複雜的SQL語句直接保存於數據庫服務器端(數據庫自己會對SQL語句進行語法分析並進行優化),在報表設計器端就不須要寫大段的SQL語句而是直接調用視圖或存儲過程了,一方面減小網絡傳輸量,減輕數據庫的壓力,另外一方面加快了報表的運算速度。