常用的sql语句优化

常用的sql语句优化

Order by

任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。

应尽量避免在 where子句中使用!=Not <>操作符

ORACLE"遇到"NOT,他就会停止使用索引转而执行全表扫描不支持索引。可以改为 < value or > value这种支持索引的方式。

多表连接查询

ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询那就需要选择交叉表(intersection table)作为基础表交叉表是指那个被其他表所引用的表.

WHERE子句中的连接顺序 
ORACLE
采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾

SELECT子句中避免使用
ORACLE
在解析的过程中会将'*' 依次转换成所有的列名这个工作是通过查询数据字典完成的这意味着将耗费更多的时间

使用表的别名(Alias)
当在SQL语句中连接多个表时请使用表的别名并把别名前缀于每个Column.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误

EXISTS替代IN、用NOT EXISTS替代NOT IN 
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下使用EXISTS(NOT EXISTS)通常将提高查询的效率在子查询中,NOT IN子句将执行一个内部的排序和合并无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)
NOT EXISTS.

sql语句用大写的

因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行

避免在索引列上使用计算 
WHERE
子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描

UNION替换OR (适用于索引列
通常情况下UNION替换WHERE子句中的OR将会起到较好的效果对索引列使用OR将造成全表扫描注意以上规则只针对多个索引列有效如果有column没有被索引查询效率可能会因为你没有选择OR而降低.

索引

'!=' 将不使用索引记住索引只能告诉你什么存在于表中而不能告诉你什么不存在于表中;'||'是字符连接函数.就象其他函数那样停用了索引; '+'是数学函数就象其他数学函数那样停用了索引.

为你的数据库创建一个健壮的索引,那可是功德一件。可要做到这一点简直就是一门艺术。每当你为一个表添加一个索引,SELECT会更快了,可INSERT DELETE却大大的变慢了,因为创建了维护索引需要许多额外的工作。显然,这里问题的关键是:你要对这张表进行什么样的操作。这个问题不太好把握,特别是涉及DELETEUPDATE时,因为这些语句经常在WHERE部分包含SELECT命令。 

不要给"性别"列创建索引 
首先,我们必须了解索引是如何加速对表的访问的。你可以将索引理解为基于一定的标准上对表进行划分的一种方式。如果你给类似于"性别"这样的列创建了一个索引,你仅仅是将表划分为两部分:男和女。你在处理一个有1,000,000条记录的表,这样的划分有什么意义?记住:维护索引是比较费时的。当你设计索引时,请遵循这样的规则:根据列可能包含不同内容的数目从多到少排列,比如:姓名+省份+性别。

count(*)优于count(1)count(primary_key)

很多人为了统计记录条数,就使用 count(1)  count(primary_key) 而不是 count(*) ,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差,应为数据库对 count(*) 计数操作做了一些特别的优化。

带通配符(%)的like语句

通配符(%)在搜寻词首出现,Oracle系统索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时(非词首位置),优化器就能利用索引。


> 及< 操作符(大于或小于操作符)

大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。

绑定变量

Select name from table1 where id=’1’; Select name from table1 where id=’2’;这两句sql,查询优化器认为是不同的SQL语句,需要解析两次。如果采用变量,就只会解析一次。Select name fromtable1 where id=@id

大量的类似查询可以重用执行计划,这可以大大降低数据库解析SQL语句的负担。一次解析,多次重用,是提高数据库效率的原则。



不要在建立的索引的数据列上进行下列操作:

避免对索引字段进行计算操作

避免在索引字段上使用not,<>,!=

避免在索引列上使用IS NULL和IS NOT NULL

避免在索引列上出现数据类型转换

避免在索引字段上使用函数

避免建立索引的列中使用空值。


猜你喜欢

转载自blog.csdn.net/G1248019684/article/details/51366659