91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是大數據報表

發布時間:2022-01-15 15:38:42 來源:億速云 閱讀:334 作者:柒染 欄目:大數據

什么是大數據報表,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

實際業務中有些報表比較“大”,查詢出的報表數據行數可以達到幾千萬甚至上億,這類行數很多的報表通常被成為“大報表”。大報表大部分情況下是清單明細報表,少量是分組報表。

大數據報表查詢通常不會采用一次性取出所有記錄再交給前端呈現的方式,因為這樣要等很久,用戶體驗極差;而且報表服務器內存也吃不消。

常見的方式是通過分頁來呈現大報表,一次只取一小部分數據,取數結束后立刻交給前端呈現,當頁碼變化時再取出相應頁數的數據,這樣可以加快報表呈現速度,用戶幾乎沒有等待感。

具體如何實現呢?有幾種方式。

1. 數據庫分頁
業界最常用的做法是使用數據庫分頁來實現,具體來講,就是利用數據庫提供的返回指定行號范圍內記錄的語法。界面端根據當前頁號計算出行號范圍(每頁顯示固定行數)作為參數拼入 SQL 中,數據庫就會只返回當前頁的記錄,從而實現分頁呈現的效果。

主要借助關系數據庫自身的能力,每種數據庫實現上會有所差異,Oracle 可以使用 rownum,mysql 則可以 limit,具體實現網上有很多資料這里不再贅述。

數據庫分頁有沒有什么不足?任何技術都有其應用范圍,數據分頁的問題主要集中在以下 4 點。

(1)翻頁時效率較差
用這種辦法呈現第一頁一般都會比較快,但向后翻頁時,所使用的取數 SQL 會被再次執行,并且將前面頁涉及的記錄跳過。對于有些沒有 OFFSET 關鍵字的數據庫,就只能由界面端自行跳過這些數據(取出后丟棄),而像 ORACLE 還需要用子查詢產生一個序號才能再用序號做過濾。這些動作都會降低效率,浪費時間,前幾頁還感覺不明顯,但如果頁號比較大時,翻頁就會有等待感了。

(2) 可能出現數據不一致
用這種辦法翻頁,每次按頁取數時都需要獨立地發出 SQL。這樣,如果在兩頁取數之間又有了插入、刪除動作,那么取的數反映的是最新的數據情況,很可能和原來的頁號匹配不上。例如,每頁 20 行,在第 1 頁取出后,用戶還沒有翻第 2 頁前,第 1 頁包含的 20 行記錄中被刪除了 1 行,那么用戶翻頁時取出的第 2 頁的第 1 行實際上是刪除操作前的第 22 行記錄,而原來的第 21 行實際上落到第 1 頁去了,如果要看,還要翻回第 1 頁才能看到。如果還要基于取出的數據做匯總統計,那就會出現錯誤、不一致的結果。

為了克服這兩個問題,有時候我們還會用另一種方法,用 SQL 游標從數據庫中取數,在取出一頁呈現后,但并不終止這個游標,在翻下一頁的時候再繼續取數。這種方法能有效地克服上述兩個問題,翻頁效率較高,而且不會發生不一致的情況。不過,絕大多數的數據庫游標只能單向從前往后取數,表現在界面上就只能向后翻頁了,這一點很難向業務用戶交代,所以很少用這種辦法。

當然,我們也可以結合這兩種辦法,向后翻頁時用游標,一旦需要向前翻頁,就重新執行取數 SQL。這樣會比每次分頁都重新取數的體驗好一些,但并沒有在根本上解決問題。

(3) 無法實現分組報表
除了清單報表,有時我們還要呈現大數據量的分組報表,報表包含分組、分組匯總及分組明細數據。我們知道,按頁取數按照翻頁每次讀取固定條數(一頁或幾頁)記錄,這樣根本無法保證一次性讀取一個完整分組,而分組呈現、分組匯總都要求基于整組數據來操作,否則就會出錯。

(4) 無法使用其他數據源
數據庫分頁是借助關系數據庫自身的能力,而對于非關系數據庫就不靈了。試想一下,NoSQL 怎么用 SQL 分頁,文本怎么做分頁?

報表的多樣性數據源話題我們曾經討論過,在數據規模迅速膨脹的今天,基于非關系數據庫出報表已經非常普遍。


除了數據庫分頁,還有其他更好的方式嗎?

2. 硬編碼實現
我們發現基于數據庫的分頁方式強依賴數據源,無法滿足其他數據源類型的需要,也就是與數據庫緊耦合的。我們需要一個低耦合數據源的實現方式以應對多樣性數據源場景,還能同時解決效率、準確性和分組呈現問題。

按照主流的解題思路,可以通過編碼方式實現這個目標,實現思路大概是這樣:

基于數據庫時,
把取數和呈現做現兩個異步線程,取數線程發出 SQL 后就不斷取出數據后緩存到本地存儲中,呈現線程根據頁數計算出行數到本地緩存中去獲取數據顯示。這樣,只要已經取過的數據就能快速呈現,不會有等待感,還沒取到的數據需要等待一下也是正常可理解的;而取數線程只涉及一句 SQL,在數據庫中是同一個事務,也不會有不一致的問題。這樣,兩個問題都能得到解決。不過這需要設計一種可以按行號隨機訪問記錄的存儲格式,不然要靠遍歷把記錄數出來,那反應仍然會很遲鈍。

基于非數據庫時,
同樣設置取數和呈現兩個異步線程,取數時通過文件游標(或其他數據源提供的分批取數接口)分批讀取數據并緩存到本地,呈現階段則與上述方式完全一致。

然后再利用報表工具開放的接口和前端報表進行交互,完成報表的分頁呈現。

做分組報表時,
就需要一次性取出完整分組,在代碼里進行分組匯總,并將匯總結果插入結果集一并返回給前端報表進行呈現,同時還要設置分組記錄標志位,以便前端報表在呈現時能夠為分組行設置不同的顯示效果(如加粗、標紅)。

實現后的效果類似下面這樣:
什么是大數據報表

取數線程不停地取數緩存,呈現線程從緩存中讀取數據呈現,總頁數不斷變化

通過上面的描述,可以看到自己硬編碼雖然可以實現,但復雜度很高。除了多線程編程,還要考慮緩存數據存儲形式、文件游標、分組讀取與匯總,此外借助其他報表工具進行呈現時還要對方開放足夠靈活的接口,…,這些都是挑戰。

而且我們只考慮了呈現,如果還要導出 Excel 怎么辦?如果還要打印怎么辦?畢竟報表既然能查就應該能導出,能打印。這些需求在金融、制造行業都是真實存在的。


(3) 使用支持大報表的報表工具
如果前端使用報表工具開發報表,選用一個直接支持大報表呈現、導出、打印的報表工具則更為直接。工具實現了兩個異步線程的大報表機制,同時解決上面我們提到的問題,這些方面都封裝好直接使用。

關于什么是大數據報表問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

利川市| 尼木县| 喀什市| 临夏市| 丰城市| 西乌珠穆沁旗| 灵武市| 景德镇市| 突泉县| 确山县| 汕尾市| 库尔勒市| 常山县| 宣城市| 咸阳市| 浪卡子县| 财经| 西宁市| 高陵县| 贡嘎县| 昭苏县| 长寿区| 义马市| 包头市| 桦南县| 河西区| 苍梧县| 宁河县| 石棉县| 临猗县| 海口市| 临西县| 济阳县| 堆龙德庆县| 兖州市| 乡宁县| 亳州市| 马尔康县| 绍兴市| 炎陵县| 措勤县|