加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer性能优化之活用临时表

发布时间:2020-12-12 15:16:29 所属栏目:MsSql教程 来源:网络整理
导读:继续调优,今天上午分析了以下一条处理时间达40秒的SQL语句 select * ? from table ?where T_table_ID in? ? ( ?? select? distinct s.t_table_id ???? from ???? (? ????? select distinct a.t_table_id,a.bt ??????? from?? ??????? (select left(bt,4) as

继续调优,今天上午分析了以下一条处理时间达40秒的SQL语句 select * ? from table ?where T_table_ID in? ? ( ?? select? distinct s.t_table_id ???? from ???? (? ????? select distinct a.t_table_id,a.bt ??????? from?? ??????? (select left(bt,4) as bbt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) a,? ??????? (select distinct left(bt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) b? ?????? where b.bbt like a.bbt and a.t_table_id<>b.t_table_id? ???????? and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' ???????? and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' ???????? and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' ???????? and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' ???????? -- order by a.bt? ????? union all? ????? select distinct a.t_table_id,a.bt ??????? from?? ??????? (select right(bt,5) as bbt,? ??????? (select distinct right(bt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) b? ?????? where b.bbt like a.bbt and a.t_table_id<>b.t_table_id?? ???????? and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' ???????? and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' ???????? and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' ???????? and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' ???????? and a.bbt not like '%'+(select right(convert(varchar(10),getdate()-1,20),2)+')') +'%'? ???????? and b.bbt not like '%'+(select right(convert(varchar(10),2)+')') +'%'? ?????? ) s?? ?? )order by bt? 基本上可以认为是对同一张表的反复操作,而且语句中夹杂了太多的全表扫描 SQLServer的执行计划我个人认为图形化界面固然是好,但是有些时候对于量化的I/O,CPU,COST输出却很不直观,此外像该SQL这样的执行计划,估计1600*1200的整个屏幕都无法显示,可以认为基本是没法看的 只能将SQL分解成若干小SQL,逐步找到瓶颈所在,例如 select left(bt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0 select distinct left(bt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0 这两个语句的执行都非常快,并且结果集也比较小,但是两条语句合并后并加上相关条件就非常缓慢。 干脆直接构建两个临时表,反正都是全表扫描,用两个临时表做相互的join,测试之后发现只需要1秒 再构建下面的两个SQL临时表,也做同样的测试 最后再全部合并到一起进行测试,发现也就是2~3秒 实际上还可以再优化一些临时表的构建,但效果达到了也就不愿意尝试了 也尝试过用CTE,不过似乎效果不佳 以下为优化后的SQL样例 /* with temp1 as (select left(bt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0),temp2 as (select distinct left(bt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0),temp3 as (select left(bt,temp4 as (select distinct left(bt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) */ print convert(varchar,getdate(),9) select left(bt,* into #temp1 from table where fsrq>getdate()-1 and gkbz=1 and scbz=0 select distinct left(bt,t_table_id into #temp2 from table where fsrq>getdate()-1 and gkbz=1 and scbz=0 select right(bt,* into #temp3 from table where fsrq>getdate()-1 and gkbz=1 and scbz=0 select distinct right(bt,t_table_id into #temp4 from table where fsrq>getdate()-1 and gkbz=1 and scbz=0 select (select ms from xtclb where dm=lmxz and lb in (130,131) ) as '栏目选择',?bt,mtly,czy ? from table ?where T_table_ID in? ? ( ?? select? distinct s.t_table_id ???? from ???? (? ????? select distinct a.t_table_id,a.bt ??????? from?? ??????? #temp1 a,? ??????? #temp2 b? ?????? where b.bbt like a.bbt and a.t_table_id<>b.t_table_id? ???????? and a.bbt not in ('aaaa','bbbb','cccc','dddd','eeee','ffff') ???????? and b.bbt not in ('aaaa','ffff') ????? union all? ????? select distinct a.t_table_id,a.bt ??????? from?? ??????? #temp3 a,? ??????? #temp4 b? ?????? where b.bbt like a.bbt and a.t_table_id<>b.t_table_id?? ???????? and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' ???????? and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' ???????? and a.bbt not like '%'+(select right(convert(varchar(10),2)+')') +'%'? ???????? and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' ???????? and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' ???????? and b.bbt not like '%'+(select right(convert(varchar(10),2)+')') +'%'? ?????? ) s?? ?? )order by bt? ?? --OPTION (loop join); ?? --34 print convert(varchar,9)?? /* drop table #temp1?? drop table #temp2 drop table #temp3 drop table #temp4 */

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读