sql语句性能优化

时间:2021-11-23 06:07:22

记录一下关于SQL语句性能优化的一些要点:

  • from子句表的顺序,记录越多的表放在越前面(左),右边的表位驱动表,驱动表越小,最终扫描的数据越少。oracle解析器按照从右向左的顺序处理from子句中的表名,最右的表将被最先处理。如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其它表所引用的表。
  • where子句表达式的顺序,过滤掉最大数目记录的条件放到where子句的末尾。oracle的执行计划的条件过滤从最后向前进行,过滤数据最多的在最后可以提高数据库的查询速度。
  • select子句中避免使用‘*’,oracle在解析的过程中会将‘*’一次转换成所有的列名,这个工作是通过查询数据字典完成的,这样将耗费更多的时间。
  • 在执行结果等效的情况下,使用truncate代替delete。当删除表中记录时,在通常情况下,回滚段用来存放可以被恢复的信息,如果没有commit事务,oracle会将数据恢复到删除之前的状态。使用truncate时,回滚段不再存放任何可恢复的信息,数据不能被恢复。
  • 在查询过程中筛选条件较多时要尽量使用索引,对于like语句避免使用右匹配或者中间匹配的模糊查询。
  • 将过滤条件尽可能放到where子句中,而不是放到having子句中。having子句是用来对分组后的结果进行过滤,限制分组后的查询结果。having子句会再检索出所有记录之后才对结果集进行过滤,而且在使用having子句时一般需要执行排序、统计等操作。执行这些操作时,sql优化器会进行一些额外的工作,这就需要消耗额外的时间。
  • 使用表的别名可以减少解析的时间并避免引起歧义。
  • 使用exists替代in,用not exists替代not in。
  • 通常情况下,采用表连接的方式比exists更有效率。
  • 使用‘>=’替代‘>’,这样可直接跳到等于的记录上,会避免向前的扫描工作。