朱庆烨 无锡市人力资源和社会保障信息中心
在社保卡管理系统的各大数据库中,都存在着大量的数据信息和记录,每天都需要对它们进行各种大量的数据操作。SQL作为数据库系统的标准语言,SQL语句可以被用来执行各种各样的操作,比如数据的查询、更新、删除等等。在使用SQL语句时,一般大家往往只是关心得到的结果的准确性,不会去关注其执行效率性;不同的SQL语句能得到同样的结果,但它们之间的效率可能会差几十甚至上百倍。随着数据库技术的不断发展,数据量的不断累积,如何优化SQL语句以提高工作的效率也成了重要的问题;本人依照实际工作--社保卡数据库管理中遇到的一些情况,通过几个方面来谈谈如何通过优化SQL语句来提高日常的工作效率。
索引是数据库中最常用也是十分重要的数据对象。合理在数据库中创建和使用一个索引,可以起到优化语句的执行效率,提高响应速度的效果。创建和使用索引需要遵循以下原则:
对使用很频繁的列创建索引;
在需要进行多列排序时,可以在这些列上创建一个复合索引;
对于频繁操作的GROUP BY和ORDER BY列创建索引 ;
尽量不要对值很少的列创建索引,比如个人信息表中“性别”字段,值就“0”、“1”和“2”;
不要对经常进行Update、Insert、Delete操作的表创建太多的索引,一般不要超过7个。
因为社保系统用的是Oracle数据库,所以我在写代码之前会注意选择表名和条件的顺序问题,因为Oracle对表名采用的是从右到左的顺序解析,对条件采用的是自下而上的顺序解析,所以我都会注意它们之间的关系和排序。
表名排序一般都是把基础表(也就是数据记录总数少的表)放在后面。条件排序一般把多表之间的连接放在其它条件之前,除非它是可以是过滤掉大数量数据的连接,那就可以放到句末。
在日常工作中,如果需要在大量数据中查询符合某些特定条件的数据时,我们一般会用到含通配符(%)的like语句。要注意的是,通配符(%)一般不要放在语句的词首。
我们在日常工作中会发现,在对一张表进行查询时,往往为了满足一个条件,会需要对另外一张表进行联接,一般会经常使用到两个语句,EXISTS和IN,这两种语句可以达到的结果是一样的;从格式上讲,IN语句比较容易理解;但是在执行效率方面,EXISTS语句会比较高效,EXISTS语句先执行主查询,然后执行子查询,找到匹配的数据,而IN语句先执行子查询,得到的结果列表存储在一个增加临时表的索引,再去到主查询。
在数据库中存在有很多种的数据类型,很多数据表面上看似一样,其实数据类型不一定一样;如果你不注意写的语句,它有可能会使优化器无法执行的一些操作可以被优化,从而降低了执行效率。在Oracle中不兼容的数据类型有:integer和float,varchar和char,binary和long binary等等。
(1)SQL语句中使用了不等于操作符‘!=’和‘<>’,即使该列上有索引,那该索引也不能使用。
(2)使用IS NULL或IS NOT NULL将会限制使用索引,因为NULL值没有定义。
(3)语句中使用了函数也会会停用索引,如字符连接函数‘||’、数学函数‘+’等。
(4)相同的索引列之间不要进行比较,否则将会启用全表扫描。
(5)如果数据类型不匹配,进行比较的话,会自动限制索引的使用。
(6)在Where子句中尽量用OR来代替NOT。
通过对SQL语句的执行过程分析,我们可以看到,能提高工作效率的SQL语句基本上是优化过SQL语句,平时工作中可以从上述几个方面进行优化和改进,从而提高工作效率。当然,具体的优化改进方案,仍然需要根据实际需求和特定的数据库环境来定。只有在日常工作中通过不断的总结、积累和学习,才能写出高质量高效的SQL语句,当然这也只是提高效率的一个方面,其它方面的设计也要进行同步优化。总之,通过以上几个方面的综合优化,会使SQL语句的工作效率有一定的提升。
[1]徐凤梅.关系数据库中SQL查询语言的优化策略广西轻工业,2009
[2]吴险峰.SQLSERVER环境下的SQL优化方法探讨.电脑知识与技术,2008