导致SQL查询语句性能低下的3个常见原因以及优化方法
1.影响SQL性能的原因
影响SQL性能的因素很多,如初始化参数设置不合、导入了不准确的系统统计数据从而影响程序的正确判断等。纯粹从SQL语句出发,影响SQL性能的不外乎以下3个重要原因:
(1)在大记录集上进行高成本操作,如使用了引起排序的谓词等。
(2)未建立恰当的索引,导致对查询表进行全表扫描。
(3)处理了太多的无用记录,如在多表联接时过滤条件位置不当导致中间结果集包含太多无用记录。
2.SQL语句优化
关系数据库系统对于给出的查询语句,系统中的查询处理程序能自动实现查询优化。但是对于一个较复杂的查询要求,通常都可以用几种不同的查询语句来表达,虽然结果相同,但执行过程可能有很大差别。所以有必要进行SQL语句查询优化的研究,对特定的查询操作写出最优的查询语句,从而在系统开销最小的情况下对查询进行尽可能的优化。查询优化有逻辑方法的优化和物理方法的优化。
2.1.优化排序操作
当在查询语句中使用了排序谓词(order by 和 group by从句、distinct修饰符、union、intersect、minus集合操作符等),SQL语句的性能必受影响,而实际的应用中,由于主键等约束条件大部分不必排序,当待排序的数据集不大时,服务器在内存完成排序,如果排序需要更多的内存空间,服务器将对数据奉承多个小的集合,对每一集合进行排序同时向磁盘申请临时空间,将排好序的中间结果写入临时段,再对另外的集合排序,当所有集合排好序后,再合并得到最后结果。因此排序操作成本比较高昂,当数据集较大的时候,就需要尽量避免排序操作。
为了避免排序操作,需要建立恰当的索引,对经常进行排序和连键操作的字段建立索引。建立索引之后,当服务器向这些字段发出排序请求时,将直接引用索引而不进行排序操作。
2.2.合理使用查询条件
(1)避免使用否定操作符
在查询语句中应极力避免使用“<>”或“NOT”等否定操作符,因为这些操作符都会导致对表的顺序读取。表的顺序读取是导致系统性能直线下降的原因,当在表达式中使用了非搜索参数,优化器会忽略相应的查询语句或者无法进行优化,从而导致对表的顺序读取。
(2)避免使用IN语句
当查询条件中有IN关键词的时候,优化器采用OR并列条件。数据库管理系统将对每一个OR从句进行查询,将所有的结果合并后去掉重复项作为最终结果,当可以使用IN或EXISTS语句时考虑下面的原则:EXISTS远比IN的效率高。同理,使用NOTEXISTS代替NOT IN回事查询添加限制条件,从而减少全表扫描次数,从而加快查询速度以达到提高数据库运行效率。
(3)避免对索引字段进行计算操作
对索引字段进行计算操作会损害索引的功能,为了书写方便而忽略了性能代价是巨大的。如:
SELECT COUNT(C1) FROM TBL_1 WHERE SUBSTR(C1,0,2) = '01' --耗时0.219S
SELECT COUNT(C1) FROM TBL_1 WHERE C1 LIKE '01%' --耗时0.015S
明日续......