jquery easy ui 分頁

爲了解決大數據量下顯示數據的問題,咱們須要這樣的一個效果:用戶每次操做分頁工具欄的時候向數據庫獲取新的數據,服務器根據傳遞迴的參數肯定須要獲取的數據段,而後查詢數據庫獲取指定若干行的數據,再傳遞給前臺由Datagrid顯示出來。javascript

首先,設置datagrid的初始化java

[javascript] view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. $(function() {  
  2. $('#tableTrainee').datagrid('getPager').pagination({  
  3.                 pageSize: 10, //每頁顯示的記錄條數,默認爲10    
  4.                 pageList: [10, 15, 20, 25], //能夠設置每頁記錄條數的列表  
  5.                 onSelectPage: function(pageNumber, pageSize) {  
  6.                 SearchTrainee();//每次更換頁面時觸發更改   
  7.                }  
  8.             });  
  9.    });  

其中的SearchTrainee()方法在每次更新頁面的時候都會被加載一次。sql

其次,獲取數據並加載       數據庫

[javascript] view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. function SearchTrainee() {  
  2.            functionSearchTrainee() {  
  3.            var companyCode =$('#hiddenCompanyCode').val();   
  4.            var name = $('#txtName').val();  
  5.            if (companyCode== "") companyCode = "000";  
  6.            var dg =$('#tableTrainee');  
  7.            var opts =dg.datagrid('options');  
  8.            var pager =dg.datagrid('getPager');  
  9.            var _pageNumber =opts.pageNumber;  
  10.            var _pageSize =opts.pageSize;  
  11.            //異步獲取數據到javascript對象,入參爲查詢條件和頁碼信息  
  12.            $.post('Ajax/GetTraineeHandler.ashx', {  
  13.                Name: name,  
  14.                CompanyCode:companyCode,  
  15.                pageNumber:_pageNumber,  
  16.                pageSize:_pageSize  
  17.            }, function(data) {  
  18.            //注意此處從數據庫傳來的data數據有記錄總行數的total列  
  19.               var total = JSON.parse(data).rows[0].total;  
  20.               $('#tableTrainee').datagrid('loadData', JSON.parse(data));  
  21.               pager.pagination({  
  22.               //更新pagination的導航列表各參數  
  23.               total:total,//總數  
  24.               pageSize: _pageSize,//行數  
  25.               pageNumber: _pageNumber//頁數  
  26.                });  
  27.   });  
  28.        }  

下面的工做就是使用服務器獲取數據庫的數據了。服務器

按照以上要求的話,數據庫的查詢語句就不能使用 count(*),select * 相似須要全局搜索的語句了,由於其太耗時了。異步

網上牛人關於分頁搜索語句的帖子很是的多,搜索方法多種多樣,這裏我採用瞭如下這個:工具

  1. select top 頁大小 * from id   
  2. where id  not in  
  3. (   
  4. select top 頁大小*(頁數-1) id  from table  order by id  asc  
  5. )    

 

這個語句的優勢是不用查詢全部行,缺點是頁碼越大,查詢的效率越低。例如,一次測試中獲取一千萬行後的10行數據,約須要1分鐘。post


如今的主要問題基本是解決了,可是仍是存在很多問題:測試

1. 從服務器中獲取數據總條數的時候是使用的select count(*)語句,這樣的語句和select * 相似,都是須要搜索所有數據的,會致使大數據的狀況下變得很慢。大數據

2. 不止能夠從查詢語句方面提升查詢效率,若是能夠的話,應該給數據庫表添加索引,若是能夠添加存儲過程的話就更好了。


2013.12.30補充

在查詢數據庫的時候,也能夠採用下面這條語句

  1. SELECT TOP 頁大小 *  
  2. FROM table1  
  3. WHERE id >  
  4.           (  
  5.           SELECT ISNULL(MAX(id),0)   
  6.           FROM   
  7.                 (  
  8.                 SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id  
  9.                 ) A  
  10.           )  
  11. ORDER BY id  

比較下來,這個語句比上面使用not in語句的查詢效率更高,但仍沒法避免頁碼增大會致使效率變差的狀況,獲取1千萬行之後的10行數據仍然須要1分鐘以上。

獲取datagrid右下角那裏的總頁數,不可避免的須要使用count語句,這會出現查詢語句的短板,無奈~~

若是不帶條件的獲取總行數的話,可使用下面這條語句

SELECT ROWS FROM SYSINDEXES WHERE ID = OBJECT_ID('tableName') AND INDID = 1

注意其獲取的並不是精確值,而是服務器隔一段時間更新的數據庫表總行數。

相關文章
相關標籤/搜索