造成sql性能低大概分为两个部分:
1、程序员在开发过程中只注重查询结果的正确性,很少去考虑查询语句的效率;
2、sql语句的执行原理以及影响sql语句执行效率的原因不清楚。
sql语句书写过程中应该养成的习惯:
1、FORM规则:oracle解析器解析sql语句是从FROM关键字的最后从右自左依次解析的,两个表联查的时候将数据量小的先解析会提高效率,三个及以上表查询时将交叉表结果最小的先解析。
2、WHERE规则:Oracle采用自下而上的顺序解析WHERE子句。 根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句末尾。
3、SELECT规则:oracle数据解析会对 * 查询数据字典兑换成相应列,尽量使用详细列来查询。
4、TRANCATE规则:适用于全表删除,trancate删除表记录时无法恢复;delete在删除记录的时候会在rollback段中保存删除信息以恢复。
5、COMMIT规则
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少。
COMMIT所释放的资源:
回滚段上用于恢复数据的信息.
被程序语句获得的锁
redo log buffer 中的空间
ORACLE为管理上述3种资源中的内部花费
6、 计算记录条数
Select count(*) from tablename;
Select count(1) from tablename;
Select max(rownum) from tablename;
一般认为,在没有索引的情况之下,第一种方式最快。 如果有索引列,使用索引列当然最快。
7、 用Where子句替换Having子句
避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序、总计等操作。 如果能通过WHERE子句限制记录的数目,就能减少这方面的开销。
8、使用表的别名(Alias)
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属。