SQL优化思想

 
         在“ 2012中国数据库技术大会 ”上梁敬彬对《数据库优化方法论》进行了讲解。以下为自己对其讲解内容的理解和体会。
一、数据库优化思想
         从整体上看优化思想就是诊断 -> 优化 -> 再诊断 -> 再优化的循环过程,最终找到相对较快的执行 sql 获取需要的结果。
         下图为优化思想的详细过程,这种思想并不仅限于优化中,在创建数据库的过程中也需要类似的思想。
计算机生成了可选文字:
 
         在诊断过程中要把需求和过程结合起来,逐步细化要细化到 SQL 的每一个语句,分析某个语句是否真的必要(可能需求当中不需要但是习惯性的添加。或者在之前的语句中已经实现,在这里有重复实现等)。过程细化后找出开销较大的 sql 。这个 SQL 就是需要优化的。
         在改进优化中理解需求是前提一般客户提出的需求都是表面的需求(最终达到什么样的效果)。而隐藏需求就是开发和优化人员根据多年的工作经验总结的,大部分客户都希望的需求。个人认为表面的需求就是真正的需求加上客户自己一些不总要的需求的整合。而理解真正的需求会让工作极具有针对性,类似擒贼先擒王的样子。理解到了真正的需求会让工作事半功倍。但是我还是认为解决真正的需求后一定要解决表面的需求。毕竟表面的需求是客户希望的。
         在优化设计中选择工具是最重要的,选择什么样的工具,和使用什么样的技能,会使工作更轻松效率更高。但这与经验息息相关的。
二、优化方案
       我们会采用什么方法使 SQL 执行更快呢?在梁敬彬提到的两个案例中我总结了一下几项:
1 、建立索引(推荐)
建立索引是经常用到的方法,当数据量较大时,查询一个数据量很小的索引表的速度是明显快于表扫描的。但是建立索引还有很多方法。选择什么样的方式建立呢?我的建议是创建复合索引(这里只限于 B 树索引)。在我的《 关于复合主键查询时使用索引扫描的研究 》的文章中详细比较里复合索引与单独的索引查询速度比较。
2 、多个 CPU 并行执行一条 SQL (极不推荐)
parallel(table_short_name,cash_number)
这句话可以放在 select 之后 , 例如: SELECT PARALLEL(TABLE_SHORT,10)…
此语句会强制调用 10 CPU 去执行。但是这种方式是不推荐的,并行固然要比串行效率更高但是此为查询语句,当有多个用户同时执行此语句, Oracle 会为每个用户强制申请 10 CPU 这会耗费大量资源。并且当 CPU 总数小于所有用户需要的 CPU 总数之和就会造成大量的等待,导致系统无法正常运行。这是极其危险的。
此并行语句也可以用在创建表时使用,由于创建表只需要执行一次,所以可以使用并行来提高效率但也仅在一同空闲时使用。
3 、去掉重复数据
在查询 SQL 使用到得表中可能会有重复字段当然在 SQL 语句中可以使用 distinct 关键字或者 group by 关键字解决,但是这会影响到 sql 的执行效率。解决办法就是建立一张克隆表将重复的数据只保留一条。在 SQL 语句中使用新表并去掉 distinct group by 等关键字。
4 、判断表中是否有数据时,尽量使用 rownum= 1 条件
在某些情况我们会判断表中是否有数据,实现的方法有很多种。其中就有 select count(*) from table_name; 然后判断 count(*) 是否大于 0 ,这样是一种解决方案。当 table_name 的数据很少时效率可能很高效,但是当数据量很大时,效率就会明显降低。其实我们只是验证数据库中是否有数据。而不是有多少数据。所以我们只需要使用 select 1 from table_name where rownum = 1; 即可。

你可能感兴趣的:(SQL优化,数据库优化)