致BI用戶: 性能調優訣竅瞭解一下,讓報表快起來

大數據一直被定義爲3V(數量大,速度快,多樣性) ,爲了支撐數據分析服務的正常運行,BI工具的報表快速處理能力也需要與時俱進。

比如億信ABI中,同樣一個查詢需求,爲什麼別人的計算結果獲取時間從1分鐘變成3秒鐘?可能是你不知道ABI具有性能調優的精髓所在。

爲了解決廣大BI工程師的調優難題,今天從SQL個數和過濾條件兩個方面來跟大家分享一下,億信ABI的性能調優小訣竅。

小訣竅之一:並行計算

在數據表格統計分析中,當一張報表中有多個分析報表時,系統需要生成多條SQL語句來完成數據查詢結果。SQL數量的增多,勢必會影響數據分析的查詢效率。爲了解決這個問題,億信ABI優化了“並行計算”的功能。

並行計算就是將多個查詢SQL並行執行,可提升多表格的計算效率;這裏舉幾個例子,讓大家直觀感受一下。

測試場景一:

數據庫與產品共用同一臺PC機資源,耗時由10次重複計算得到的平均耗時:

  • PC機配置:雙核四線程,8G內存
  • 數據庫:mysql5.0
  • 產品:億信ABI
  • 物理表數據量:48814條記錄

測試數據如下所示:

測試場景二:

數據庫與產品共用同一臺PC機資源,耗時由10次重複計算得到的平均耗時;

  • PC機配置:雙核四線程,8G內存
  • 數據庫:mysql5.0
  • 產品:億信ABI
  • 物理表數據量:100W大數據量

測試數據如下所示:

通過幾個測試場景的對比,可以看出,在多表格多分析區的場景下,開啓並行計算。最大化的利用系統資源,可以讓你的報表計算速度產生質的飛越。那麼設置方式是什麼呢?

無!需!任何設置,億信ABI就會自動進行多表格的並行計算

BUT,如果由於某種原因,需要關閉並行計算,可以這麼設置:

在“資源管理器”下的目錄:

/root/products/eanalysemgr/conf/setup.conf 下配置屬性值

@set_calc_threadmode值爲none即可,如果不存在對應目錄,可手動自行創建哦。

截圖如下所示:

小訣竅之二:優化過濾條件,善用索引

億信ABI分析表中的過濾條件在報表計算時都會轉換成SQL語句中的where條件,在大數據量的情況下,where條件不夠優化,會直接導致SQL語句運行效率低下,最直接的表現就是SQL語句執行時沒用到索引或者用到的索引不夠好。

那什麼樣的過濾能構成一個質量上乘的where子句?什麼樣的過濾一定會造成where子句效率的損失?我們在編寫BI報表過濾條件時又該注意哪些問題呢?本例以數據庫Oracle爲例來給大家深入解讀一二。

  • 杜絕在指標列上使用函數

Oracle使用索引的原則之一是:如果在where條件中的列上使用了函數,就不會使用該列上建立的索引。

舉例如下:

優化前:

主題表ESEN_BI的列pid上有索引,原過濾條件寫法爲:

left(ESEN_BI.pid,1)>='1'

and

left(ESEN_BI.pid,1)<='3'

由於在列上用了left函數並且使用的是不等運算符,因此BI無法直接優化爲like操作,只能將left轉換爲sql中的substr函數,結果就破壞了走索引的可能性;

優化後:

(ESEN_BI.pid  like '1%' or

ESEN_BI.pid   like '2%'or

ESEN_BI.pid   like '3%')

該sql查詢會走索引,在測試環境經過驗證,這個過濾所在的分析表計算速度由原來的7分鐘直接提速到了14秒。

  • 優化過濾表達式

養成良好的過濾條件編寫習慣。在理解業務過濾需求的基礎上,儘可能的用簡潔實用的表達式來編寫。編寫過濾條件時,可以使用以下3個小技巧:

  • 能用like不用substr(取子串)
  • 能用and儘量不要用or
  • 儘量不要用 not in、in,有條件的情況下可以用範圍過濾來代替(>,<)

最後再給大家幾個與索引相關的小建議,趕緊拿出你的小本本記下來吧:

  1. 在索引列上使用函數時不會使用索引,如果一定要使用索引,建議建立函數索引;
  2. 索引列中有NULL值時,數據庫查詢不會走索引;
  3. 如果需要排序時,儘量根據已建立索引的列排序;
  4. 如果發現過濾條件和排序所需要的列沒有索引時,可以申請讓數據庫工程師整體評估具體優化方法;
  5. 切忌自行隨意增加索引,過多的索引反而會影響性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章