数据库优化查询计划的方法
- 格式:doc
- 大小:49.50 KB
- 文档页数:5
数据库查询优化的基本原则与方法数据库查询是现代应用程序中常见的操作之一,但是查询性能的提升往往被忽视或者被抱以为无法改善。
然而,通过优化数据库查询,可以大幅度提升应用程序的性能和用户体验。
本文将介绍数据库查询优化的基本原则与方法,旨在帮助开发人员更好地理解和应用这些技术,从而提升应用程序的性能。
1. 选择合适的索引索引是数据库中重要的组成部分,能够提高查询效率。
在选择索引时,需要考虑频繁查询的字段,并根据查询的复杂性和频率进行索引的建立。
根据实际数据量的大小和查询频率,可以选择单列索引、复合索引或全文索引等。
2. 优化查询语句合理编写查询语句是优化查询性能的基础。
首先,需要避免多表关联查询和使用不必要的子查询,可以通过合理设计数据表的结构来减少关联查询。
其次,需要避免使用“select *”的写法,只查询需要的字段,减少返回数据量。
3. 使用连接查询代替子查询在某些情况下,可以使用连接查询代替子查询来提高查询性能。
连接查询可以将多个表的结果进行关联,减少数据库的查询次数。
尽量使用 INNER JOIN 等连接语句,而不是使用子查询。
4. 避免使用全表扫描全表扫描是指在没有使用索引的情况下对整个表进行扫描。
全表扫描会消耗大量的系统资源,影响查询性能。
通过合适的索引和优化查询语句,尽量避免全表扫描的情况。
5. 适当分页查询当查询结果较大时,可以考虑使用分页查询来提高性能。
分页查询可以将查询结果分片返回,减少网络传输和页面加载时间。
合理设置分页大小,避免一次性返回过多的数据量。
6. 数据库设计优化良好的数据库设计是优化查询性能的基石。
首先,需要避免冗余数据的存在,可以使用关系模型进行数据表设计。
其次,需要合理划分数据表,根据业务逻辑划分成多个小表,减少查询的复杂性。
另外,可以使用视图、存储过程和函数等方式来优化查询。
7. 定期分析查询性能定期分析查询性能是不可忽视的一步。
通过数据库的性能监控工具,可以了解查询的性能情况和瓶颈所在。
优化数据库查询的六种方法数据库查询是开发过程中常见的操作,对于大型系统来说,查询的性能优化至关重要。
本文将介绍六种常用的优化数据库查询的方法,帮助开发人员提升系统的性能。
一、合理设计数据库结构良好的数据库结构是查询性能优化的基础。
在设计数据库时,需要合理划分表和字段,遵循范式原则,避免冗余数据和不必要的连接。
另外,可以使用索引来加速查询,选择适当的数据类型,减小存储空间,提高查询效率。
二、减少查询数据量优化查询的关键是减少查询的数据量。
通过精确的条件筛选和投影查询可以减少返回的数据条目,提高查询速度。
合理使用WHERE子句、GROUP BY子句和HAVING子句,尽量避免全表扫描和排序操作。
三、使用适当的索引索引是提高查询效率的重要手段。
在选择索引时,需要考虑查询的频率和字段的选择性。
高频率的查询字段和选择性较高的字段适合创建索引,而低频率的查询字段和选择性较差的字段则可以不考虑。
同时,需要定期维护索引,避免过多的无效索引对性能造成影响。
四、避免跨表查询和多重连接跨表查询和多重连接通常导致性能下降,应尽量避免使用。
可以通过合理的数据库设计和多表关联查询来减少跨表查询的次数。
此外,可以使用子查询、联合查询和视图等方式代替多重连接,提高查询效率。
五、使用缓存技术缓存技术是提高查询性能的有效手段。
可以使用缓存存储查询结果,当有相同查询请求时,直接从缓存中读取数据,避免重复查询数据库。
同时,需要合理设置缓存的过期时间和更新策略,保证数据的及时性和准确性。
六、定期优化数据库定期优化数据库是保证查询性能持续稳定的重要措施。
可以通过数据库性能分析工具来监控查询的执行计划和性能指标,及时发现和解决潜在问题。
另外,可以进行数据库的分区、拆分和归档,优化数据库的管理和维护。
综上所述,优化数据库查询是提升系统性能的关键步骤。
通过合理设计数据库结构、减少查询数据量、使用适当的索引、避免跨表查询和多重连接、使用缓存技术以及定期优化数据库,可以有效提高查询的效率和性能,提升用户的体验和系统的可用性。
非关系型数据库的查询处理与优化方法随着互联网的快速发展和大数据的持续增长,数据库的查询处理成为了一个重要的研究方向。
在传统的关系型数据库中,查询处理的性能问题逐渐凸显出来,尤其是面对大规模数据和高并发访问的情况。
为了解决这个问题,非关系型数据库(NoSQL)被广泛应用。
本文将介绍非关系型数据库的查询处理和优化方法。
一、非关系型数据库的查询处理方法1. 索引索引在非关系型数据库中同样起着重要的作用。
通过创建合适的索引,可以大大提高查询的效率。
一些常见的索引类型包括哈希索引、B树索引和位图索引等。
哈希索引适用于等值查询,通过哈希函数将键映射到存储位置;B树索引适用于范围查询,通过维护有序的B树数据结构实现快速查找;位图索引适用于具有大量重复值的列,通过位图标志的方式高效地进行查询。
2. 分布式查询非关系型数据库通常采用分布式架构,数据分布在多个节点上。
查询处理涉及到跨节点的数据访问和计算,在设计查询时需要考虑数据的分布和负载均衡。
常见的分布式查询方法包括并行查询、分片查询和全局统计等。
并行查询利用多个节点同时处理查询,提高了查询的并发度;分片查询将数据划分为若干片段,分布在不同的节点上进行查询,减少了单个节点的查询负载;全局统计则用于从全局数据中获取统计信息,辅助查询优化。
3. 缓存非关系型数据库通常具有高速的读取能力,通过缓存机制可以减少重复查询和加快查询响应时间。
缓存可以采用内存缓存或分布式缓存,将频繁访问的数据存储在缓存中,减少对数据库的访问压力。
在设计查询时,可以使用缓存机制预先计算和存储一些常用的查询结果,提高查询的响应速度。
二、非关系型数据库的查询优化方法1. 数据模型设计在非关系型数据库中,数据模型的设计对查询性能有着直接的影响。
根据具体的业务需求,选择合适的数据模型,避免冗余和复杂的关系结构,能够提高查询的效率。
一般来说,数据模型的设计应该尽量符合横向扩展的原则,充分利用分布式数据库的优势。
数据库管理系统的查询优化技术数据库管理系统(DBMS)是一种用于管理和组织大量数据的软件工具。
在现代企业和组织中,数据库管理系统扮演着重要的角色,用于存储和检索各种形式的数据。
为了提高数据库的性能和效率,查询优化技术是至关重要的。
一、查询优化的概念查询是用户向数据库提出的问题,查询优化则是通过改进查询的执行计划和算法,以提高查询性能和效率。
查询优化的目标是使查询在最短的时间内返回准确结果,同时减少系统的资源消耗。
二、查询优化的原则1. 选择合适的索引:在数据库中,索引扮演着重要的角色,可以加速数据的检索。
通过创建适当的索引,可以使查询更快地定位和检索所需的数据,从而提高查询性能。
2. 优化查询语句:查询语句的编写方式直接影响查询的执行效率。
合理地使用查询语句中的关键字和语法结构,可以减少不必要的数据访问和计算,提高查询效率。
3. 缓存数据:数据库管理系统通常会将一部分数据缓存在内存中,以加快数据的访问速度。
通过合理地设置缓存策略和缓存大小,可以减少磁盘I/O操作,从而提高查询性能。
4. 并行处理:现代数据库管理系统支持并行处理,可以将一个查询分成多个子查询,并行地执行。
通过合理地划分查询任务和优化并行执行的算法,可以显著提高查询性能。
5. 硬件优化:数据库的性能不仅受软件的影响,还受硬件的限制。
因此,在进行查询优化时,还应该考虑硬件的优化,如选择更快的存储设备、增加内存容量等。
三、常用的查询优化技术1. 查询重写:通过对查询语句进行改写,以减少查询的执行时间和资源消耗。
查询重写的方法包括条件推导、视图优化、谓词下推等。
2. 查询合并:将多个查询合并为一个查询,减少了多次查询的开销。
查询合并的方法包括连接消除、连接推送等。
3. 查询预处理:对查询进行预处理,如查询的语义分析、语法转换等。
通过查询预处理,可以提前检测查询语句的错误,并进行相应的修正和优化。
4. 查询计划优化:通过分析查询语句的语义和结构,选择最优的查询执行计划。
数据库查询优化算法与方法随着互联网的迅猛发展和企业数据规模的不断增加,数据库成为了应用程序中不可或缺的组成部分。
而数据库查询则是数据库最频繁使用的功能之一,因此数据库查询的性能优化显得格外重要。
本文将介绍一些常见的数据库查询优化算法和方法,旨在提高数据库查询的性能和效率。
1. 索引优化索引是优化数据库查询的常见方法,它能够加快查询速度,并减小数据库的存储空间。
在设计数据库时,我们需要根据查询需求选择适当的字段进行索引。
常见的索引类型包括唯一索引、主键索引、聚集索引和非聚集索引等。
合理使用索引可以大幅度减少全表扫描,避免不必要的查询开销。
2. 查询优化器查询优化器是数据库管理系统中的重要组成部分,通过选择合适的查询执行计划来实现查询性能的最优化。
查询优化器根据查询语句的各种条件和数据分布等信息,采用一系列的优化算法来选择最佳执行计划。
例如,查询优化器可以根据统计信息来判断是否使用索引,以及选择合适的连接操作(如哈希连接、嵌套循环连接等)等。
3. 冗余数据清理数据库中的冗余数据会增加数据存储占用和查询负担。
通过定期清理冗余数据可以减小数据库的存储空间,并提高查询性能。
冗余数据的清理可以通过定期的数据清理任务来实现,例如删除旧日志、清理过期数据等。
此外,合理的数据归档和分区也可以降低查询负担和优化查询性能。
4. 批量操作在执行数据库查询时,尽量采用批量操作而非逐个操作,可以大大提高数据库查询的性能。
批量操作可以通过批量插入、批量更新和批量删除等方式来实现。
例如,使用批量插入可以减少插入操作的次数,提高插入效率。
通过批量操作,减少了与数据库之间的交互次数,从而提高了查询性能。
5. 分页查询优化对于大数据集的查询,通常需要进行分页处理。
数据库查询的分页操作可能会面临大量的数据扫描和排序,耗时较多。
为了优化分页查询,可以采用一些常见的方法。
一种是使用limit和offset语句,将查询结果分成多个分页获取。
数据库查询优化的方法数据库是存储和管理数据的重要工具,而查询是数据库应用中最为常见的操作之一。
然而,随着数据库中数据量的增加以及查询请求的复杂性增加,查询性能逐渐成为了一个重要的问题。
为了提高数据库查询的效率和性能,以下是一些数据库查询优化的方法。
1. 创建索引:索引是数据库中提高查询效率的重要手段之一。
索引可以加快查询的速度,避免全表扫描的开销。
在设计数据库表结构时,需要根据查询需求和字段的选择性合理地创建索引。
常见的索引类型包括主键索引、唯一索引和组合索引等。
2. 合理设计数据库结构:数据库的结构设计对查询的性能有着重要的影响。
合理地设计数据库表之间的关系、字段的数据类型以及表的范式化等都可以提高查询效率。
尽量避免冗余字段、重复数据以及表之间的多对多关系等设计不合理的情况。
3. 优化查询语句:查询语句的编写和优化也是提升查询性能的关键。
首先,需要避免不必要的查询,只检索所需字段,尽量减小结果集的大小。
其次,可以通过合理的条件筛选、使用合适的连接方式以及避免复杂的子查询等手段优化查询语句。
另外,使用预编译语句和参数化查询可以避免SQL注入攻击,并提高查询效率。
4. 定期统计和分析数据库性能:监控和分析数据库的性能是优化查询的重要手段之一。
通过定期分析数据库的性能指标,例如响应时间、IO利用率、缓存命中率等,可以及时发现潜在的性能问题,并进行相应的调整和优化。
5. 数据库分区和分表:对于大规模的数据库,采用分区和分表的方式可以提高查询的效率。
通过将数据库按照某种规则分成多个部分,可以将查询的压力均摊到多个分区上,从而提高查询的并发性能。
6. 合理调整数据库参数:对于不同的数据库,可以根据实际情况调整一些数据库参数,以提高查询的性能。
例如,可以调整缓存大小、并发连接数、查询缓存等。
7. 数据库服务器的硬件升级:如果数据库查询的性能问题严重影响了系统的正常运行,可以考虑对数据库服务器进行硬件升级。
例如,增加内存容量、提升硬盘性能、优化网络带宽等都可以进一步提高查询效率。
数据库执行计划的优化与调整方法数据库执行计划的优化和调整是数据库管理中十分重要的一项工作,通过对执行计划的优化,可以提高数据库查询的性能和效率,从而提升系统的整体运行效果。
本文将介绍一些常用的数据库执行计划的优化与调整方法。
一、了解并分析执行计划在进行数据库执行计划的优化与调整之前,首先需要了解执行计划的具体情况,并进行分析。
数据库管理系统提供了一些工具和命令来获取执行计划,如MySQL中可以使用EXPLAIN关键字或者调用查询分析工具获取执行计划。
通过分析执行计划,我们可以获知查询的优化潜力,了解查询是否可以使用索引、是否存在表的扫描等问题。
二、合理设计数据库表结构数据库表结构的设计对执行计划的影响很大。
一个合理的数据库表结构可以提高查询效率,减少查询所需的资源消耗。
首先,我们需要遵循数据库设计的基本原则,如避免冗余数据、避免表之间的过度耦合等。
其次,需要根据实际情况选择适当的数据类型和字段长度,以节省存储空间和提高查询效率。
此外,在设计表结构时应考虑到查询的频率,将经常一起查询的字段放在一个表中,尽量减少表的关联关系,减轻数据库的负担。
三、合理创建和使用索引索引是提高数据库查询效率的重要手段之一。
在合理创建和使用索引时,需要根据数据库表的特点和查询的需求进行考虑。
一般来说,主键和唯一性约束列可以创建唯一索引,常被作为表查询的过滤条件。
对于频繁作为查询条件的字段,也可以创建非唯一索引来提高查询速度。
需要注意的是,过多或不合理的索引会增加数据库的维护成本,并可能引起查询性能下降,因此在创建索引时需要权衡利弊。
四、优化查询语句优化查询语句可以直接影响数据库执行计划的生成和执行效果。
在编写查询语句时,一般遵循以下原则。
首先,尽量减少查询返回的记录数目,可以通过添加筛选条件或限制查询的返回条数来实现。
其次,避免使用函数操作数据库字段,这会导致索引失效、查询性能下降。
此外,应尽量避免使用通配符查询(如'%ABC%'),因为这种查询很难使用索引。
数据库慢查询优化的方法与技巧数据库是现代应用程序中不可或缺的组成部分,它负责存储、管理和提供数据。
然而,随着数据量的增长和复杂查询的增加,数据库查询性能可能会变得缓慢。
在这篇文章中,我们将探讨一些常见的数据库慢查询优化方法和技巧,帮助您提高数据库查询的执行效率。
1.适当的索引策略索引是提高数据库查询速度的重要手段之一。
通过对经常被查询的列创建索引,可以减少数据库查询的扫描次数,从而提高查询性能。
然而,过多或不恰当的索引可能会导致性能下降。
因此,在进行索引优化时,在经常被查询的列上创建适当的索引,并避免索引重叠和冗余是非常重要的。
2.优化SQL查询语句良好的SQL查询语句可以显著提高数据库的执行效率。
首先,避免使用SELECT *语句,因为它会返回所有列的数据,而不仅仅是需要的数据。
其次,尽量避免使用复杂的子查询和嵌套查询,这些查询可能会导致性能下降。
此外,合理利用JOIN和WHERE子句来限制查询结果的数量,从而提高查询性能。
3.合理分配硬件资源数据库的性能不仅取决于软件层面的优化,还与硬件资源的分配有关。
确保数据库服务器具有足够的处理能力、内存和存储空间,可以提高数据库查询的执行效率。
此外,可以考虑使用更快的存储设备,如固态硬盘(SSD),以加快数据库的读写速度。
4.定期更新统计信息数据库在执行查询时,会根据统计信息生成查询执行计划。
因此,定期更新统计信息可以帮助数据库优化查询执行计划,从而提高查询性能。
可以使用数据库管理工具或定期脚本来更新统计信息,确保它们与数据库中的实际数据保持一致。
5.分区和分表技术在处理大型数据集时,分区和分表技术可以提高数据库查询的执行效率。
分区可以根据数据范围、哈希值或列表将数据划分为多个逻辑部分,并分别存储在不同的物理位置。
而分表是将大型表拆分成多个小表,每个小表包含部分数据。
这些技术可以减少查询的扫描范围,从而提高查询性能。
6.避免过多的数据库连接数据库连接是应用程序和数据库之间的通信通道。
数据库查询优化方法在OLAP系统中的实践随着大数据时代的到来,越来越多的企业开始使用OLAP(联机分析处理)系统来处理大规模数据集和复杂的分析查询。
OLAP系统的性能依赖于数据库查询的效率,因此,数据库查询优化在OLAP系统中的实践显得尤为重要。
本文将介绍一些常见的数据库查询优化方法,并讨论其在OLAP系统中的应用。
在OLAP系统中,数据通常以多维模型进行存储和查询。
多维模型中的数据被组织成多个维度,比如时间、地理位置和产品等。
对于大型数据集,一次查询可能涉及到大量的数据,因此优化查询的效率成为关键。
首先,对于OLAP系统中的数据库查询优化,建立合适的索引是至关重要的。
索引可以加快查询速度,减少扫描和过滤的数据量。
在实践中,为每个查询中经常使用的列创建索引是一个常见的优化方法。
例如,如果OLAP系统中的查询经常涉及到对时间和地理位置的分析,那么为时间和地理位置这两列创建索引将大大提高查询速度。
第二,数据分区也是提高OLAP系统查询性能的重要方法之一。
数据分区是将大型数据集划分为较小的逻辑单元,每个单元可以独立地进行查询和维护。
通过数据分区,可以将查询范围限制在特定的数据块中,以减少扫描的数据量和查询时间。
并且,数据分区还可以与索引相结合,进一步提高查询效率。
此外,在OLAP系统中,使用合适的聚集操作和物化视图可以显著提高查询性能。
聚集操作是对大量数据进行聚合计算,以减少查询的数据量。
可以根据业务需求预先计算和存储聚集数据,从而加快查询速度。
物化视图是对查询结果进行缓存和预计算,以便提供更快的响应时间。
通过使用聚集操作和物化视图,可以显著降低查询的复杂性和计算成本。
此外,在OLAP系统中,优化查询执行计划也是提高查询性能的重要方法。
查询执行计划是数据库系统生成的一组用于执行查询的操作序列。
通过优化查询执行计划,可以选择最有效的数据访问路径和操作顺序,从而减少查询的执行时间。
常见的优化方法包括使用适当的连接方式、选择合适的连接算法以及使用合适的查询优化器。
数据库查询优化与查询执行计划的优化步骤数据库是现代应用程序中不可或缺的组成部分,而查询是数据库最为常见的操作之一。
一旦数据库中的数据量增加,查询的性能可能会受到影响,因此数据库查询优化是提升整体性能的重要步骤之一。
查询执行计划的优化是数据库查询优化的关键环节,通过优化查询执行计划可以减少查询时间和资源消耗。
本文将介绍数据库查询优化的常见步骤和查询执行计划的优化方法。
一、数据库查询优化的一般步骤1. 分析查询需求:首先要了解查询的目的和需要查询的数据,包括查询条件、要返回的字段、排序需求等等。
仔细分析查询需求可以为后续的优化工作做好准备。
2. 确定索引策略:数据库索引是提高查询性能的关键因素之一。
根据查询的需求和数据表的结构,选择合适的字段来创建索引,加快查询速度。
同时也要注意索引的维护成本,避免过多索引导致性能下降。
3. 优化查询语句:根据查询需求和数据库的特点,优化查询语句可以减少不必要的查询操作,提高查询效率。
例如,避免使用通配符查询,尽量避免使用OR操作符,保持查询语句简洁等。
4. 使用合适的连接方式:在多表查询时,连接方式的选择也会影响查询性能。
根据实际情况选择合适的连接方式,如INNER JOIN、LEFT JOIN等,避免使用不必要的连接操作。
5. 执行性能测试:在完成以上优化步骤后,可以进行性能测试以验证优化效果。
通过数据库性能测试工具模拟实际负载,并观察查询的响应时间和资源消耗,以评估查询性能的提升效果。
二、查询执行计划的优化步骤查询执行计划是数据库优化中的关键工具,它是数据库系统为了执行查询语句而生成的一种执行方案。
通过分析执行计划,可以发现查询语句中存在的性能瓶颈,并进行相应的优化。
以下是查询执行计划优化的常见步骤:1. 分析执行计划:在执行查询语句时,数据库系统会根据查询语句和数据表的索引等信息生成执行计划。
通过使用数据库管理工具提供的查看执行计划的功能,可以详细了解查询语句的执行过程、使用的索引和所占资源等信息。
数据库优化查询计划的方法数据库系统是管理信息系统的核心,基于数据库的联机事务处理(OLTP)以及联机分析处理(OLAP)是银行、企业、政府等部门最为重要的计算机应用之一。
从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在 SQL语句中又是代价最大的语句。
举例来说,如果数据的量积累到一定的程度,比如一个银行的账户数据库表信息积累到上百万甚至上千万条记录,全表扫描一次往往需要数十分钟,甚至数小时。
如果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,由此可见查询优化技术的重要性。
在应用项目的实施中发现,许多程序员在利用一些前端数据库开发工具(如PowerBuilder、Delphi等)开发数据库应用程序时,只注重用户界面的华丽,并不重视查询语句的效率问题,导致所开发出来的应用系统效率低下,资源浪费严重。
因此,如何设计高效合理的查询语句就显得非常重要。
本文以应用实例为基础,结合数据库理论,介绍查询优化技术在现实系统中的运用。
分析问题许多程序员认为查询优化是DBMS(数据库管理系统)的任务,与程序员所编写的SQL语句关系不大,这是错误的。
一个好的查询计划往往可以使程序性能提高数十倍。
查询计划是用户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。
DBMS处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化之后,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。
在实际的数据库产品(如Oracle、Sybase等)的高版本中都是采用基于代价的优化方法,这种优化能根据从系统字典表所得到的信息来估计不同的查询规划的代价,然后选择一个较优的规划。
虽然现在的数据库产品在查询优化方面已经做得越来越好,但由用户提交的SQL语句是系统优化的基础,很难设想一个原本糟糕的查询计划经过系统的优化之后会变得高效,因此所写语句的优劣至关重要。
下面重点说明改善查询计划的解决方案。
解决问题下面以关系数据库系统Informix为例,介绍改善用户查询计划的方法。
1.合理使用索引索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。
现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。
索引的使用要恰到好处,其使用原则如下:●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。
比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。
如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
● 使用系统工具。
如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。
在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。
另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
2.避免或简化排序应当简化或避免对大型表进行重复的排序。
当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。
以下是一些影响因素:●索引中不包括一个或几个待排序的列;●group by或order by子句中列的次序与索引的次序不一样;●排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。
如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。
比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询 10亿行数据。
避免这种情况的主要方法就是对连接的列进行索引。
例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。
如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
还可以使用并集来避免顺序存取。
尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。
下面的查询将强迫对orders表执行顺序操作:SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。
因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:SELECT * FROM orders WHERE customer_num=104 AND order_num>1001UNIONSELECT * FROM orders WHERE order_num=1008这样就能利用索引路径处理查询。
4.避免相关子查询一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。
查询嵌套层次越多,效率越低,因此应当尽量避免子查询。
如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。
但这种匹配特别耗费时间。
例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。
如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
另外,还要避免非开始的子串。
例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
6.使用临时表加速查询把表的一个子集进行排序并创建临时表,有时能加速查询。
有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。
例如:SELECT ,rcvbles.balance,……other columnsFROM cust,rcvblesWHERE cust.customer_id = rcvlbes.customer_idAND rcvblls.balance>0AND cust.postcode>“98000”ORDER BY 如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:SELECT ,rcvbles.balance,……other columnsFROM cust,rcvblesWHERE cust.customer_id = rcvlbes.customer_idAND rcvblls.balance>0ORDER BY INTO TEMP cust_with_balance然后以下面的方式在临时表中查询:SELECT * FROM cust_with_balanceWHERE postcode>“98000”临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
注意:临时表创建后不会反映主表的修改。
在主表中数据频繁修改的情况下,注意不要丢失数据。
7.用排序来取代非顺序存取非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。
SQL语句隐藏了这一情况,使得在写应用程序时很容易写出要求存取大量非顺序页的查询。
有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。
实例分析下面我们举一个制造公司的例子来说明如何进行查询优化。
制造公司数据库中包括3个表,模式如下所示:1.part表零件号零件描述其他列(part_num)(part_desc)(other column)102,032 Seageat 30G disk ……500,049 Novel 10M network card …………2.vendor表厂商号厂商名其他列(vendor _num)(vendor_name)(other column)910,257 Seageat Corp ……523,045 IBM Corp …………3.parven表零件号厂商号零件数量(part_num)(vendor_num)(part_amount)102,032 910,257 3,450,000234,423 321,001 4,000,000……下面的查询将在这些表上定期运行,并产生关于所有零件数量的报表:SELECT part_desc,vendor_name,part_amountFROM part,vendor,parvenWHERE part.part_num=parven.part_numAND parven.vendor_num = vendor.vendor_numORDER BY part.part_num如果不建立索引,上述查询代码的开销将十分巨大。
为此,我们在零件号和厂商号上建立索引。
索引的建立避免了在嵌套中反复扫描。
关于表与索引的统计信息如下:表行尺寸行数量每页行数量数据页数量(table)(row size) (Row count)(Rows/Pages)(Data Pages)part 150 10,000 25 400Vendor 150 1,000 25 40Parven 13 15,000 300 50索引键尺寸每页键数量页面数量(Indexes)(Key Size) (Keys/Page) (Leaf Pages)part 4 500 20Vendor 4 500 2Parven 8 250 60看起来是个相对简单的3表连接,但是其查询开销是很大的。
通过查看系统表可以看到,在part_num上和vendor_num上有簇索引,因此索引是按照物理顺序存放的。
parven表没有特定的存放次序。
这些表的大小说明从缓冲页中非顺序存取的成功率很小。