【原创】10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)

有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下:

技术:Mvc4+Dapper+Dapper扩展+Sqlserver

目前主要实现了两种分页:一种采用 PagedList.Mvc 实现的分页

两外一种采用 ajax异步加载分页 采用比较常用的jquery.pagination 分页插件。

功能相对比较简单仅供学习交流。

通用存储过程

 1 USE [MvcProcPageDB]
 2 GO
 3
 4 /****** Object:  StoredProcedure [dbo].[ProcViewPager]    Script Date: 2017/4/23 16:41:16 ******/
 5 SET ANSI_NULLS ON
 6 GO
 7
 8 SET QUOTED_IDENTIFIER ON
 9 GO
10
11 CREATE PROCEDURE [dbo].[ProcViewPager] (
12     @recordTotal INT OUTPUT,            --输出记录总数
13     @viewName VARCHAR(800),        --表名
14     @fieldName VARCHAR(800) = ‘*‘,        --查询字段
15     @keyName VARCHAR(200) = ‘Id‘,            --索引字段
16     @pageSize INT = 20,                    --每页记录数
17     @pageNo INT =1,                    --当前页
18     @orderString VARCHAR(200),        --排序条件
19     @whereString VARCHAR(800) = ‘1=1‘        --WHERE条件
20 )
21 AS
22 BEGIN
23      DECLARE @beginRow INT
24      DECLARE @endRow INT
25      DECLARE @tempLimit VARCHAR(200)
26      DECLARE @tempCount NVARCHAR(1000)
27      DECLARE @tempMain VARCHAR(1000)
28      --declare @timediff datetime
29
30      set nocount on
31      --select @timediff=getdate() --记录时间
32
33      SET @beginRow = (@pageNo - 1) * @pageSize    + 1
34      SET @endRow = @pageNo * @pageSize
35      SET @tempLimit = ‘rows BETWEEN ‘ + CAST(@beginRow AS VARCHAR) +‘ AND ‘+CAST(@endRow AS VARCHAR)
36
37      --输出参数为总记录数
38      SET @tempCount = ‘SELECT @recordTotal = COUNT(*) FROM (SELECT ‘+@keyName+‘ FROM ‘+@viewName+‘ WHERE ‘+@whereString+‘) AS my_temp‘
39      EXECUTE sp_executesql @tempCount,N‘@recordTotal INT OUTPUT‘,@recordTotal OUTPUT
40
41      --主查询返回结果集
42      SET @tempMain = ‘SELECT * FROM (SELECT ROW_NUMBER() OVER (order by ‘+@orderString+‘) AS rows ,‘+@fieldName+‘ FROM ‘+@viewName+‘ WHERE ‘+@whereString+‘) AS main_temp WHERE ‘+@tempLimit
43
44      --PRINT @tempMain
45      EXECUTE (@tempMain)
46      --select datediff(ms,@timediff,getdate()) as 耗时
47
48      set nocount off
49 END
50
51
52 GO

Dapper

 1   /// <summary>
 2         /// 查询所有用户
 3         /// </summary>
 4         /// <returns></returns>
 5         public List<UserInfo> GetAllList()
 6         {
 7             var list = new List<UserInfo>();
 8             //string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo";
 9             using (SqlConnection conn = new SqlConnection(constr))
10             {
11                 conn.Open();
12                 //标准写法
13                 //list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList();
14                 //dapper扩展写法
15                 list = conn.GetList<UserInfo>().AsList();
16                 conn.Close();
17             }
18             return list;
19         }

