|
本帖最后由 xuexiaogang 于 2017-6-16 12:53 编辑
1. SQL优化可以用到那些性能工具
答:书中提到了一种是不同调优场景的分析,可分为单纯场景的优化和复杂场景的优化;
(这种我平时经常遇到的就算这种,最高纪录是15小时的SQL调到6秒)
而另一种是基于这些场景的工具应用,就是针对单纯场景的优化手段和复杂场景的优化手段。几个工具AWR、ASH、ADDM、AWRDD,EM,执行计划工具都用上。可能需要结合业务或者算法、乃至实现逻辑等都要慎重的考量。
2. 如何缩短SQL调优时间
答:这个有点歧义。是说如何将10S的调到1S。还是说用半个小时做到了调优,怎么能在5分钟内做到同样效果。
如果说是前者我觉得应该是,分析执行慢的原因,是嵌套问题,还是全表扫描导致,是返回行数过多,还是索引失效等各种各样的问题。找到问题选择合适的对策都应该可以解决的。
如果说是后者的话,那么就考验DBA的功底和对系统的熟悉程度。迅速定位的问题所在。这是需要一些功力的。优化的核心就是减轻IO。我记得有一句话说的是,优化就是降低单位时间内的负载。
3. 影响性能的常见因素
答:我经历最多的有以下问题:
没有索引;
有索引但是where的谓词没有用到;
索引为差异度低的列上;
没有用到先导列;
笛卡尔积;
应该关联查询,变成了嵌套查询;
数据查询集量过大;
没有绑定变量;
第一位为%通配符;
没有where条件,全表检索或者多表全表关联;
大量无意义的排序(count时,插入时);
IO性能低;以及IO争用严重;
单次提交,没有批量提交;
大量insert update 最后delete;
建立了不合适的视图,以此为基础进行大量查询;
死锁;
4. 学习索引的重要性
答:索引不仅仅有普通的B-tree索引,还有位图索引,分区索引,反向索引,全文索引、函数索引等等。
任何一种都有其应用场景,换句话说都有自己的优势和劣势。我们要恰当使用,用它擅长的一面,而不用乱用。否则不仅无助于系统性能提高,反而让系统性能下降。学习到深入就发现,其实Oracle MySQL 还有PG等 查询优化器都是基于成本的。而这些成本就来自于统计信息。Oracle特有还有直方图的概念。只有结合这些设计索引才是好的索引。
5. SQL优化的误区
答:不能觉得比原来快了就是优化好了,而是看看是不是优化到极致了。比如原来10S,现在1S了。不一定是大功告成了,有可能还可以做到10毫秒。
不能仅仅是对SQL的优化,如果仅仅改写SQL,那么优化范围很小。如果提出表设计要改动,那么这个就是一个大的变革了。即优化不仅仅是SQL,还可能是设计。
另外还可以问问业务到底要什么,看看实现上是不是可以改进。这就是逻辑实现了。
还可以根据需求,看看有什么算法可以使用的,而不是简单粗暴的把要求的过滤条件一个个拼接在where后面。
还有一些简单的,不是每一列都来一个单独索引;
也不是强制索引就好;
更加不是一味的提升硬件加内存,加CPU。有时候不仅加了没有用而且就是投入1000倍的成本不见得有1000倍的提升。
|
|