大数据量惯用优化方法

来源:CIO时代网 36大数据   作者:畅享网
2015/5/12 19:13:31
谁说畅享网不发技术类文章了,大家长长见识:)

本文关键字: 大数据 技术

 

    优化人员工作时免不了要接触到大数据量的问题,下面就将平时收集的一些关于大数据量的优化方法整理记录一下,也是和大家一起共享哦。


    1. 应尽量避免在 where 子句中对字段进行 null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:


    _selectid from t where numis null


    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:


    _selectid from t where num=0


    2. 应尽量避免在 where 子句中使用!=或<>操作符,否则将导致引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。


    3. 应尽量避免在 where 子句中使用 or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:


    _selectid from t where num=10or num=20


    可以这样查询:


    _selectid from t where num=10


    union   all


    _selectid from t where num=20


    4. in和 not in也要慎用,因为in会使系统无法使用索引,而只能直接搜索表中的数据。如:


    _selectid from t where numin(1,2,3)


    对于连续的数值,能用 between就不要用 in了:


    _selectid from t where numbetween 1 and 3

\

    5. 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。 见如下例子:


    _select* FROM T1 WHERE NAME LIKE‘%L%’


    _select* FROM T1 WHERESUBSTING(NAME,2,1)=’L’


    _select* FROM T1 WHERE NAME LIKE‘L%’


    即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。


    6. 必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:


    _selectid from t where


    可以改为强制查询使用索引:


    _selectid from t with(index(索引名)) where


    7. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:


    SELECT* FROM T1 WHERE F1/2=100


    应改为:


    SELECT* FROM T1 WHERE F1=100*2


    _select*FROM RECORD WHERESUBSTRING(CARD_NO,1,4)=’5378’


    应改为:


    _select*FROM RECORD WHERE CARD_NO LIKE ‘5378%’


    SELECTmember_number,first_name,last_name FROM members


    WHEREDATEDIFF(yy,datofbirth,GETDATE())> 21


    应改为:


    SELECTmember_number,first_name,last_name FROM members


    WHEREdateofbirth


    即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。


    8. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:


    _selectid from t where substring(name,1,3)=’abc’—name


    以abc开头的id


    _selectid from t wheredatediff(day,createdate,’2005-11-30′)=0–‘2005-11-30’


    生成的id


    应改为:


    _selectid from t where name like ‘abc%’


    _selectid from t where createdate>=’2005-11-30’and createdate<‘2005-12-1′

责编:吴朋天
vsharing微信扫一扫实时了解行业动态
portalart微信扫一扫分享本文给好友

著作权声明:畅享网文章著作权分属畅享网、网友和合作伙伴,部分非原创文章作者信息可能有所缺失,如需补充或修改请与我们联系,工作人员会在1个工作日内配合处理。
最新专题
流动存储 为大数据而生

伴随信息技术的突飞猛进,更大量级的非结构化数据与结构化数据构成的大数据成为企业级存储所面临的最大挑战:一方..

磁盘阵列及虚拟化存储

利用数组方式来作磁盘组,配合数据分散排列的设计,提升数据的安全性。虚拟化存储,对存储硬件资源进行抽象化表现。

    畅享
    首页
    返回
    顶部
    ×
      信息化规划
      IT总包
      供应商选型
      IT监理
      开发维护外包
      评估维权
    客服电话
    400-698-9918