论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中,菜单栏中最左侧选“文件”->“选 ...
随机推荐
- 如何释放 DB_RECOVERY_FILE_DEST_SIZE
转自原文 如何釋放 DB_RECOVERY_FILE_DEST_SIZE,有删减 oracle默認安裝之後,如何沒有手動設置歸檔路徑(alter system set log_archive_dest ...
- mysql分裤分表
1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表mem ...
- 论MORMOT序列的JSON格式
论MORMOT序列的JSON格式 JSON 数据使用 UTF-8 编码 BLOB 字段值会用 Base64编码 JSON数据是一个对象数组: [ {"col1":val11,&qu ...
- 【Rocket MQ】RocketMQ 在windows7 64位安装使用 +RocketMQ管理界面的安装
参考地址:https://blog.csdn.net/yucaifu1989/article/details/80960018 参考地址:https://blog.csdn.net/u01204090 ...
- jquery-qrcode 生成和读取二维码
首先要导入jar包(生成二维码的jar和读取二维码的jar) 生成二维码: package com.imooc.qrcode; import java.awt.Color; import java.a ...
- java中copy 一个list集合的方法
java将一个list里的数据转移到另外一个list,可以使用for语句,一次使用add方法,示例如下: ArrayList list1=new ArrayList(); list1.add(&quo ...
- iOS:导航条滚动透明度随着tableView的滚动而变化
来源:HelloYeah 链接:http://www.jianshu.com/p/b8b70afeda81 下面这个界面有没有觉得很眼熟.打开你手里的App仔细观察,你会发现很多都有实现这个功能.比如 ...
- css Table布局:基于display:table的CSS布局
两种类型的表格布局 你有两种方式使用表格布局 -HTML Table(<table>标签)和CSS Table(display:table 等相关属性). HTML Table是指使用原生 ...
- enter 键登录的实现
js 代码 document.onkeypress = function() { var iKeyCode = -1; if (arguments[0]) { iKeyCode = arguments ...
- 突破防盗链机制:使用referrer-killer
在开发it博客汇的过程中遇到一个难题:很多图片链接设置了防盗链机制,从我的网站请求图片会返回403错误,但直接在浏览器中打开图片的url时却又正常. 使用fiddler抓包发现,从我的网站请求图片会带 ...