`

SQL:查询优化的几种方法

阅读更多
一、避免或简化排序
    应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
1.索引中不包括一个或几个待排序的列。
2.GROUP BY或ORDER BY子句中列的次序与索引的次序不一样。
3.排序的列来自不同的表。
    为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
二、消除对大型表行数据的顺序存取
    在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询1O亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
    还可以使用并集(UNION)来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的WHERE子句强迫优化器使用顺序存取。下面的查询将强迫对ORDERS表执行顺序操作:
SELECT * FROM ORDERS WHERE (CUSTOMER_NUM=102 AND ORDER_NUM>2003) OR ORDER_NUM=1008
    虽然在CUSTOMER_NUM和ORDER_NUM上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
SELECT * FROM ORDERS WHERE CUSTOMER_NUM=102 AND ORDER_NUM>2003
UNION
SELECT * FROM ORDERS WHERE ORDER_NUM=1008;
    这样就能利用索引提高查询效率。
三、避免相关子查询
    一个列的标签同时在主查询和WHERE子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。例:
SELECT ITEM FROM A
WHERE ITEM IN (SELECT ITEM FROM B WHERE B.NUM=50) 改为
SELECT ITEM FROM A,B
WHERE A.ITEM=B.ITEM AND B.NUM=50
    当然,并不是所有相关子查询都能避免,可以试着用一些方法来减少要检查的行的数目。
    但相关子查询若含有EXISTS谓词时,不管子查询从什么表中抽取数据,都只要判断逻辑的真假。这样DBMS的优化器就仅根据索引就可以完成工作。因此使用EXISTS谓词查询效率能比IN子查询效率高。此外尽可能用NOT EXISTS代替NOT IN,也可提高查询效能。
四、使用临时表加速查询
    把表的一个子集进行排序,创建临时表,有时能加速查询,也可以避免多次排序,如:
SELECT STUDENT.NAME,GRADE.SCORE ……
FROM STUDENT,GRADE
WHERE STUDENT.STUDENT_NUM=GRADE.STUDENT_NUM AND GRADE.SCORE<60 AND STUDENT.POSTCODE> 98000
ORDER BY STUDENT.NAME
    如果这个查询要被执行多次而不止一次,可以把所有考试没有及格的学生找出来放在一个临时文件中,并按学生的名字进行排序:
SELECT STUDENT.NAME,GRADE.SCORE ……
FROM STUDENT,GRADE
WHERE STUDENT.STUDENT_NUM=GRADE.STUDENT_NUM AND GRADE.SCORE<60 AND STUDENT.POSTCODE> 98000
ORDER BY STUDENT.NAME INTO TEMP STUDENT_SCORE
    然后以下面的方式在临时表中查询:
SELECT * FROM STUDENT_SCORE WHERE POSTCODE>”98000”
    临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
    注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
五、使用存储过程
    存储过程是存储在数据库中的一段存储程序。当创建存储过程时,系统会对其进行编译,并将执行代码存储到数据库中。因为存储过程是在服务器上运行,服务器通常是一种功能更加强大的机器,它的执行时间要比工作站的执行时问短得多,另外,由于数据库信息已经物理地在同一系统中准备好,因此就不必等待记录通过网络传递进行处理,大大减少网络通信量。而存储过程具有对数据库的立即的、准备好的访问,这使得信息处理极为迅速。通过将公共集合编写为存储过程,避免了冗余代码,从而提高了开发生产力。例如,我们可以编写用于查询表的过程,此后应用可以直接调用这些过程而无需重写SQL语句。存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。此外可以设定使用权限来限定调用存储过程以提高数据库操作的安全性。
六、用TRUNCATE替代DELETE
    当删除表中的记录时,在通常情况下,回滚段(ROLLBACKSEGMENTS)用来存放可以被恢复的信息。如果没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态。而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复。因此很少的资源被调用,执行时间也会很短。TRUNCATE 快速地从一个表中删除所有行。它和无条件的 DELETE有同样的效果,不过因为它不做表扫描,因而快得多,在大表上最有效。
    注意:要小心使用TRUNCATE,尤其没有备份的时候。使用上,想删除部分数据行用DELETE,注意带上WHERE子句,回滚段要足够大。想保留表而将所有数据删除,如果和事务无关,用TRUNCATE即可;如果和事务有关,或者想触发TRIGGER,还是用DELETE。如果是整理表内部的碎片,可以用TRUNCATE跟上REUSE STROAGE,再重新导入/插入数据。
七、尽量多使用COMMIT
    只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少。
COMMIT所释放的资源:① 回滚段上用于恢复数据的信息;② 被程序语句获得的锁;③REDOLOGBUFFER中的空间;④ORACLE为管理上述3种资源中的内部花费。
分享到:
评论

相关推荐

    sql优化的几种方法

    ### SQL优化的关键方法 #### 一、选择最有效的表名顺序 在构建SQL查询时,尤其是在涉及多个表的连接查询中,表名的顺序对于查询性能有着重要影响。Oracle数据库的解析器是从右向左处理FROM子句中的表名。为了优化...

    SQLServer数据库优化之50种方法

    ### SQL Server 数据库优化之50种方法 在IT领域,特别是对于数据库管理与优化方面,SQL Server作为一款广泛使用的数据库管理系统,其性能优化一直是DBA(数据库管理员)和技术团队关注的重点。本文将根据给定的信息...

    Sql Server查询优化

    针对上述问题,SQL Server查询优化技术主要包括以下几个方面: - 使用索引:合理地使用索引可以显著提高查询性能。需要注意的是,应该只为经常用于查询的列创建索引,并定期删除不再使用的索引。 - 维护统计信息:...

    数据库SQL查询处理及其优化方法的研究

    本文立足于SQL语言及对数据库多种操作方式的分析基础上,深入探讨了数据库SQL查询处理的基本内容与流程,并详细研究了几种SQL查询优化策略,包括索引查询、SQL语句优化以及其他常见优化方法。 #### 关键词 - 数据库...

    SQL各种查询方法

    下面我们将详细探讨SQL的各种查询方法。 1. **基本查询**:这是SQL中最基础的操作,用于从单一表中检索数据。使用`SELECT`语句,可以指定想要查询的列,例如`SELECT * FROM 表名`会返回表中的所有数据。如果只想...

    SQL Server数据库查询优化方法探究

    下面介绍几种常用的SQL Server查询优化方法: 1. **合理使用索引**:索引可以显著提高查询效率。创建索引后,可以通过索引来快速查找数据,而不是逐行扫描。然而,索引的创建和维护会增加数据库的时间和空间开销。...

    50种方法巧妙优化你的SQL Server数据库

    以下是从给定文件标题、描述、标签和部分内容中提炼出的关于“50种方法巧妙优化你的SQL Server数据库”的详细知识点: ### 1. I/O优化 - **RAID配置**:为了提高I/O性能,特别是对Tempdb数据库,建议采用RAID0配置...

    SQLServer的性能调优:解决查询速度慢的五种方法

    本文主要通过一下几个方面介绍:使用SQLDMV查找慢速查询、通过APM解决方案查询报告、SQLServer扩展事件、SQLAzure查询性能洞察等相关内容。本文来自博客园,由火龙果软件Anna编辑、推荐。SQLServer的一个重要功能是...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

     书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。  本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库...

    查看LINQ生成SQL语句的几种方法

    以下将详细介绍几种查看LINQ生成SQL语句的方法。 1. **Debug.WriteLine()** 在使用LINQ查询时,可以利用`Debug.WriteLine()`方法将生成的SQL语句打印到控制台。例如: ```csharp var query = (from customer in ...

    SQL Server数据库查询速度慢原因及优化方法

    【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:  1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)  2、I/O吞吐量小,形成了瓶颈效应。  3、没有...

    基于Oracle数据库的几种常见SQL优化策略研究.pdf

    本文将详细介绍几种常见且有效的Oracle数据库SQL优化策略。 首先,明确SQL语句优化的必要性是开展优化工作的前提。SQL语句在数据分析和应用中使用极其频繁,对于大多数应用软件而言,几乎所有的数据库操作都涉及SQL...

    MS SQL Server查询及系统优化方法的研究.pdf

    本文讨论了关系数据库处理高级查询的步骤和几种不同的查询优化方法,介绍了 Microsoft SQL Server 基于成本的优化器所采用的优化策略,并讨论了影响 Microsoft SQL Server 性能的几个因素和解决方法。 1. 查询优化...

    sql查询优化总结

    SQL查询优化是数据库管理中的一项重要任务,旨在提高查询效率,减少资源消耗,尤其是在处理大量数据时。本文将深入探讨几个关键的优化策略。 首先,影响SQL性能的主要原因之一是对大结果集进行高成本操作,例如排序...

    50种方法优化SQL Server数据库查询

    "50种方法优化SQL Server数据库查询" 在本文中,我们将讨论50种方法来优化SQL Server数据库查询,以提高查询速度和数据库性能。这些方法可以分为以下几类:索引优化、硬件升级、服务器配置、查询语句优化、数据库...

    SQL Server查询优化方法.pdf

    优化SQL查询通常包括以下几个步骤: - 评估索引:创建合适的索引来提高查询速度。 - 查询分析:使用如Query Analyzer这类工具检查查询语句的效率。 - 数据库维护:定期进行数据碎片整理(如DBCC REINDEX),收缩...

    Sql Server2005 优化查询速度50个方法小结

    Sql server2005优化查询速度51法查询速度慢的原因很多,现整理常见几种,大家可以参考下

Global site tag (gtag.js) - Google Analytics