楼主: 王楠w_n

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

[复制链接]
论坛徽章:
2
秀才
日期:2017-03-27 17:42:03火眼金睛
日期:2017-04-30 22:00:00
11#
发表于 2017-1-11 00:36 | 只看该作者
初学者过来支持
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
  能union all不union,连表时表关联语句放在最左边,单表的条件语句放在最右边。
2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
   多条件查询适合建立复合索引,索引列有null值时可能会导致索引失效。
3.如何查看到效率低的SQL?
   使用v$sql
4.请简要总结下,您的SQL语句优化技巧(至少写3点)
   使用exists不使用in,使用union all不使用union,使用truncate代替delete。

1人打赏

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2017-1-11 14:41 | 只看该作者
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
a) 索引(组合索引):限制条件、连接条件是否有索引;能不能使用到索引
b) 数据量大小:是否要分页,排序
c) 绑定变量: 大多数情况绑定变量能提高查询效率,但也有降低效率的情况
d) 尽量不要用select *,不需要的字段尽量少查,多查的字段可能有行迁移/行链接(timesten还有行外存储问题),或是lob类型的,增加io
e) 批量和并行
2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
缓存:查询特别频繁的结果是否可以缓存,比如oracle的/*+ result_cache */
索引:sql中的条件,可能没有按希望的那样使用索引

3.如何查看到效率低的SQL?
a) 定位低效sql:各种性能报告awr addm ash;性能视图;监控工具查看监控实时session,用这些手段找到可能有问题的sql
b) 分析执行计划:重点检查驱动表与被驱动表顺序、表连接算法、排序是否有索引、索引使用

4.请简要总结下,您的SQL语句优化技巧(至少写3点)
a) 索引: 排序字段有正确的索引,驱动表的限制条件有索引,被驱动表的连接条件有索引
b) rownum固定执行计划,hint固定执行计划
c) 避免隐式转换
d) union尽量写成union all
e) 左右连接尽量少写

1人打赏

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
13#
发表于 2017-1-11 15:56 | 只看该作者
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
列出列名,只返回需要的列;关联要加条件;少用distinct,union等可能排序的操作
2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
第三方应用自定义脚本产生的sql导致了笛卡儿积,通过改写脚本优化,并没有自己写SQL
3.如何查看到效率低的SQL?
在awr报告里看时间长的
4.请简要总结下,您的SQL语句优化技巧(至少写3点)
1用少量数据先运行,用来估计实际可能需要时间,不满意就及早修改
2效率不满意时,用几种等价方法来试验,比如in exists left join
3用with子句理清思路

1人打赏

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
14#
发表于 2017-1-12 01:15 | 只看该作者
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
A:业务理解正确+实现逻辑正确+减少重复计算+只取需要的列+尽量避免函数调用+合理使用分析函数

2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
A:设计的不合理、业务需求的不合理、问题SQL并非根本原因

3.如何查看到效率低的SQL?
自动:AWR+ASH+ADDM
手动:
  当前的:v$SQL+v$Session
  历史的:DBA_HIST_SQLSTAT+DBA_HIST_SNAPSHOT

4.请简要总结下,您的SQL语句优化技巧(至少写3点)
1)避免不使用绑定变量
2)等价改写(with等)
3)固定执行计划
4)收集/设定统计信息
5)创建/更改索引
6)消除表的高水位

1人打赏

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
15#
发表于 2017-1-12 01:16 | 只看该作者
lxl489591374 发表于 2017-1-11 14:41
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
a) 索引(组合索引):限制条件、连接条件是否 ...

写得不错,一看就是有经验的

使用道具 举报

回复
论坛徽章:
27
狮子座
日期:2015-11-13 11:39:31海蓝宝石
日期:2017-04-06 13:47:50祖母绿
日期:2017-04-06 13:48:00萤石
日期:2017-04-06 13:48:10蓝锆石
日期:2017-04-06 13:48:19秀才
日期:2017-04-06 18:09:28秀才
日期:2017-05-09 11:37:55秀才
日期:2017-07-11 13:54:02秀才
日期:2017-07-11 14:19:35秀才
日期:2017-08-18 11:04:35
16#
发表于 2017-1-13 14:58 | 只看该作者
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
1、考虑表没有索引或者没有用到索引,尽量使用索引,索引很多情况下可以提高查询效率
2、避免使用or语句
3、查询出的数据量过大(可以采用多次子查询,其他的方法降低数据量)
4、应尽量避免在 where 子句中对字段进行表达式操作

2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
将left join语句改写成标量子查询,效率明显提高
除了SQL改写,仔细分析sql需求

3.如何查看到效率低的SQL?
查看慢查询日志(slow_log)
查看执行计划(explain)

