欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

當(dāng)前名稱:什么是大數(shù)據(jù)報(bào)表
URL鏈接:http://chinadenli.net/article16/giocdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、虛擬主機(jī)、關(guān)鍵詞優(yōu)化搜索引擎優(yōu)化、云服務(wù)器、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司