爲了解決大數據量下顯示數據的問題,咱們須要這樣的一個效果:用戶每次操做分頁工具欄的時候向數據庫獲取新的數據,服務器根據傳遞迴的參數肯定須要獲取的數據段,而後查詢數據庫獲取指定若干行的數據,再傳遞給前臺由Datagrid顯示出來。javascript
首先,設置datagrid的初始化java
- $(function() {
- $('#tableTrainee').datagrid('getPager').pagination({
- pageSize: 10,
- pageList: [10, 15, 20, 25],
- onSelectPage: function(pageNumber, pageSize) {
- SearchTrainee();
- }
- });
- });
其中的SearchTrainee()方法在每次更新頁面的時候都會被加載一次。sql
其次,獲取數據並加載 數據庫
- function SearchTrainee() {
- functionSearchTrainee() {
- var companyCode =$('#hiddenCompanyCode').val();
- var name = $('#txtName').val();
- if (companyCode== "") companyCode = "000";
- var dg =$('#tableTrainee');
- var opts =dg.datagrid('options');
- var pager =dg.datagrid('getPager');
- var _pageNumber =opts.pageNumber;
- var _pageSize =opts.pageSize;
-
- $.post('Ajax/GetTraineeHandler.ashx', {
- Name: name,
- CompanyCode:companyCode,
- pageNumber:_pageNumber,
- pageSize:_pageSize
- }, function(data) {
-
- var total = JSON.parse(data).rows[0].total;
- $('#tableTrainee').datagrid('loadData', JSON.parse(data));
- pager.pagination({
-
- total:total,
- pageSize: _pageSize,
- pageNumber: _pageNumber
- });
- });
- }
下面的工做就是使用服務器獲取數據庫的數據了。服務器
按照以上要求的話,數據庫的查詢語句就不能使用 count(*),select * 相似須要全局搜索的語句了,由於其太耗時了。異步
網上牛人關於分頁搜索語句的帖子很是的多,搜索方法多種多樣,這裏我採用瞭如下這個:工具
- select top 頁大小 * from id
- where id not in
- (
- select top 頁大小*(頁數-1) id from table order by id asc
- )
這個語句的優勢是不用查詢全部行,缺點是頁碼越大,查詢的效率越低。例如,一次測試中獲取一千萬行後的10行數據,約須要1分鐘。post
如今的主要問題基本是解決了,可是仍是存在很多問題:測試
1. 從服務器中獲取數據總條數的時候是使用的select count(*)語句,這樣的語句和select * 相似,都是須要搜索所有數據的,會致使大數據的狀況下變得很慢。大數據
2. 不止能夠從查詢語句方面提升查詢效率,若是能夠的話,應該給數據庫表添加索引,若是能夠添加存儲過程的話就更好了。
2013.12.30補充
在查詢數據庫的時候,也能夠採用下面這條語句
- SELECT TOP 頁大小 *
- FROM table1
- WHERE id >
- (
- SELECT ISNULL(MAX(id),0)
- FROM
- (
- SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id
- ) A
- )
- ORDER BY id
比較下來,這個語句比上面使用not in語句的查詢效率更高,但仍沒法避免頁碼增大會致使效率變差的狀況,獲取1千萬行之後的10行數據仍然須要1分鐘以上。
獲取datagrid右下角那裏的總頁數,不可避免的須要使用count語句,這會出現查詢語句的短板,無奈~~
若是不帶條件的獲取總行數的話,可使用下面這條語句
SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID('tableName') AND INDID = 1
注意其獲取的並不是精確值,而是服務器隔一段時間更新的數據庫表總行數。