【摘要】 web
多維分析程序支持對任何數據庫作 SQL 數據集多維分析,只需先把數據源配置好,而後程序猿啪啪幾下敲下須要進行多維分析的 SQL 語句就能夠,靈活便捷,去乾學院看個究竟:給一句 SQL 就能作多維分析!
《把 Excel 透視表搬到 WEB 上》咱們以 Excel 文件數據集爲例,介紹瞭如何把 Excel 的數據透視表嵌入到俺的應用程序中。愛學習的同窗會問了,Excel 數據透視表可使用 Excel 裏取到的任何數據,好比數據庫取數,大家能直接從數據庫取數作分析嗎?Yes,I Can!sql
俺的程序支持對任何數據庫作 SQL 數據集多維分析,只需先把數據源配置好,而後程序猿啪啪幾下敲下須要進行多維分析的 SQL 語句就能夠,靈活便捷!數據庫
好了,言歸正傳,正文立刻開始!數組
添加 SQL 數據集時首要任務就是先在 [web 應用根目錄]/WEB-INF/raqsoftConfig.xml 中定義好要使用的物理數據源。緩存
<DBList> <DB name="dqldemo"> <property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property> <property name="driver" value="org.hsqldb.jdbcDriver" ></property> <property name="type" value="13" ></property> <property name="user" value="sa" ></property> <property name="password" ></property> … … </DB> … … </DBList> <DBList> <DB name="dqldemo"> <property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property> <property name="driver" value="org.hsqldb.jdbcDriver" ></property> <property name="type" value="13" ></property> <property name="user" value="sa" ></property> <property name="password" ></property> … … </DB> … … </DBList>
物理數據源建立好後,接下來最重要的一步就是添加 SQL 數據集了。只需選擇物理數據源,寫上 SQL 語句,點擊查詢數據,緩存入文件保存就 ok 了!沒錯,就是這麼方便!jsp
數據集建立完成後萬事俱備只欠東風,接下來就能夠開始多維分析的體驗之旅了。ide
點擊【添加報表】,選擇數據集,填寫報表名稱【肯定】,齊活!性能
數據集有了,分析指標有了,如今就能夠任性拖拽你想要查詢的指標了,對 SQL 數據集的分析也能像文件分析從單機一步躍升 WEB 環境了,是否是又找到了倍兒爽的感受?哈哈學習
先拖拽幾個指標找找手感:優化
咦?咋列名都是代碼,不是中文?這樣感受不友好!同窗,這個問題提的好,其實答案很簡單,分析出來的報表列名就是用的 SQL 數據集的字段名,因此只要使 SQL 數據集返回的字段名是中文就行!
修改數據集 SQL 後,點擊從新查詢數據,緩存入文件,再次添加報表,發現字段名變成中文了吧!
怎麼樣,看着舒服了吧,一不當心又 get 到新技能!不過看了上面的結果愛提問的同窗可能又有想法了:部門怎麼顯示的是編號,這 0123 表明啥俺又不知道,那咋作分析?哈哈,小編猜到你的想法,早有準備,嘖嘖。。。
把部門編號顯示成部門名稱,百變不離其中,仍是取決於 SQL 數據集的 SQL 語句。經過 LEFT JOIN 作多表關聯就能夠輕鬆搞定!
好了,經過上面的學習有沒有發現其實數據集全是由 SQL 語句決定的,這裏的 SQL 語句只要符合 SQL 標準語法就行,好比能夠經過 AS 對字段重命名,LEFT JOIN 多表關聯實現名稱的顯示等等,總之一句話:一切向 SQL 看齊!
除了上述這種在界面上添加 SQL 數據集的方式外,其實還能夠經過 Tag 標籤添加。
SQL 數據集和文件數據集在 Tag 標籤的使用大同小異,只是屬性略有不一樣。
Tag 標籤添加 SQL 數據集:
<raqsoft:analysev2 dataSource="dqldemo" //指定SQL須要使用的物理數據源 sql="select * from EMPLOYEE" //SQL語句 … … > <raqsoft:analysev2 dataSource="dqldemo" //指定SQL須要使用的物理數據源 sql="select * from EMPLOYEE" //SQL語句 … … >
在 Tag 標籤中添加 SQL 數據集,訪問多維分析頁面時會將該數據集默認做爲初始數據集,並直接將結果集以明細的形式展示在頁面中。
注重細節的同窗是否是又發現了端倪?怎麼使用 Tag 標籤添加數據集時沒有點擊【查詢數據,緩存入文件】結果也能正常展示呢?難道這兩種添加數據集的方式還有什麼不一樣嗎?
哈哈,迷糊了吧,煙霧彈扔的真奏效
其實這兩種方式的底層對數據的處理機制是同樣的,惟一的不一樣點就是 Tag 標籤添加數據集能夠理解爲是直接爲分析頁面設置了初始數據集,這個時候程序會自動生成臨時文件,而後將計算結果存入,這樣一來就不用勞您大駕再動手緩存了。不過若是您還須要繼續在頁面上對初始數據集修改或者添加新的數據集,那就還得按最開始講的那樣兒,每次修改 SQL 語句後,都須要點擊 【查詢數據,緩存入文件】 從新生成了臨時文件了。默認臨時文件命名規則是以時間毫秒數組合而成。
怎麼樣,SQL 數據集在俺本身的應用程序裏用起來是否是也超便捷?不管是在頁面數據集菜單中添加仍是在 Tag 標籤裏添加,其實都是先讓集算器經過 SQL 取數,而後將返回的結果集緩存入臨時文件,以後在頁面上的多維分析就都是基於這個臨時數據文件取數了。這樣一來,借用集算器的計算能力,在界面上就能作拖拽分組、聚合、過濾等等數據分析動做了。
關於緩存文件的生命週期小編仍是要多嘮叨幾句,簡單分爲以下三點:
一、當緩存文件的父目錄路徑中包含」temp」字樣時,如:/Raqsofttemp/_.txt 或 /temp/_.txt,程序會在 Session 超時時自動清理該緩存文件
二、生成緩存文件時,若是發現緩存文件不存在,則會自動根據數據集的配置從新生成緩存文件
三、若是緩存文件路徑中沒有 temp 字樣,則不會對緩存文件作任何刪除處理,由客戶的系統本身管理這些緩存文件的生命週期
緩存文件的後綴是.txt,聰明的你確定就能猜潤乾報表是用 TXT 文件做爲中介的,但 TXT 文件的性能有點差,並且數據類型也不那麼精確,個別狀況會出點小錯。其實從 SQL 中讀出來的數據已是二進制格式,再轉成文本保存有點費時費力不討好。
那麼,還能怎麼弄?
潤乾報表提供了二進制格式的緩存文件!!!
打開 [WEB 應用根目錄]/raqsoft/guide/jsp/olap.jsp 添加以下 JS API 腳本:
<script> guideConf.dataFileType = 'binary'; //binary是二進制文件,會以遊標方式讀取,能支持超出內存的數據集;該屬性的默認爲text文本文件類型。 </script> <script> guideConf.dataFileType = 'binary'; //binary是二進制文件,會以遊標方式讀取,能支持超出內存的數據集;該屬性的默認爲text文本文件類型。 </script>
好了,設置完了,再緩存時就是以二進制文件的類型保存臨時文件了。
咋樣,是否是超簡單?超便利?超喜歡?
不過話又說回來,上面這種緩存入文件的方式對於數據量不大的狀況沒問題,但有時候咱們但願利用數據庫的計算能力(畢竟數據庫還能夠集羣分佈等),那又該怎麼辦呢?
不要慌,潤乾報表幫你忙!
在 JSP 腳本中添加不須要緩存數據的 SQL 數據集。操做起來也不難,只先敲上一個作原始查詢的 SQL 語句就行。
將 SQL 語句傳遞給數據庫作查詢,查詢後分析界面會直接將結果集中的字段列出,進行拖拽就能夠了。
下面以一個多表查詢作舉例,在 [demo 應用根目錄]/raqsoft/guide/jsp/olap.jsp 添加 JS API 進行設置。
<script> guideConf.sqlId="<%=sqlId%>";//指定sqlid var sqlDatasets = \[ { sqlId:"sqlId1" //指定數據集名稱,不可重複 ,dataSource:"dqldemo" //指定SQL語句所使用的數據源 ,sql:"SELECT EMPLOYEE.Name as 僱員姓名,DEPARTMENT.NAME as 部門,EMPLOYEE.COUNTRY as 國家 FROM EMPLOYEE LEFT JOIN DEPARTMENT ON EMPLOYEE.DEPTID=DEPARTMENT.ID" //指定數據集SQL語句 ,fields:null }, … … \] … … </script> <script> guideConf.sqlId="<%=sqlId%>";//指定sqlid var sqlDatasets = [ { sqlId:"sqlId1" //指定數據集名稱,不可重複 ,dataSource:"dqldemo" //指定SQL語句所使用的數據源 ,sql:"SELECT EMPLOYEE.Name as 僱員姓名,DEPARTMENT.NAME as 部門,EMPLOYEE.COUNTRY as 國家 FROM EMPLOYEE LEFT JOIN DEPARTMENT ON EMPLOYEE.DEPTID=DEPARTMENT.ID" //指定數據集SQL語句 ,fields:null }, … … ] … … </script>
腳本添加完成後,訪問分析頁面時只須要在 URL 裏爲 sqlId 參數傳入數據集名稱,以下圖所示,使用名稱爲 sqlId1 的數據集:
將 SQL 數據集做爲數據來源設置後,就能針對這個數據集分析了,但分析過程不會像緩存入文件類型的數據集那樣預先加載這個數據集的數據,而是經過在這個 SQL 上追加更多的查詢條件、分組、聚合子句方式實時在數據庫中查詢的,如: select f1 , sum(f2) from (${ 原始 sql}) t where … group by …. having ….
基於上面這種作法,對性能有高要求的同窗估計會有情緒了,不少 DB 不會優化,這樣作就會搞的很慢,體驗並很差。
哈哈,莫捉急,爲了提升性能咱們針對簡單 SQL 還有更智能的自動改善性能的手段,所謂簡單 SQL 就是單表無分組的 SQL 語句。SQL 會在被解析後再重組 SQL,而不是用比較慢的子查詢語句。不過當 SQL 中包含 JOIN、分組、子查詢、UNION 等複雜查詢功能時,因爲沒法進行拆解,所以程序仍是會自動選用子查詢方式進行處理。
設置單表無分組的簡單 SQL:
<script> guideConf.sqlId="<%=sqlId%>";//指定sqlid var sqlDatasets = \[ { sqlId:"sqlId1" //指定數據集名稱,不可重複 ,dataSource:"dqldemo" //指定SQL語句所使用的數據源 ,sql:"SELECT * from 客戶" //指定數據集SQL語句 ,fields:null }, … … \] … … </script> <script> guideConf.sqlId="<%=sqlId%>";//指定sqlid var sqlDatasets = [ { sqlId:"sqlId1" //指定數據集名稱,不可重複 ,dataSource:"dqldemo" //指定SQL語句所使用的數據源 ,sql:"SELECT * from 客戶" //指定數據集SQL語句 ,fields:null }, … … ] … … </script>
訪問分析頁面,拖拽指標,以下圖所示:
像上面例子這樣最終拖拽後基於原始 SQL"select from 客戶" 生成的 SQL 語句爲:SELECT 地區 地區, 城市 城市,count(客戶 ID) 客戶 ID 計數 FROM 客戶 t GROUP BY 地區, 城市*。
好了,對 SQL 數據集多維分析的介紹就告於段落了,如今咱們來回顧一下心路歷程:
能夠看到咱們從能夠緩存的少許數據,到利用數據庫計算能力的大量數據都有很好的解決方案,同時還提供了相應的性能提高手段。不過,俺們 WEB 多維分析的超能力可不只僅如此,好比還能隨意修改報表分析的表格樣式、經過建模來讀取維度和指標信息等等,想要學習潤乾報表多維分析更多知識,歡迎訪問乾學院(c.raqsoft.com.cn)。