數(shù)據(jù)挖掘各類算法中,常常需要遍歷整個(gè)數(shù)據(jù)庫(kù)(表)。現(xiàn)實(shí)中的數(shù)據(jù)庫(kù)可能十分大,往往不可能通過一個(gè)簡(jiǎn)單的Select *的方式遍歷提取數(shù)據(jù)表內(nèi)的所有元組。直接用Select * 的方式存在兩大問題,一是Select *過后,可能要等很久數(shù)據(jù)庫(kù)才能將所有信息提交完畢,第二是得到的結(jié)果可能是很大,遠(yuǎn)遠(yuǎn)超過內(nèi)存的限制。
現(xiàn)在各種主流的數(shù)據(jù)庫(kù)都支持了分頁查詢的方式。
以O(shè)racle為例,通過rownum關(guān)鍵字可以獲取指定的行區(qū)間。
比如:
Select * from XX。TABLE1 where rownum = 50;
以MySQL為例,提供了limit關(guān)鍵字,更加方便獲取中間某區(qū)間的行數(shù)據(jù)。
比如: Select * from TABLE1 limit 50,100。 MySQL的limit關(guān)鍵字用起來比Oracle要方便一些。不過各個(gè)數(shù)據(jù)庫(kù)的分頁查詢的速度我倒沒有研究過,網(wǎng)上聽一些高手們說,Oracle提供的分頁查詢效率要高一些。
Hibernate這樣的數(shù)據(jù)持久層提供的分頁查詢,可以屏蔽掉各個(gè)不同的數(shù)據(jù)庫(kù)之間具體SQL實(shí)現(xiàn)差異。
Hiberante這樣的數(shù)據(jù)持久層工具一大好處就是可以屏蔽掉不同數(shù)據(jù)庫(kù)的之間的某些細(xì)節(jié)差異。
分頁查詢?cè)诓煌臄?shù)據(jù)庫(kù)上實(shí)現(xiàn)的SQL不一樣,所以要統(tǒng)一,最好使用Hibernate這樣的工具。
Query q = session。createQuery("from Cat as c");
q。
setFirstResult(50);
q。setMaxResults(100);
List l = q。list();
網(wǎng)上到處都可以搜尋到關(guān)于Hibernate內(nèi)部實(shí)現(xiàn)分頁查詢的解讀的文章。
可以看到,Hibernate內(nèi)部也是通過rownum,limit這些關(guān)鍵字來實(shí)現(xiàn)分頁的。