成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

大清單報(bào)表應(yīng)當(dāng)怎么做?

大清單報(bào)表應(yīng)當(dāng)怎么做?

創(chuàng)新互聯(lián)建站是一家專業(yè)提供新鄉(xiāng)企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站制作、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為新鄉(xiāng)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

在數(shù)據(jù)查詢時(shí),有時(shí)會(huì)碰到數(shù)據(jù)量很大的清單報(bào)表。用戶輸入的查詢條件很寬泛,可能會(huì)從數(shù)據(jù)庫(kù)中查出幾百上千萬(wàn)行甚至過(guò)億的記錄。如果等著把這些記錄全部檢索出來(lái)再生成報(bào)表呈現(xiàn),那需要很長(zhǎng)時(shí)間,用戶體驗(yàn)惡劣;而且報(bào)表一般采用內(nèi)存運(yùn)算機(jī)制,大多數(shù)情況下也裝不下這么多數(shù)據(jù)。所以,我們一般都是使用分頁(yè)呈現(xiàn)的方式,盡量快速地呈現(xiàn)出第一頁(yè),然后可以隨意翻頁(yè)顯示,每次只顯示一頁(yè),也不會(huì)造成內(nèi)存溢出。


那么,一般的報(bào)表工具或BI系統(tǒng)都是怎么實(shí)現(xiàn)這一機(jī)制的呢?

絕大多數(shù)產(chǎn)品都是使用數(shù)據(jù)庫(kù)分頁(yè)的方法來(lái)做的。

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

這樣做,會(huì)有兩個(gè)問(wèn)題:

1. 翻頁(yè)時(shí)效率較差

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

2. 可能出現(xiàn)數(shù)據(jù)不一致

一般來(lái)說(shuō),每次按頁(yè)取數(shù)時(shí)發(fā)出的SQL是獨(dú)立的。這樣,如果在兩頁(yè)取數(shù)之間數(shù)據(jù)庫(kù)又有了插入刪除動(dòng)作,這時(shí)取出來(lái)的數(shù)據(jù)將是最新的,很可能和原來(lái)的頁(yè)號(hào)匹配不上了。比如第1頁(yè)取出20行記錄后,在取第2頁(yè)前,第1頁(yè)的20行記錄中被刪除了1行,那么這時(shí)候取出來(lái)的第2頁(yè)的第1行就會(huì)是原來(lái)的第22行記錄,原來(lái)的第21行會(huì)落到第1頁(yè)去了,要再倒翻頁(yè)才能看到。如果基于這些數(shù)據(jù)做匯總統(tǒng)計(jì),那會(huì)出現(xiàn)錯(cuò)誤的結(jié)果。


還有一種不常用的方法。向數(shù)據(jù)庫(kù)發(fā)出取數(shù)SQL生成游標(biāo),從中取出一頁(yè)后呈現(xiàn),但并不終止這個(gè)游標(biāo),要取下一頁(yè)的時(shí)候再繼續(xù)取數(shù)。這種方法能克服上述兩個(gè)問(wèn)題,不會(huì)發(fā)生不一致的現(xiàn)象,但絕大多數(shù)的數(shù)據(jù)庫(kù)游標(biāo)只能向后取數(shù)而不是倒回去,這樣在界面上的表現(xiàn)就是只能向后翻頁(yè)了,這一點(diǎn)很難向業(yè)務(wù)用戶解釋,所以很少用這種辦法。

也可以是兩種辦法的結(jié)合,向后翻頁(yè)時(shí)用后一種辦法,一旦發(fā)生向前翻頁(yè)時(shí),則重新執(zhí)行取數(shù)SQL。這樣比每次分頁(yè)取數(shù)的體驗(yàn)略好一些,但并沒(méi)有根本上解決問(wèn)題。


還有什么好辦法呢?

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

在當(dāng)前數(shù)據(jù)庫(kù)系統(tǒng)不直接支持這種機(jī)制時(shí),只能是報(bào)表工具或BI系統(tǒng)受累自己寫這些程序了,對(duì)于有大清單報(bào)表呈現(xiàn)需求的用戶,就要認(rèn)真考察這些功能點(diǎn)了。

分享文章:大清單報(bào)表應(yīng)當(dāng)怎么做?
URL地址:http://jinyejixie.com/article36/jjeosg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、虛擬主機(jī)、面包屑導(dǎo)航、微信公眾號(hào)、域名注冊(cè)、建站公司

廣告

聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
崇信县| 佛山市| 通化市| 松江区| 宜都市| 牡丹江市| 邵阳市| 鸡东县| 新建县| 曲阳县| 仁怀市| 博白县| 梅河口市| 壤塘县| 清新县| 岳池县| 广灵县| 安阳市| 荣昌县| 鄂温| 霍邱县| 天等县| 资源县| 普定县| 平利县| 兴和县| 杨浦区| 抚顺县| 舒城县| 泊头市| 同德县| 当雄县| 湖南省| 漠河县| 疏勒县| 申扎县| 图们市| 高淳县| 达日县| 定远县| 台南市|