溫馨提示×

溫馨提示×

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

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

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

發(fā)布時(shí)間:2020-06-01 08:46:52 來源:網(wǎng)絡(luò) 閱讀:292 作者:raqsoft 欄目:數(shù)據(jù)庫

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

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


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

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

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

這樣做,會有兩個(gè)問題:

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

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

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

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


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

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


還有什么好辦法呢?

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

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


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI