sql 针对拼接语句的优化
在日常的开发中尽量少采用拼接语句,但针对多条件联合查询,并有多字段可以偏序的情况下,的确采用拼接语句要方便简单得多,单数据库会因为传入的参数不同而产生不同的计划数,计划数多了,对数据库影响很大。
为了降低计划数,我们采用以下方法
ALTER PROCEDURE pppp
@nPageIndex INT ,
@nPageSize INT ,
@vcChatRoomId varchar(200),
@vcWXID varchar(200),
@vcType varchar(10),
@vcDay varchar(10),
@nSwith int,
@vcKeyword varchar(40),
@vcRobotWxId varchar(200),
@vcSort varchar(10)
AS
BEGIN
----优化
DECLARE @vcListSql nVARCHAR(1000)= ''
DECLARE @vcListSql1 nVARCHAR(3000)= ''
DECLARE @vcListSql2 nVARCHAR(1000)= ''
DECLARE @vcSumSql nVARCHAR(4000)= ''
DECLARE @vcCommonSql nvarchar(4000)= '' --表
DECLARE @vcSigleSql nvarchar(4000)= '' --个人
DECLARE @vcSortSql VARCHAR(100)= ''
DECLARE @vcSigleSortSql VARCHAR(100)= '' declare @temp_date_start varchar(10)
declare @temp_date_end varchar(10)
DECLARE @date1_1 varchar(50)
DECLARE @date1_2 varchar(50) DECLARE @vcPage varchar(4) if @vcKeyword =''
begin
set @vcKeyword = '%'
end
else
begin
--set @vcKeyword = '%'+RTRIM(@vcKeyword) + '%'
set @vcKeyword = '%'+@vcKeyword + '%'
end DECLARE @inAdmin VARCHAR(200)='' --排序
if @vcType = 'fy' --发言
begin
SET @vcSortSql = ' bb.inMsgCount ' + @vcSort
SET @vcSigleSortSql = ' bb.inMsgCount desc'
end
else if @vcType = 'dt' --动态
begin
set @vcSortSql = ' bb.inLinkCount ' + @vcSort
set @vcSigleSortSql = ' bb.inLinkCount desc'
end
else if @vcType = 'qd' --签到
begin
set @vcSortSql = ' bb.inQd ' + @vcSort
set @vcSigleSortSql = ' bb.inQd desc'
END
ELSE IF @vcType='gl' --管理员
begin
SET @vcSortSql = ' bb.inMsgCount ' + @vcSort
SET @vcSigleSortSql = ' bb.inMsgCount desc'
SET @inAdmin=' and inAdmin = 2'
end
ELSE IF @vcType='fhb'
begin
SET @vcSortSql = ' bb.nmMoney ' + @vcSort
SET @vcSigleSortSql = ' bb.nmMoney desc'
end
ELSE IF @vcType='qhb'
begin
SET @vcSortSql = ' bb.nmTakeMoney ' + @vcSort
SET @vcSigleSortSql = ' bb.nmTakeMoney desc'
end set @temp_date_end = CONVERT(VARCHAR(10), GETDATE(),23) if @vcDay = ''
begin
set @date1_1 ='1900-01-01 00:00:00'
set @date1_2 = @temp_date_end +' 23:59:59'
end
else if @vcDay = 'd'
begin
set @temp_date_start = CONVERT(VARCHAR(10), GETDATE(),23)
set @date1_1 = @temp_date_start +' 00:00:00'
set @date1_2 = @temp_date_end +' 23:59:59'
end
else if @vcDay = 'w'
begin
set @temp_date_start = CONVERT(VARCHAR(10), GETDATE()-7,23)
set @date1_1 = @temp_date_start +' 00:00:00'
set @date1_2 = @temp_date_end +' 23:59:59'
end
else if @vcDay = 'm'
begin
set @temp_date_start = CONVERT(VARCHAR(10), GETDATE()-31,23)
set @date1_1 = @temp_date_start +' 00:00:00'
set @date1_2 = @temp_date_end +' 23:59:59'
end --拼接Sql语句 --累计条数分页
set @vcPage = CONVERT(VARCHAR(10),(@nPageIndex * @nPageSize)) SET @vcListSql = 'SELECT ROW_NUMBER() OVER (order by OrderByColumn) as nRowNumber,aa.vcWXID,aa.vcHeadImgLocal,aa.dtLastTime,aa.nTheID,aa.vcFatherWX,aa.nRelationType
,aa.vcTag,aa.inAdmin,aa.vcGroupRemarks,aa.vcDisplayName as vcNickName,bb.inMsgCount,bb.inQd,bb.inLinkCount,bb.nmMoney,bb.nmTakeMoney ' set @vcListSql1 = ' FROM TableZZ aa JOIN (
SELECT a.vcChatRoomID,a.vcWXID ,ISNULL(c.inMsgCount,0)as inMsgCount,ISNULL(c.inSignCount,0)as inSignCount
,ISNULL(e.inQd,0) as inQd
,ISNULL(f.inLinkCount,0) as inLinkCount
,isnull(g.nmMoney,0) as nmMoney
,isnull(h.nmTakeMoney,0) as nmTakeMoney FROM TableZZ a
left join (select vcChatRoomID,vcWXID,SUM(inMsgCount)inMsgCount,SUM(inSignCount) inSignCount from tabale1
where vcChatRoomID=@vcChatRoomID
and dtReportDate >= @date1_1 and dtReportDate<=@date1_2
GROUP BY vcChatRoomID,vcWXID
) c
on a.vcChatRoomID=c.vcChatRoomID and a.vcWXID=c.vcWXID
left join (select vcChatRoomID,vcWXID,SUM(case when vcWXID is not null then 1 else 0 end) as inQd from table2
where vcChatRoomID=@vcChatRoomID
and dtCreateDate >= @date1_1 and dtCreateDate<=@date1_2
GROUP BY vcChatRoomID,vcWXID
) e
on a.vcChatRoomID=e.vcChatRoomID and a.vcWXID=e.vcWXID
left join (select vcChatRoomID,vcFormWXID,SUM(case when vcFormWXID is not null then 1 else 0 end) as inLinkCount from table3
where vcChatRoomID=@vcChatRoomID
and dtCreateTime >= @date1_1 and dtCreateTime<=@date1_2
GROUP BY vcChatRoomID,vcFormWXID
) f
on a.vcChatRoomID=f.vcChatRoomID and a.vcWXID=f.vcFormWXID
left join (SELECT vcSendWXId,SUM(nmMoney) nmMoney FROM table4
where vcChatRoomID=@vcChatRoomID
GROUP BY vcChatRoomID,vcSendWXId ) g ON a.vcWXID=g.vcSendWXId
left join (SELECT vcTakeWXID,SUM(nmTakeMoney) nmTakeMoney
FROM table5
where vcChatRoomID=@vcChatRoomID GROUP BY vcTakeWXID ) h
ON a.vcWXID=h.vcTakeWXID
WHERE a.vcChatRoomID=@vcChatRoomID and a.vcWXID <> @vcRobotWxId AND a.inStatus=0 ' set @vcListSql2 = ' and (a.vcNickName like @vcKeyword) ) bb on aa.vcChatRoomID=bb.vcChatRoomID and aa.vcWXID=bb.vcWXID'
--group by a.vcChatRoomID,a.vcWXID
--记录条数
SET @vcSumSql = 'SELECT 1 AS nResult,COUNT(*) AS nCount ' +@vcListSql1 +@inAdmin + @vcListSql2 --
SET @vcCommonSql = 'SELECT * from (' + @vcListSql +@vcListSql1 +@inAdmin + @vcListSql2 + ' ) as ChatRoomMemberList where nRowNumber BETWEEN 1 AND @vcPage' --个人
SET @vcSigleSql = 'SELECT * from (' + @vcListSql + @vcListSql1 + @vcListSql2 + ' ) as ChatRoomMemberSigle where vcWXID = @vcWXID' --针对排序语句 采用替换
set @vcCommonSql = replace(@vcCommonSql,'OrderByColumn',@vcSortSql); set @vcSigleSql = replace(@vcSigleSql,'OrderByColumn',@vcSigleSortSql); if @nSwith = 0 --是否查询个人
begin
-- 针对条件参数,采取以下方式
--显示统计
exec sp_executesql @vcSumSql,N'@date1_1 varchar(50),@date1_2 varchar(50),@vcChatRoomID varchar(100),@vcRobotWxId varchar(200),@vcKeyword varchar(40)',@date1_1,@date1_2,@vcChatRoomID,@vcRobotWxId,@vcKeyword
--分页列表
exec sp_executesql @vcCommonSql,N'@date1_1 varchar(50),@date1_2 varchar(50),@vcChatRoomID varchar(100),@vcRobotWxId varchar(200),@vcKeyword varchar(40),@vcPage varchar(4)',@date1_1,@date1_2,@vcChatRoomID,@vcRobotWxId,@vcKeyword,@vcPage
--个人信息
exec sp_executesql @vcSigleSql,N'@date1_1 varchar(50),@date1_2 varchar(50),@vcChatRoomID varchar(100),@vcRobotWxId varchar(200),@vcKeyword varchar(40),@vcWXID varchar(200)',@date1_1,@date1_2,@vcChatRoomID,@vcRobotWxId,@vcKeyword,@vcWXID
end
else
begin
--print 1
--显示统计
exec sp_executesql @vcSumSql,N'@date1_1 varchar(50),@date1_2 varchar(50),@vcChatRoomID varchar(100),@vcRobotWxId varchar(200),@vcKeyword varchar(40)',@date1_1,@date1_2,@vcChatRoomID,@vcRobotWxId,@vcKeyword
--分页列表
exec sp_executesql @vcCommonSql,N'@date1_1 varchar(50),@date1_2 varchar(50),@vcChatRoomID varchar(100),@vcRobotWxId varchar(200),@vcKeyword varchar(40),@vcPage varchar(4)',@date1_1,@date1_2,@vcChatRoomID,@vcRobotWxId,@vcKeyword,@vcPage
end end
sql 针对拼接语句的优化的更多相关文章
- SQL的拼接语句在DELPHI中怎么写
SQL 语句的拼接,关键点在于对引号的处理上. 在 delphi 的语法中,使用单引号做字符串的标志符.因此,当遇到 SQL 语句中字符串标识量编写的时候,需要用两个单引号来代替实际的引号. 举例: ...
- SQL CASE WHEN语句性能优化
背景:性能应该是功能的一个重要参考,特别是在大数据的背景之下!写SQL语句时如果仅考虑业务逻辑,而不去考虑语句效率问题,有可能导致严重的效率问题,导致功能不可用或者资源消耗过大.其中的一种情况是,处理 ...
- 记一次SQL Server delete语句的优化过程
今天测试反应问题,性能测试环境一个脚本执行了3个小时没有出结果,期间其他dba已经建立了一些索引但是没有效果. 语句: DELETE T from License T WHERE exists ( ...
- sql不用拼接语句实现动态查询条件
DECLARE @oFrom INT SELECT * FROM baseinfo AND ( ( and Type = 'Breakfast') ) or的条件可自由添加,尤其适用互斥条件的查询.
- Expert 诊断优化系列-------------针对重点语句调索引
上一篇我们说了索引的重要性,一个索引不仅能让一条语句起飞,也能大量减少系统对CPU.内存.磁盘的依赖.我想上一篇中的例子可以说明了.给出上一篇和目录文链接: SQL SERVER全面优化------- ...
- oracle中sql语句的优化
oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info (30000条数据)D ...
- SQL语句常见优化十大案例
1.慢SQL消耗了70%~90%的数据库CPU资源: 2.SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低:3.SQL语句可以有不同的写法: 1 ...
- Oracle SQL语句性能优化方法大全
Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...
- 深入MySQL(四):MySQL的SQL查询语句性能优化概述
关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...
随机推荐
- java foreach实现原理
在平时Java程序中,应用比较多的就是对Collection集合类的foreach遍历,foreach之所以能工作,是因为这些集合类都实现了Iterable接口,该接口中定义了Iterator迭代器的 ...
- 你的MongoDB Redis设置用户名密码了吗?看看shodan这款邪恶的搜索引擎吧!~
早上看新闻的时候看到了个醒目的新闻 开源中国:MongoDB 赎金事件持续发酵,究竟是谁之过? 博客园:MongoDB数据库勒索,中国受害者数量超乎你的想象,SOS! 1. 由于自己之前做过的项目,R ...
- 【JS学习笔记】提取行间事件
行间提取事件第一种方法: function 名字() { ... } oBtn.onclick=名字: 第二种方法: oBtn.onclick=function () { ... } 其实在JS当中, ...
- HDU 2064 菜鸡第一次写博客
果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...
- linux:C语言通过ICMP协议判断局域网内部主机是否存活
ICMP协议 ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方. ICMP协议是IP ...
- python3.4 data type
#coding=utf-8 #Python 3.4 https://docs.python.org/3.4/library/ #IDE:Eclipse +PyDev Window10 import a ...
- Windows设置VMware开机自动启动,虚拟机也启动
很多用windows系统电脑开发的童鞋,会在自己电脑上装一个虚拟机,然后在装一个linux系统当作服务器来使用.但每次电脑开机都要去重启一下虚拟机电源,实在是不划算.下面博主教大家在windows系统 ...
- [CSS3备忘] transform animation 等
一些CSS不经常用就会忘记,好吧,现在整理再学习一下,也留做备忘,方便以后查看... perspective的理解: 1.数值越小,用户与3D空间Z平面距离越近,视觉效果更令人印象深刻(比如看电影,越 ...
- mybatis-generator 代码自动生成工具(maven方式)
由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,mybatis-gennerator插件帮我们自动生成mybatis所需要的 ...
- vs 插件
Visual Assist 代码提示 Indent Guides