论Top与ROW_NUMBER读取第一页的效率问题及拼接sql查询条件
http://www.cnblogs.com/Leo_wl/p/4921799.html
SELECT TOP * FROM users WHERE nID> And nID< ORDER BY nID DESC; SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY nID asc) AS rownum,* FROM users Where nID> And nID< ) AS D
WHERE rownum> AND rownum<;
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY nID asc) AS rownum,* FROM users Where nID> And nID< ) AS D
WHERE rownum BETWEEN AND ;
他们的不同之处在于“提取N条记录”的这个操作,Top N和 WHERE rownum>0 AND rownum<31。
它们具体是如何运行我讲不出理论,但是我可以做个比方:
体育老师让我们跑30步的距离,Top N的做法就是跑30步,自己边跑边数;WHERE rownum>0 AND rownum<31 相当于老师在30步的位置花了个标记,你只管死跑,到了那个标记就相当于跑了30步。我想做了标记死跑这个要快点吧,:)
在查询列表时,不要将查询总条数与查询列表数据一起执行,应分开查询,这样效果会提升
public string GetCommentCountSql(MQueryCommentsReqParam model)
{
var sql = string.Empty;
string where = GetWhereSql(model);
sql = string.Format(@"SELECT COUNT(1) FROM dbo.VipCommentProduct {0}", where);
return sql;
} private static string GetWhereSql(MQueryCommentsReqParam model)
{ string where = string.Empty;
var queryItems = new List<string>(); if (!string.IsNullOrEmpty(model.CommentIds))
{
queryItems.Add(model.CommentIds.IndexOf(',') >
? string.Format(" Id in ({0})", model.CommentIds)
: string.Format(" Id={0}", model.CommentIds));
}
else
{ //会员号
if (model.UserId != null && model.UserId > )
{
queryItems.Add(string.Format(" UserId={0}", model.UserId));
}
//会员昵称
if (!string.IsNullOrEmpty(model.ShowNickName))
{
queryItems.Add(string.Format(" charindex('{0}',ShowNickName) > 0", model.ShowNickName));
}
//订单号
if (model.OrderId != null && model.OrderId > )
{
queryItems.Add(string.Format(" OrderId={0}", model.OrderId));
}
//商品查询条件(商品名或商品
if (!string.IsNullOrEmpty(model.ProductCondition))
{
var regex = new Regex(@"^\d+$"); //正则 判断为数字
if (regex.IsMatch(model.ProductCondition))
{
queryItems.Add(string.Format(" ProductId='{0}'", model.ProductCondition));
}
else //为字符串
{
queryItems.Add(string.Format(" ProductName like '%{0}%'", model.ProductCondition));
}
}
//评论内容
if (!string.IsNullOrEmpty(model.ContentInfo))
{
queryItems.Add(string.Format(" charindex('{0}',ContentInfo) > 0", model.ContentInfo));
}
//评分
if (model.Score != null && model.Score > )
{
queryItems.Add(string.Format(" Score={0}", model.Score));
}
//精华,1:精华
if (model.IsHighLight != null && model.IsHighLight > -)
{
queryItems.Add(string.Format(" IsHighLight={0}", model.IsHighLight));
}
//是否有图
if (model.HasPic != null && model.HasPic > -)
{
if (model.HasPic == ) //无图
{
queryItems.Add(" UserImgObj is null");
}
if (model.HasPic == ) //有图
{
queryItems.Add(" UserImgObj is not null");
}
}
//是否追评
if (model.HasReComment != null && model.HasReComment > -)
{
if (model.HasReComment == ) //无追评
{
queryItems.Add(" ParentId =0");
}
if (model.HasReComment == ) //有追评
{
queryItems.Add(" ParentId >0");
}
}
//审核状态:1:未审核,2:审核通过,3:审核未通过
if (model.CheckState != null && model.CheckState > )
{
queryItems.Add(string.Format(" CheckState={0}", model.CheckState));
}
//审核人
if (!string.IsNullOrEmpty(model.CheckUser))
{
queryItems.Add(string.Format(" CheckUser='{0}'", model.CheckUser));
}
//是否回复
if (model.HasReply != null && model.HasReply > -)
{
if (model.HasReply == ) //未回复
{
queryItems.Add(" ReplyContent is null");
}
if (model.HasReply == )
{
queryItems.Add(" ReplyContent is not null");
}
}
//回复人
if (!string.IsNullOrEmpty(model.ReplyUser))
{
queryItems.Add(string.Format(" ReplyUser='{0}'", model.ReplyUser));
}
if (model.PeriodTimeType != null && model.PeriodTimeType > && (model.StartTime != null || model.EndTime != null))
{
var periodDic = new Dictionary<int?, string>()
{
{,"CheckTime"}, //审核时间
{,"AddTime"}, //评论时间
{,"ReplyTime"} //回复时间
};
if (model.StartTime != null && model.EndTime == null)
{
queryItems.Add(string.Format(" " + periodDic[model.PeriodTimeType] + ">'{0}'", model.StartTime));
}
if (model.EndTime != null && model.StartTime == null)
{
queryItems.Add(string.Format(" " + periodDic[model.PeriodTimeType] + "<'{0}'", model.EndTime));
}
if (model.StartTime != null && model.EndTime != null)
{
queryItems.Add(string.Format(" (" + periodDic[model.PeriodTimeType] + ">'{0}' and " + periodDic[model.PeriodTimeType] + "<'{1}')", model.StartTime, model.EndTime));
}
} } if (queryItems.Any())
{
where = "where " + string.Join(" and ", queryItems.ToArray());
}
return where;
}
论Top与ROW_NUMBER读取第一页的效率问题及拼接sql查询条件的更多相关文章
- 论Top与ROW_NUMBER读取第一页的效率问题
10.29 前一段时间研究关于分页的问题,由于数据库属于百万级的,考虑了关于优化方面的问题.其中一个考虑是:第一页展现的频率肯定是最高的,所以我想第一页就使用Top N来读取. 这个想法本身是没有错, ...
- Top与ROW_NUMBER
论Top与ROW_NUMBER读取第一页的效率问题 前一段时间研究关于分页的问题,由于数据库属于百万级的,考虑了关于优化方面的问题.其中一个考虑是:第一页展现的频率肯定是最高的,所以我想第一页就使 ...
- INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页
INNO 补丁制作技术, 打开 INNO 补丁制作方法的第一页 作者:xin 日期:2005-09-23 字体大小: 小 中 大 VPatch 在 INNO 中的应用. VPatch 属于专为NS ...
- python使用get在百度搜索并保存第一页搜索结果
python使用get在百度搜索并保存第一页搜索结果 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用在意我的感受 #coding:utf-8 import ur ...
- ViewPagerWithImageDemo【ViewPager如何判断滑动到第一页和最后一页以及弹出对话框功能】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录viewpager滑动的时候弹出对话框的功能(关键功能是滑动弹出对话框后,隐藏对话框的时候当前页可以还原到原位置),顺便判断首页 ...
- php分页数据最后一页继续追加第一页数据
之前做数据分页遇到这样一个需求,就是数据到最后一页的时候不能中断,继续把第一页的数据追加到后面,无限显示下去. 原文地址:代码汇个人博客 http://www.codehui.net/info/23. ...
- bootstrapTable刷新当前页码不变和从第一页开始查询
function searchAgencyProject(){ $("#statisticalProjectListTable").bootstrapTable('refresh' ...
- word2003设置页码不从第一页开始的方法
问题描述:如果你想设置页码从第三四页开始,前边不要页码,或者前边的页码是不同类型的.那么这个时候就要用到:插入->分隔符模式. 如果你的页面中的各个标题是从样式和格式中选择的,既是你先设置好各种 ...
- Word中摘要和正文同时分栏后,正文跑到下一页,怎么办?或Word分栏后第一页明明有空位后面的文字却自动跳到第二页了,怎么办?
问题1:Word中摘要和正文同时分栏后,正文跑到下一页,怎么办?或Word分栏后第一页明明有空位后面的文字却自动跳到第二页了,怎么办? 答:在word2010中,菜单栏中最左侧选“文件”->“选 ...
随机推荐
- 微软笔试Highway问题解析
High way 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 In the city, there is a one-way straight highway ...
- [典型漏洞分享]从一个手动分析的反射型XSS漏洞看待一个安全设计原则【中危】
这是在测试YS“本地相册”功能时发现的一个反射型XSS,自己在安全测试过程中也发现过不少XSS漏洞,唯独这个的发现过程有点区别. 在此之前,我在测试另外一个模块的功能接口的时候发现了一个反射型XSS, ...
- 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示
实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...
- 5 Best Gantt Chart JIRA Plugins
Andrew Stepanov/June 23, 2017/6 minutes Software developers enjoy using JIRA software for their proj ...
- js禁止复制粘贴
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键,其实是禁止快捷菜单,因为不光右键可以弹出这个菜单,键盘上空格 ...
- 深入浅出RxJava就这一篇就够了
前言: 第一次接触RxJava是在前不久,一个新Android项目的启动,在评估时选择了RxJava.RxJava是一个基于事件订阅的异步执行的一个类库.听起来有点复杂,其实是要你使用过一次,就会大概 ...
- Eureka的自我保护机制
最近项目在Kubernetes上使用Eureka遇到一些问题,在网站上找到一篇针对Eureka自我保护机制原理的文章,觉得不错,总结如下: Eureka的自我保护特性主要用于减少在网络分区或者不稳定状 ...
- OpenCV腐蚀与膨胀(Eroding and Dilating)
腐蚀与膨胀(Eroding and Dilating) 目标 本文档尝试解答如下问题: 如何使用OpenCV提供的两种最基本的形态学操作,腐蚀与膨胀( Erosion 与 Dilation): ero ...
- 如何 RESTFul 你的服务(译)
原文:http://reynders.co/how-restful-is-your-service/发表于:2013年9月 如今无论是社交媒体平台还是企业解决方案,Web services都不出不在. ...
- KISS
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ...