当前位置:首页 > 开发 > 数据库 > 正文

WHERE子句应该注意的方面--来自以前培训资料

发表于: 2013-05-02   作者:coollyj   来源:转载   浏览次数:
摘要: where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索 例子:写法1:WHERE CMCC_BRANCH_CD LIKE ‘GZ%’写法2:WHERE LEFT (CMCC_BRANCH_CD, 2) = ‘GZ’比较:建议使用第一种写法,因为它允许使

where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索
例子:
写法1:WHERE CMCC_BRANCH_CD LIKE ‘GZ%’
写法2:WHERE LEFT (CMCC_BRANCH_CD, 2) = ‘GZ’
比较:建议使用第一种写法,因为它允许使用索引。而第二种写法只能用表扫描
如下:ref.TR_CELL有主键:+LOCAL_CD+CELL_CD,以下例子如果是选count(*) 则例外。
select *  from ref.TR_CELL  where local_cd like ‘_57%' with ur; --没用到索引
select *  from ref.TR_CELL  where left(local_cd,3)=‘257’ with ur; --没用到索引
select *  from ref.TR_CELL  where substr(local_cd,1,3)='257' with ur; --用到索引
select *  from ref.TR_CELL  where local_cd like '257%' with ur; --用到索引
2.WHERE后面的条件顺序影响
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
Select * from ods.to_usr where cmcc_branch_cd= ‘GZ01' and usr_sts_cd =1
Select * from ods.to_usr where usr_sts_cd=1 'and cmcc_branch_cd= ‘GZ01’
以上两个SQL中cmcc_branch_cd及usr_sts_cd两个字段都没进行索引,所以执行的时候都是全表扫描,如果:第一条SQL的cmcc_branch_cd= ‘GZ01'条件在记录集内比率为99%,而usr_sts_cd=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行cmcc_branch_cd及usr_sts_cd的比较,而在进行第二条SQL的时候0.5%条记录都进行cmcc_branch_cd及usr_sts_cd的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。因此where 中把比率小的条件放前面!

 

可利用索引的谓词:
PREDICATE TYPE
INDEXABLE
STAGE 1
INDEXABLE
COL = value
Y
Y
COL = noncol expr
Y
Y
COL IS NULL
Y
Y
COL op value
Y
Y
COL op noncol expr
Y
Y
COL BETWEEN value1 AND value2
Y
Y
COL BETWEEN noncol expr1 AND noncol expr2
Y
Y
COL LIKE 'pattern' (pattern 是 xxx%)
Y
Y
COL IN (list)
Y
Y
COL LIKE host variable
Y
Y
T1.COL = T2.COL
Y
Y
T1.COL op T2.COL
Y
Y
COL = (non subq)
Y
Y
COL op ANY(non subq)
Y
Y
COL op ALL(non subq)
Y
Y
COL IN (non subq)
Y
Y
COL = expression
Y
Y
(COL1, COLn) IN (non subq)
Y
Y
不可利用索引的谓词:
PREDICATE TYPE
INDEXABLE
STAGE 1
NON-INDEXABLE
COL <> value
N
Y
COL <> noncol expr
N
Y
COL IS NOT NULL
N
Y
COL NOT BETWEEN value1 AND value2
N
Y
COL NOT BETWEEN noncol expr1 AND noncol expr2
N
Y
COL NOT IN(list)
N
Y
COL NOT LIKE 'char'
N
Y
COL LIKE '%char'
N
Y
COL LIKE '_char'
N
Y
T1.COL <> T2.COL
N
Y
T1.COL1 = T1.COL2
N
Y
COL <> (non subq)
N
Y

 

WHERE子句应该注意的方面--来自以前培训资料

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
对于大多数程序员而言,viewstate就是页面中的名字叫做__VIEWSTATE的隐藏控件,它使我们页面体积膨
关于ListView加入HeaderView之后,点击条目时获得position参数移位的BUG修正 今天遇到一个问题,在Li
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存
原帖地址:http://wayfarer.javaeye.com/blog/444061 (1) res中的xml文件命名必须全部为小写字母,
关于ListView加入HeaderView之后,点击条目时获得position参数移位的BUG修正 今天遇到一个问题,在Li
关于ListView加入HeaderView之后,点击条目时获得position参数移位的BUG修正 今天遇到一个问题,在Li
应该注意的问题:http://hi.baidu.com/jiuyouyingling/item/a6ec7b3004d5d0f8a8842852 1.使用微软类
根据宽度高度自适应文字大小,如果textview宽度太窄了,字体会自动变小 http://www.23code.com/autos
@Override protected void onDestroy() { mHandler.removeCallbacks(mRunnable); super.onDestroy()
根据宽度高度自适应文字大小,如果textview宽度太窄了,字体会自动变小 http://www.23code.com/autos
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号