DataGrid連接Access的快速分頁法(2)——SQL語句的選用(升序)
2024-09-07 19:04:58
供稿:網(wǎng)友
datagrid連接access的快速分頁法(2)——sql語句的選用(升序)
一、相關(guān)概念
在 access 數(shù)據(jù)庫中,一個(gè)表的主鍵(primary key,又稱主索引)上必然建立了唯一索引(unique index),因此主鍵字段的值是不會(huì)重復(fù)的。并且索引頁依據(jù)索引列的值進(jìn)行排序,每個(gè)索引記錄包含一個(gè)指向它所引用的數(shù)據(jù)行的指針。我們可以利用主鍵這兩個(gè)特點(diǎn)來實(shí)現(xiàn)對(duì)某條記錄的定位,從而快速地取出某個(gè)分頁上要顯示的記錄。
舉個(gè)例子,假設(shè)主鍵字段為 integer 型,數(shù)據(jù)庫表中的記錄已經(jīng)按主鍵字段的值升序排好,那么主鍵字段的值為“11”的記錄肯定剛好在值為“12”的記錄前面(假設(shè)數(shù)據(jù)庫表中存在主鍵的值為“12”的記錄)。如果主鍵字段不具備 unique 約束,數(shù)據(jù)庫表中將有可能存在兩個(gè)或兩個(gè)以上主鍵字段的值為“11”的記錄,這樣就無法確定這些記錄之間的前后位置了。
下面就讓我們看看如何利用主鍵來進(jìn)行數(shù)據(jù)的分段查詢吧。
二、升序
(1)@pageindex <= @firstindex
取第一頁的數(shù)據(jù)是再簡單不過了,我們只要用top @pagesize 就可以取出第一頁要顯示的記錄。因?yàn)閿?shù)據(jù)表中的記錄已經(jīng)按主鍵字段的值升序排好,所以省去了 order by 子句,速度更快。
select top @pagesize @queryfields
from @tablename
where @condition
-- order by @primarykey asc
如圖:@pageindex = 0
(2)@firstindex < @pageindex <= @middleindex
把取數(shù)據(jù)表前半部分記錄和取后半部分記錄的 sql 語句分開寫,可以有效地改善性能。后面我再詳細(xì)解釋這個(gè)問題。現(xiàn)在看看取前半部分記錄的 sql 語句。先取出當(dāng)前頁之前的所有記錄的主鍵值,再從中選出最大值,然后取出主鍵值大于該最大值的前 @pagesize 條記錄。值得注意的是,這里省去了兩個(gè) order by @primarykey asc 語句,分別在最里面和最外面的 select 語句。前面已經(jīng)說過,數(shù)據(jù)庫表中的記錄已經(jīng)按主鍵字段的值升序排好,所以我們沒有必要畫蛇添足。
select top @pagesize @queryfields
from @tablename
where @primarykey > (
select max(@primarykey) from (
select top @pagesize*@pageindex @primarykey
from @tablename
where @condition
-- order by @primarykey asc
) tablea
) where @condition
-- order by @primarykey asc
例如:@pageindex = 1 ,紅 --> 黃 --> 藍(lán)
(3)@middleindex < @pageindex < @lastindex
接下來看看取數(shù)據(jù)表后半部分記錄的 sql 語句。該語句跟前面的語句算法的原理是一樣的,只是方法稍微不同。
先取出當(dāng)前頁之后的所有記錄的主鍵值,再從中選出最小值,然后取出主鍵值小于該最小值的前 @pagesize 條記錄。
select * from (
select top @pagesize @queryfields
from @tablename
where @primarykey < (
select min(@primarykey) from (
select top (@[email protected]*(@pageindex+1)) @primarykey
from @tablename
where @condition
order by @primarykey desc
) tablea
) where @condition
order by @primarykey desc
) tableb
order by @primarykey asc
之所以把取數(shù)據(jù)表前半部分記錄和取后半部分記錄的 sql 語句分開寫,是因?yàn)槭褂萌∏鞍氩糠钟涗浀?sql 語句時(shí),當(dāng)前頁前面的記錄數(shù)目隨頁數(shù)遞增,而我們還要從這些記錄中取出它們的主鍵字段的值再從中選出最大值。這樣一來,分頁速度將隨著頁數(shù)的增加而減慢。因此我沒有這樣做,而是在當(dāng)前頁索引大于中間頁索引時(shí)(@middleindex < @pageindex)選用了分頁速度隨著頁數(shù)的增加而加快的算法。由此可見,假設(shè)把所有分頁面劃分為前面、中間和后面三部分,則最前面和最后面的分頁速度最快,最中間的分頁速度最慢。
例如:@pageindex = 3 ,紅 --> 黃 --> 藍(lán)
(4)@pageindex >= @lastindex
取最后一頁的記錄時(shí)要先計(jì)算出該頁的記錄數(shù),作為 top 語句的條件,而不能直接用 top @pagesize,這樣取出來的記錄并不只是最后一頁的。其實(shí)很多網(wǎng)站確實(shí)這樣做。
select * from (
select top (@[email protected]*@lastindex) @queryfields
from @tablename
where @condition
order by @primarykey desc
) tablea
order by @primarykey asc
例如:@pageindex = 4