• SQL性能优化


    1.查询的模糊匹配

    尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 百分号会导致相关列的索引无法使用,最好不要用.

    深层原因:首先,like '%asdasd%'会造成表扫描。而且,like 并不是只有查不到的时候才遍历全表,是每次都要遍历。用like等于让索引失效。

    解决办法:

    其实只需要对该脚本略做改进,查询速度便会提高近百倍。改进方法如下:

    a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了。

    b、直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,然后再用临时表去做复杂关联

    名词:全表扫描,在数据库中,对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。http://baike.baidu.com/view/2010124.htm

    2.在可以使用UNION ALL的语句里,使用了UNION

    UNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集需要过滤掉重复记录,但由于脚本的特殊性,不可能存在重复记录,这时便应该使用UNION ALL,如xx模块的某个查询程序就曾经存在这种情况,见,由于语句的特殊性,在这个脚本中几个子集的记录绝对不可能重复,故可以改用UNION ALL)

    3.SELECT子句中避免使用‘*’

    Oracle在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

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

    避免在索引中使用任何可以为空的列,Oracle将无法使用该索引。对于单列索引,如果列包含空值,索引中将不存在此记录。对于复合索引,如果每个列都为空,索引中同样不存在此记录。如果至少有一个列不为空,则记录存在于索引中。举例:如果唯一性索引建立在表的A列和B列上,并且表中存在一条记录的A,B值为(123,null), Oracle将不接受下一条具有相同A,B值(123,null)的记录(插入)。 然而如果所有的索引列都为空,Oracle将认为整个键值为空而空不等于空。因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引。

    低效: (索引失效)

    SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;

    高效:(索引有效)

    SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;

  • 相关阅读:
    面向对象和面向过程两大编程思想的个人见解
    数据库SQL语句中根据当前日期计算其他日期小结
    数据库中用varbinary存储二进制数据
    日期的自动计算
    Chrome: Resource interpreted as Font but transferred with MIME type font/x-woff
    jQqery EasyUI dategrid行中多列数据的可编辑操作
    数据库表中存在Text类型的属性时,写sql语句时需要注意喽!
    Datawindow按指定格式导出为XML数据
    SQLSERVER 查看服务器IP地址的命令
    SQLServer 多行数据的一个字段内容合并成一个
  • 原文地址:https://www.cnblogs.com/youchun/p/1679514.html
Copyright © 2020-2023  润新知