Dapper分页

 1 /// <summary>
 2         /// 采用存储过程分页
 3         /// </summary>
 4         /// <param name="page"></param>
 5         /// <param name="pageSize"></param>
 6         /// <returns></returns>
 7         public UserPage GetPageByProcList(int page=1,int pageSize=10)
 8         {
 9             UserPage model = new UserPage();
10             var list = new List<UserInfo>();
11             //string sql = @"select Id,UserName,Nation,TrueName,Birthday,LocalAddressGender from UserInfo";
12             using (SqlConnection conn = new SqlConnection(constr))
13             {
14                 conn.Open();
15                 DynamicParameters parm = new DynamicParameters();
16                 parm.Add("viewName", "UserInfo");
17                 parm.Add("fieldName", "*");
18                 parm.Add("keyName", "Id");
19                 parm.Add("pageSize", pageSize);
20                 parm.Add("pageNo", page);
21                 parm.Add("orderString", "Id");
22                 parm.Add("recordTotal", 0, DbType.Int32, ParameterDirection.Output);
23                 //参数名得和存储过程的变量名相同(参数可以跳跃传,键值对方式即可)
24                 //强类型
25                 //list = conn.Query<UserInfo>("P_GridViewPager", new { viewName = "Edu_StudentSelectedCourse", fieldName = "*", keyName = "Id", pageSize = 20, pageNo = 1, orderString = "id" }, commandType: CommandType.StoredProcedure).ToList();
26                 //标准写法
27                 //list = conn.Query<UserInfo>(sql,commandType: CommandType.Text).AsList();
28                 //dapper扩展写法
29                 //list = conn.GetList<UserInfo>().AsList();
30                 list = conn.Query<UserInfo>("ProcViewPager", parm, commandType: CommandType.StoredProcedure).AsList();
31                 int totalCount = parm.Get<int>("@recordTotal");//返回总页数
32                 model.user = list;
33                 model.TotalCount = totalCount;
34                 conn.Close();
35             }
36             return model;
37         }
 1  public ActionResult Index(int page=1)
 2         {
 3
 4             #region 插入10条数据
 5
 6             //for (int i = 1; i <= 100000; i++)
 7             //{
 8             //    list.Add(
 9             //        new UserInfo
10             //        {
11             //            Id = Guid.NewGuid().ToString(),
12             //            UserName = "xiaoming" + i,
13             //            Birthday = Convert.ToDateTime("1987-12-11"),
14             //            Gender = 1,
15             //            LocalAddress = "河南省",
16             //            TrueName = "小明" + i,
17             //            Nation = "汉族"
18             //        });
19             //}
20             //ss.InsertAll(list);
21             #endregion
22             var pagelist = service.GetAllList().ToPagedList(page,10);
23             return View(pagelist);
24         }
25         public ActionResult ProcPageIndex(int page=1)
26         {
27             var list = service.GetPageByProcList(page,5);
28             return View();
29         }
30         public JsonResult GetProList(int page=1,int pagesize=10)
31         {
32             var model = service.GetPageByProcList(page, pagesize);
33             return Json(model, JsonRequestBehavior.AllowGet);
34         }

View

 1 @{
 2     Layout = null;
 3 }
 4 <link href="~/Content/bootstrap.css" rel="stylesheet" />
 5 <link href="~/Content/PagedList.css" rel="stylesheet" />
 6 <link href="~/Scripts/pagination.css" rel="stylesheet" />
 7 <div class="well">
 8     <table class="table">
 9         <thead>
10             <tr>
11                 <th>用户名</th>
12                 <th>真实姓名</th>
13                 <th>出生日期</th>
14                 <th>地址</th>
15             </tr>
16         </thead>
17         <tbody id="tbodylist"></tbody>
18
19     </table>
20
21 </div>
22 <div id="Pagination" class="pagination">
23
24 </div>
25 <script src="~/Scripts/jquery-1.9.1.min.js"></script>
26 <script src="~/Scripts/jquery.pagination.js"></script>
27 <script src="~/Scripts/bootstrap.js"></script>
28 <script type="text/javascript">
29     //分页查询开始
30     $(document).ready(function () {
31         getDataList(0, null);
32     });
33
34     var pagesize = 50;
35     var page = 1;
36     var initFlag = true;
37
38     function getDataList(currPage, jg) {
39
40         $.ajax({
41             url: "/Home/GetProList",
42             type: "get",
43             dataType: ‘json‘,
44             data: { pagesize: pagesize, page: currPage + 1 },
45             contentType: "application/x-www-form-urlencoded; charset=utf-8",
46             success: function (response) {
47                 if (response.user != null && response.user != "" && response.TotalCount != undefined && response.TotalCount > 0) {
48                     if (initFlag) {
49                         $("#Pagination").pagination(
50                                 response.TotalCount,
51                                 {
52                                     items_per_page: pagesize,
53                                     num_edge_entries: 1,
54                                     num_display_entries: 8,
55                                     callback: getDataList//回调函数
56                                 });
57                         initFlag = false;
58                     }
59                     $("#tbodylist").html("");
60                     loadDataList(response.user);
61                 } else {
62
63                 }
64
65             }
66         });
67     }
68
69     function loadDataList(listdata) {71         var tbody = "";
72         $(listdata).each(function (i, n) {
73             //表格
74             tbody += "<tr>" +
75                             "<td>" + n.UserName + "</td>" +
76                             "<td>" + n.TrueName + "</td>" +
77                             "<td>" + n.Birthday + "</td>" +
78                             "<td>" + n.LocalAddress + "</td>" +
79                        "</tr>";
80         });
81         $("#tbodylist").html(html);
82
83     }    84     //分页查询结束
85 </script>

