真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是大數(shù)據(jù)報表

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

二道網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

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

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

常見的方式是通過分頁來呈現(xiàn)大報表,一次只取一小部分?jǐn)?shù)據(jù),取數(shù)結(jié)束后立刻交給前端呈現(xiàn),當(dāng)頁碼變化時再取出相應(yīng)頁數(shù)的數(shù)據(jù),這樣可以加快報表呈現(xiàn)速度,用戶幾乎沒有等待感。

具體如何實現(xiàn)呢?有幾種方式。

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

主要借助關(guān)系數(shù)據(jù)庫自身的能力,每種數(shù)據(jù)庫實現(xiàn)上會有所差異,Oracle 可以使用 rownum,MySQL 則可以 limit,具體實現(xiàn)網(wǎng)上有很多資料這里不再贅述。

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

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

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

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

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

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

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

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


除了數(shù)據(jù)庫分頁,還有其他更好的方式嗎?

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

按照主流的解題思路,可以通過編碼方式實現(xiàn)這個目標(biāo),實現(xiàn)思路大概是這樣:

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

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

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

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

實現(xiàn)后的效果類似下面這樣:
什么是大數(shù)據(jù)報表

取數(shù)線程不停地取數(shù)緩存,呈現(xiàn)線程從緩存中讀取數(shù)據(jù)呈現(xiàn),總頁數(shù)不斷變化

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

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


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

關(guān)于什么是大數(shù)據(jù)報表問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。


當(dāng)前題目:什么是大數(shù)據(jù)報表
分享路徑:http://weahome.cn/article/giocdg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部