楼主: 王楠w_n

【大话IT】不得不说的事!SQL语句优化大盘点

[复制链接]
论坛徽章:
7
2017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2017-03-01 13:53:39秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-27 17:42:03秀才
日期:2017-03-28 15:59:38秀才
日期:2017-07-11 14:19:35秀才
日期:2018-04-08 14:48:31
21#
发表于 2017-1-17 22:15 | 只看该作者
支持一下

使用道具 举报

回复
论坛徽章:
8
2015年新春福章
日期:2015-04-22 09:15:50美羊羊
日期:2015-04-28 08:58:41暖羊羊
日期:2015-05-05 11:13:16慢羊羊
日期:2015-07-03 14:57:08目光如炬
日期:2016-06-05 22:00:002017金鸡报晓
日期:2017-01-10 15:25:58秀才
日期:2017-04-06 18:09:28秀才
日期:2017-05-09 11:37:55
22#
 楼主| 发表于 2017-1-18 13:24 | 只看该作者
lxl489591374 发表于 2017-1-11 14:41
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
a) 索引(组合索引):限制条件、连接条件是否 ...

回答的相当全面

1人打赏

使用道具 举报

回复
论坛徽章:
82
2013系统架构师大会纪念章
日期:2015-07-31 17:48:20探花
日期:2015-08-17 14:58:32榜眼
日期:2015-08-17 14:59:28进士
日期:2015-08-17 15:00:55举人
日期:2015-08-17 15:00:55秀才
日期:2015-08-19 09:36:37秀才
日期:2015-08-20 08:50:41嫦娥
日期:2015-08-21 09:11:54秀才
日期:2015-08-24 09:48:07进士
日期:2015-08-17 14:58:18
23#
发表于 2017-1-19 13:43 | 只看该作者
业务中复杂sql使用不多,一般以简单的增删改查为主。

1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
从查询的角度来说,主要就是注意索引的使用吧,独立索引和联合索引的设定,需要在建表之初就要考虑;where 条件查询注意确实使用到索引,加快查询效率;exist与in在效率上的区别,尽可能使用exist替代in;
单表查询与多表查询,join语句的使用,尽可能使结果数量少在前;

2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
跟实际业务相关,不只是sql改写的一个经验。100个分库,每个分库10张表。需要扫描前5分钟的记录进行统计,并使用分页查询。起初是select count(1) 先得到记录数量,然后在limit 进行分页查询。实际查询中发现耗时高于预期,所以改为while循环,当查询结果数小于设置的单页记录数时退出。
另外,由于扫描表数太多,所以最后不得不使用多进程执行。除了SQL本身外,还有主从同步,从库访问随业务时间延迟不同的因素都要考虑,这次的超时也与从库被大量扫描有关

3.如何查看到效率低的SQL?
mysql的话,explain查看执行计划,看是否走了索引,扫描记录数有多少;oracle和sqlserver也有工具可查。另外还有慢sql的log,注意开启

4.请简要总结下,您的SQL语句优化技巧(至少写3点)
(1)查询语句:注意检索的创建和使用
(2)插入语句:考虑是否可以批量插入,次数根据机器性能可先进行线下测试,我一般会设置在50~200之间
(3)除了语句本身,也要考虑如分页时能否通过控制单页大小、通过while循环+limit语句减少sql发送和执行次数

1人打赏

使用道具 举报

回复
论坛徽章:
0
24#
发表于 2017-1-20 09:55 | 只看该作者

求票求票求票……

使用道具 举报

回复
论坛徽章:
5
秀才
日期:2016-12-21 16:55:07山治
日期:2017-01-16 10:09:19秀才
日期:2017-02-22 15:14:12秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00
25#
发表于 2017-1-20 15:58 | 只看该作者
支持一下

使用道具 举报

回复
论坛徽章:
4
2017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2017-02-22 15:14:12秀才
日期:2017-02-22 15:18:00秀才
日期:2017-03-28 15:59:38
26#
发表于 2017-1-22 21:43 | 只看该作者
顶一下,支持支持

使用道具 举报

回复
论坛徽章:
111
ITPUB9周年纪念徽章
日期:2010-10-08 09:34:03马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-03-20 10:09:22马上有钱
日期:2014-03-20 15:53:11马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11马上有对象
日期:2014-03-20 16:14:11马上加薪
日期:2014-03-20 16:14:11技术图书徽章
日期:2014-03-27 09:30:56
27#
发表于 2017-1-26 11:25 | 只看该作者
好活动,支持! 支持楠楠同学!

使用道具 举报

