改进查询的目标是提高查询效率,改进查询要综合考虑多方面的因素,其基本点就是如何有效使用索引,没有有效利用索引的查询会造成全表扫描,当数据量很大时,查询效率十分低下,甚至是不可接受的。下面列出了常用的查询设计原则。
] 总体原则
查询优化器查看查询的每个字段,并决定对于限制需要扫描的数据量是否有用。如果一个字段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。
扫描参数SARG的定义:用于限制搜索范围的一个操作,因为它通常是指一个特定的匹配,一个值的范围内的匹配,或者两个以上条件的AND连接。形式如下:
<列名> <操作符> <常数 或 变量>
或
<常数 或 变量> <操作符> <列名>
如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,所以索引对于不满足SARG形式的表达式来说是无用的。
] Like语句是否属于SARG取决于所使用的通配符的类型
如:name like ‘张%’ ,这就属于SARG
而:name like ‘%张’ ,就不属于SARG。
原因是通配符%在字符串的开头使得索引无法使用。
] NOT操作符、函数会导致不满足SARG形式的语句
不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT 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定义
] 经测试,EXISTS、IN 和 OR,三者的效率差不多
Select * from table1 where tid in (2,3)
和
Select * from table1 where tid=2 or tid=3
] 经测试,count(*)不比count(字段)慢
综上所述,尽量改造成“ < 字段名 > < 操作符 > < 常量 或 变量的 > ”的 SARG 形式。