SQL查询语句优化指南

改进查询的目标是提高查询效率,改进查询要综合考虑多方面的因素,其基本点就是如何有效使用索引,没有有效利用索引的查询会造成全表扫描,当数据量很大时,查询效率十分低下,甚至是不可接受的。下面列出了常用的查询设计原则。

]     总体原则

查询优化器查看查询的每个字段,并决定对于限制需要扫描的数据量是否有用。如果一个字段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。

扫描参数SARG的定义:用于限制搜索范围的一个操作,因为它通常是指一个特定的匹配,一个值的范围内的匹配,或者两个以上条件的AND连接。形式如下:

<列名> <操作符> <常数 变量>

<常数 变量> <操作符> <列名>

如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,所以索引对于不满足SARG形式的表达式来说是无用的。

]     Like语句是否属于SARG取决于所使用的通配符的类型

如:name like ‘张% ,这就属于SARG

而:name like %张’ ,就不属于SARG

原因是通配符%在字符串的开头使得索引无法使用。

]     NOT操作符、函数会导致不满足SARG形式的语句

不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT!=<>!<!>NOT EXISTSNOT INNOT LIKE等,另外还有函数。例如:

     ABS(价格)<5000

     价格*2>5000

]     判断字段是否为空(is null is not null操作)一般是不会应用索引的,因为B树索引是不索引空值的;设计时可用一个缺省值代替空值。

]     进行了显式或隐式的运算的字段不能进行索引

ss_df+20>50,优化处理:ss_df>30

假设hbs_bh字段是字符型,那么对hbs_bh=5401002554要优化处理为hbs_bh=’ 5401002554’ ,注:此条件对hbs_bh 进行隐式的to_number转换

]     字段之间的比较不会有效使用索引

例如,Task.UserExtString1 = EA_WSBMAIN.REFNO

因为这种形式不符合SARG定义

]     经测试,EXISTSIN OR,三者的效率差不多

    Select * from table1 where tid in (2,3)

   

    Select * from table1 where tid=2 or tid=3

]     经测试,count(*)不比count(字段)

综上所述,尽量改造成“ < 字段名 > < 操作符 > < 常量 变量的 > ”的 SARG 形式。 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kingspider-sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值