回复
论坛徽章:
111
ITPUB9周年纪念徽章
日期:2010-10-08 09:34:03马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-03-20 10:09:22马上有钱
日期:2014-03-20 15:53:11马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11马上有对象
日期:2014-03-20 16:14:11马上加薪
日期:2014-03-20 16:14:11技术图书徽章
日期:2014-03-27 09:30:56
28#
发表于 2017-1-26 14:03 | 只看该作者


1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
  •   where子句连接顺序,DB2采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.表存在分区时,分区在条件使用中排在第一位,概率最大的条件放在最后。
  •   select 子句中避免使用 “*”  说明:当想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,DB2在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
  •   减少关联表的数量,不必要的维表先不要关联
  •   尽量多使用commit;提交

2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
假设有TAB1、TAB2两个表,其中TAB1表数据量较小,而TAB2表数据量很大,适用exists 。
如:    
select *
          from tab1
          where exists(select 1 from tab2 where tab1.col=tab2.col) ;

     若TAB2表数据量较小,而TAB1表数据量很大,适用in 。
   如: 
select *
          from tab1
          where tab1.col in (select tab2.col from tab2) ; 


3.如何查看到效率低的SQL?
  使用执行计划进行查看,确认那一步骤最耗时间,然后再进行优化。

4.请简要总结下,您的SQL语句优化技巧(至少写3点)
  • 尽量多使用COMMIT
  • in、exists使用规范
  • 避免不必要的排序
  • 用Where子句替换HAVING子句
  • 用UNION-ALL 替换UNION ( 如果有可能的话)
  • 尽量使用DB2的内建函数。如:replace,substr,instr等等



使用道具 举报

回复
论坛徽章:
111
ITPUB9周年纪念徽章
日期:2010-10-08 09:34:03马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-03-20 10:09:22马上有钱
日期:2014-03-20 15:53:11马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11马上有对象
日期:2014-03-20 16:14:11马上加薪
日期:2014-03-20 16:14:11技术图书徽章
日期:2014-03-27 09:30:56
29#
发表于 2017-1-26 14:03 | 只看该作者




1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
  •   where子句连接顺序,DB2采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.表存在分区时,分区在条件使用中排在第一位,概率最大的条件放在最后。
  •   select 子句中避免使用 “*”  说明:当想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,DB2在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
  •   减少关联表的数量,不必要的维表先不要关联
  •   尽量多使用commit;提交



2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
假设有TAB1、TAB2两个表,其中TAB1表数据量较小,而TAB2表数据量很大,适用exists 。
如:    
select *
          from tab1
          where exists(select 1 from tab2 where tab1.col=tab2.col) ;


     若TAB2表数据量较小,而TAB1表数据量很大,适用in 。
   如: 
select *
          from tab1
          where tab1.col in (select tab2.col from tab2) ; 




3.如何查看到效率低的SQL?
  使用执行计划进行查看,确认那一步骤最耗时间,然后再进行优化。


4.请简要总结下,您的SQL语句优化技巧(至少写3点)
  • 尽量多使用COMMIT
  • in、exists使用规范
  • 避免不必要的排序
  • 用Where子句替换HAVING子句
  • 用UNION-ALL 替换UNION ( 如果有可能的话)
  • 尽量使用DB2的内建函数。如:replace,substr,instr等等



使用道具 举报

回复
论坛徽章:
111
ITPUB9周年纪念徽章
日期:2010-10-08 09:34:03马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-03-20 10:09:22马上有钱
日期:2014-03-20 15:53:11马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11马上有对象
日期:2014-03-20 16:14:11马上加薪
日期:2014-03-20 16:14:11技术图书徽章
日期:2014-03-27 09:30:56
30#
发表于 2017-1-26 14:04 | 只看该作者




1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
  •   where子句连接顺序,DB2采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.表存在分区时,分区在条件使用中排在第一位,概率最大的条件放在最后。
  •   select 子句中避免使用 “*”  说明:当想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,DB2在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
  •   减少关联表的数量,不必要的维表先不要关联
  •   尽量多使用commit;提交



2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
假设有TAB1、TAB2两个表,其中TAB1表数据量较小,而TAB2表数据量很大,适用exists 。
如:    
select *
          from tab1
          where exists(select 1 from tab2 where tab1.col=tab2.col) ;


     若TAB2表数据量较小,而TAB1表数据量很大,适用in 。
   如: 
select *
          from tab1
          where tab1.col in (select tab2.col from tab2) ; 




3.如何查看到效率低的SQL?
  使用执行计划进行查看,确认那一步骤最耗时间,然后再进行优化。


4.请简要总结下,您的SQL语句优化技巧(至少写3点)
  • 尽量多使用COMMIT
  • in、exists使用规范
  • 避免不必要的排序
  • 用Where子句替换HAVING子句
  • 用UNION-ALL 替换UNION ( 如果有可能的话)
  • 尽量使用DB2的内建函数。如:replace,substr,instr等等



使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表