4.请简要总结下,您的SQL语句优化技巧(至少写3点)
1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2、很多时候用 exists和not exists代替in和not in语句是一个好的选择
3、任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。














-----------------------------------------------------------------
一个菜鸟dba的理解,请多多指教!

1人打赏

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2017-1-14 09:41 | 只看该作者
顶一下

使用道具 举报

回复
论坛徽章:
67
生肖徽章2007版:虎
日期:2009-04-18 13:52:14马上有钱
日期:2014-02-18 16:43:09马上有车
日期:2014-03-22 00:26:28itpub13周年纪念徽章
日期:2014-10-01 16:37:542015年新春福章
日期:2015-03-06 11:58:18ITPUB14周年纪念章
日期:2015-10-26 17:23:44秀才
日期:2015-11-30 09:59:23秀才
日期:2016-01-21 13:37:04秀才
日期:2016-01-25 15:02:04秀才
日期:2016-12-21 16:55:07
18#
发表于 2017-1-15 18:04 | 只看该作者
lastwinner 发表于 2017-1-12 01:15
1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
A:业务理解正确+实现逻辑正确+减少重复计算+ ...

对第一点深以为然,有时通过对业务的理解,去除不必要的查询条件,
比单纯的为优化而优化的做法来的有效。

使用道具 举报

回复
论坛徽章:
4756
季节之章:冬
日期:2019-07-13 22:29:26季节之章:春
日期:2019-07-13 22:29:26季节之章:夏
日期:2019-07-13 22:29:26季节之章:秋
日期:2019-07-13 22:29:26嫦娥
日期:2019-08-03 07:05:29玉石琵琶
日期:2019-08-03 08:17:02铁扇公主
日期:2019-08-03 21:12:36九尾狐狸
日期:2019-08-05 21:05:25玉石琵琶
日期:2019-08-06 06:36:05玉兔
日期:2019-08-06 16:05:50
19#
发表于 2017-1-15 18:37 | 只看该作者
不错,学习一下。

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:42:02秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 14:51:162015年中国系统架构师大会纪念徽章
日期:2015-09-16 12:54:392014系统架构师大会纪念章
日期:2015-09-16 12:54:392013系统架构师大会纪念章
日期:2015-09-16 12:54:392012系统架构师大会纪念章
日期:2015-09-16 12:54:392011系统架构师大会纪念章
日期:2015-09-16 12:54:392010系统架构师大会纪念
日期:2015-09-16 12:54:39秀才
日期:2015-12-25 15:31:10
20#
发表于 2017-1-17 11:46 | 只看该作者

1.您一般在写SQL时需要注意哪些问题,可以提高查询的效率?
答:首先根据需求是不是要写SQL实现。如果不用写就可以实现,那么就不写。
其次,看看这个表有多大,如果就是几百条数据,就没有所谓效率之分。怎么写效率都不低。
再次如果适合大表。首先要避免全表扫描,选择合适的谓词进行过滤。
然后查看SQL的执行计划是不是最优,然后结合统计信息看看执行计划是不是对。
都没有问题了,那么就是一个合格的SQL,自然效率得到了保障。

2.请分享一次印象深刻的SQL优化:除了SQL改写,还要考虑什么?
答:影响深刻的很多,都涉及改写。但是不全部是改写。有一次发现数据循环实在花了很多时间。而循环是根据实际一天天,从最早到现在来做的。那么理论上上线一年多的系统也就循环几百次就够了。为什么执行时间超长?不由得想到看看最开始的时间究竟是多少。一看吓一跳,是1900年,第二次鸦片战争八国联军打进北京的时候。明显这个数据质量有问题,没有做校验。我们系统是不可能出现跨几个世纪的。所以这个就是循环次数多的原因。上百年的一天天循环,能不长吗?所以我们在改写之余,也要重视一下数据质量。因为如果逻辑没有问题,那么必然是其他的因素导致了异常。

3.如何查看到效率低的SQL?
答:方法很多。Oracle有AWR 和EM中性能监控的捕获5s以上的。MySQL有慢查询日志。这些都是低效的SQL,因为低效的必然是执行时间超过了预定标准的。1毫秒的基本都是高效的。越快越高效,越慢越低效。

4.请简要总结下,您的SQL语句优化技巧(至少写3点)
答:1对查询进行优化,应尽量避免全表扫描,SQL应该包含符合客观情况的where条件;;
2应尽量避免在 where 子句中使用!=或<>操作符;
3不要使用 not in;
4绝对禁止通配符第一位是%;
5 禁止在where 子句中的“=”左边进行函数、算术运算或其他表达式运算;
6循环嵌套不得超过3层;
7避免不必要和无意义的排序;
8尽可能减少关联表的数量,关联表不要超过3张;
9 where条件一定要包含索引的第一列;

1人打赏

使用道具 举报

回复

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

本版积分规则 发表回复

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