截图

时间: 2024-10-19 23:11:51

【原创】10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)的相关文章

一般数据存储和批量数据存储比较--10万条数据

一.在数据库中建立Student表 二.创建10万条数据 创建数据 三.创建一般数据存储方法 public static void SaveGeneral(DataTable dt) { string strConn = @"Data Source=.;Initial Catalog=Test;Integrated Security=True"; SqlConnection conn = new SqlConnection(strConn); conn.Open(); SqlComma

java 批量插入10万条数据

for (int i = 0; i < 100000; i++) { dbHelper.insert("INSERT aaa(name) Values ('1')"); } 运行时间==780450ms conn = getConn(); // JAVA默认为TRUE,我们自己处理需要设置为FALSE,并且修改为手动提交,才可以调用rollback()函数 conn.setAutoCommit(false); st = conn.createStatement(); long s

C# DataGirdView 填充10万条数据

DataGirdView 填充10万条数据,用以下方式基本耗时 2秒 DataTable dt = new DataTable();DataColumn dc1 = new DataColumn("Column1");DataColumn dc2 = new DataColumn("Column2");DataColumn dc3 = new DataColumn("Column3");dt.Columns.Add(dc1);dt.Columns

性能优化:虚拟列表,如何渲染10万条数据的dom,页面同时不卡顿

最近做的一个需求,当列表大概有2万条数据,又不让做成分页,如果页面直接渲染2万条数据,在一些低配电脑上可能会照成页面卡死,基于这个需求,我们来手写一个虚拟列表 思路 列表中固定只显示少量的数据,比如60条 在列表滚动的时候不断的去插入删除dom startIndex.endIndex,不断的改变这个值来获取最新的显示列表 paddingTop.paddingBottom撑开容器的滚动区域 首先看一下当直接插入2万条列表时,页面的性能 可以看到火焰图中已经有了红色的部分了,dom渲染也耗时也有1s

批量插入100万条数据

创建数据库: --Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create table BulkTestTable( Id int primary key, UserName nvarchar(32), Pwd varchar(16)) go --Create Table Valued CREATE TYPE BulkUdt AS TABLE (Id int, UserName

极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的时间. 本实验中所用到工具为VS2008和SQL SERVER 2000.SQL SERVER 2008,分别使用5中方法将100万条数据导入SQL 2000与SQL 2008中,实验环境是DELL 2850双2.0GCPU,2G内存的服务器.感兴趣的朋友可以下载源代码自己验证一下所用时间

通过数组方式向Oracle大批量插入数据(10万条11秒)

1.创建数据库Person CREATE TABLE Person( id number, name nvarchar2(200) , age number , sex nvarchar2(200) , password nvarchar2(200) ) 2.在数据库建立一个type,对应JAVA端要传入的对象结构: CREATE OR REPLACE TYPE BUT_UKBNOV_CTC_ORDER_REC1 AS OBJECT ( id number, name nvarchar2(200

通过存储过程,插入300万条数据的一点思考?

1.今天凌晨1点多开始插入数据,到现在为止,一共插入的数据大小,大约是30M数据,但是总量在190M数据左右 2.中间我去睡觉,电脑可能也是处于睡眠状态. 3.电脑的性能也很大程度决定了这个处理数据的速度(比如,位宽,是否支持超频等等吧.) 4.灵活处理问题吧,300万条数据太多,可以选择3万条数据处理,计时处理,我们可以选择3000条数据处理,做实验就是要一个模拟环境 5.千万不要死板教条, 6.及时回顾之前的知识点,核心知识点,经常性回顾.(一定会有新收获的) 7.注意身体,身体是革命的本钱

给你100万条数据的一张表,你将如何查询优化?

1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. MyISAM只要简单的读出保存好的行数即可. 注意的是,当count(*)语句包含 where条件时,两种表的操作有些不同,InnoDB类型的表用count(*)或者count(主键),加上where col 条件.其中col列是表的主键之外的其他具有唯一约束索引的列.这样查询时速度会很快.就是可