论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中,菜单栏中最左侧选“文件”->“选 ...
随机推荐
- Codeforces Round #345 (Div. 2) E. Table Compression 并查集
E. Table Compression 题目连接: http://www.codeforces.com/contest/651/problem/E Description Little Petya ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp
E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...
- 粗览Activiti Modeler操作和源代码
Activiti Model Editor组件 我的 了解ActivitiExplorer及其Vaadin实现方式博文里提到ActivitiExplorer使用的是Vaadin架构,但是Activit ...
- Netty游戏服务器之四protobuf编解码和黏包处理
我们还没讲客户端怎么向服务器发送消息,服务器怎么接受消息. 在讲这个之前我们先要了解一点就是tcp底层存在粘包和拆包的机制,所以我们在进行消息传递的时候要考虑这个问题. 看了netty权威这里处理的办 ...
- PTC介绍
付费点击或按就付(英文:Paid-To-Click,缩写作PTC或pay_per-click)是一种点击付费的线上商业模式.PTC的经营模式是以PTC网站作为广告客户和消费者的仲介,广告客户付钱给经营 ...
- (转)NIO 内存映射文件
内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多. 内存映射文件 I/O 是通过使文件中的数据神奇般地出现为内存数组的内容来完成的.这其初听起来似乎 ...
- You Gotta Care About the Code
You Gotta Care About the Code Pete Goodliffe IT DOESN'T TAKE SHERLOCK HOLMES to work out that good p ...
- ckeditor body与P标签去除
项目中使用到了ckeditor ,但在比编辑框的下方多出两个标签,分别是一个 body与P标签,查询代码后发现不是我们自己增加,而是组件自己就有的问题 经过查询在使用的js申请处 新增 CKEDITO ...
- 在笛卡尔坐标系上描绘函数(x*x+1)/(x*x-1)曲线
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- 【ACM】Fighting for HDU
#include <stdio.h> #include <stdlib.h> #define max 100 /* run this program using the con ...