三、不可优化的where子句
1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:
select * from record where substring(card_no,1,4)='5378'(13秒)
select * from record where amount/30< 1000(11秒)
select * from record where convert(char(10),date,112)='19991201'(10秒)
分析:
where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;
如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:
select * from record where card_no like '5378%'(< 1秒)
select * from record where amount < 1000 * 30(< 1秒)
select * from record where date = '1999/12/01'(< 1秒)
你会发现SQL明显快起来!
2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:
select count(*) from stuff where id_no in('0','1')(23秒)
分析:---- where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行。
我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;
但实际上(根据showplan),它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响。
实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间竟达到220秒!还不如将or子句分开:
select count(*) from stuff where id_no='0'select count(*) from stuff where id_no='1'
得到两个结果,再作一次加法合算。因为每句都使用了索引,执行时间只有3秒,在620000行下,时间也只有4秒。
或者,用更好的方法,写一个简单的存储过程:
create proc count_stuff asdeclare @a intdeclare @b intdeclare @c intdeclare @d char(10)beginselect @a=count(*) from stuff where id_no='0'select @b=count(*) from stuff where id_no='1'endselect @c=@a+@bselect @d=convert(char(10),@c)print @d
直接算出结果,执行时间同上面一样快!
---- 总结:---- 可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。
1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
3.要善于使用存储过程,它使SQL变得更加灵活和高效。
从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gprime/archive/2007/07/13/1687930.aspx
分享到:
相关推荐
在IT行业中,数据库优化是提升系统性能的关键环节,尤其是在处理大量数据时,SQL数据库的优化显得尤为重要。本文将深入探讨SQL数据库优化方案,包括查询优化、索引优化、存储优化和架构优化等策略,旨在帮助你提升...
三、数据库优化方案 根据不同的应用场景和需求,达梦数据库可以采取不同的优化方案,例如: 1. 对于高并发的应用,通过调整系统缓冲区和内存公共内存池的大小和数量,可以提高数据库的并发效率和性能。 2. 对于大...
Oracle数据库优化是一门深入的技术领域,它关系到数据库性能的提升和资源的高效利用。本文针对Oracle数据库的优化提供了详尽的指导和案例分析,尤其强调了在CBO(Cost-Based Optimizer,基于成本的优化器)模式下的...
综上所述,Oracle数据库优化是一个涉及多方面因素的综合工程,需要从数据库设计、SQL优化、配置调整、维护策略等多个角度进行深入研究和实践,才能充分发挥Oracle的潜力,为企业带来更高的数据处理效率。通过不断的...
Oracle数据库优化是提升数据库性能的关键环节,特别是在处理复杂的SQL查询时。本次培训主要围绕SQL语句的执行过程、Oracle优化器、表之间的关联、获取SQL执行计划以及如何分析执行计划等核心内容展开。 首先,理解...
### Oracle10g数据库优化详解 #### 一、基本概念 **1. 实例与数据库** - **实例**: 当数据库启动后,多个进程被加载到内存中并进行协同工作,这些进程及其状态共同组成了一个数据库实例。实例是运行时的概念,...
- **统计信息更新**:定期更新统计信息,帮助数据库优化器做出更好的执行计划决策。 #### 三、锁管理优化 锁机制是数据库并发控制的重要手段之一,不合理的锁设置可能会导致性能瓶颈。 #### 3.1 锁列表配置 - **...
"Oracle数据库优化之数据库磁盘IO" Oracle数据库优化之数据库磁盘IO是指数据库管理员和开发者对Oracle数据库进行优化,以提高数据库的性能和稳定性。数据库磁盘IO是影响数据库性能的重要因素之一,因此优化数据库...
在进行Oracle数据库优化时,务必注意逐步调整,每次改变都应监测其对性能的影响。同时,定期进行性能基线对比,以确保优化效果。记住,优化是一个持续的过程,需要结合业务需求和系统实际运行情况进行。
Oracle数据库优化是一个复杂而重要的主题,它涉及到许多层面,包括SQL查询优化、索引策略、内存管理、存储优化以及数据库架构调整。以下是对这些关键领域的详细介绍: 1. **SQL查询优化**:SQL是数据库操作的核心,...
数据库性能优化是IT领域中的一个核心议题,尤其对于处理大量数据的企业级应用而言,高效的数据库性能至关重要。在SQL Server、MySQL和Oracle这三大主流数据库系统中,优化策略各有其特点和技巧。以下将针对这些...
"Oracle数据库优化方案.pdf" 在这篇文章中,我们将讨论Oracle数据库优化方案,包括内存等参数配置的优化、减少物理读写的优化、批量重复操作的SQL语句及大表操作的优化等。同时,我们还将讨论Oracle数据库优化的...
检验信息系统SQL数据库优化的研究 一、数据库优化的重要性 随着信息技术的发展和应用,医院信息化系统的重要性日益凸显。医院信息化系统的核心组件是Laboratory Information System(LIS),它承担着医院检验信息...
定期执行DBMS_STATS包进行统计信息收集,确保数据库对数据分布有准确的认识。 7. **回滚段管理**:回滚段用于存储事务的撤销信息,合理的回滚段设置可以防止事务冲突,提高并发性能。 8. **物理存储优化**:包括表...
1. **统计信息收集**:定期收集数据库统计信息,用于估算查询成本,指导优化决策。 2. **动态规划算法**:采用动态规划算法来寻找最优的查询执行计划。 3. **多阶段优化**:将优化过程分为多个阶段,逐步细化执行...
本文将详细介绍一种全面的Oracle数据库优化方案,涵盖监控、磁盘I/O优化、回滚段优化、Redo日志优化、系统全局区(SGA)优化等多个方面。 #### 二、监控数据库性能 监控是优化的基础。为了准确了解Oracle数据库的...
Oracle 数据库优化是一个复杂而重要的任务,涉及到多个层面,包括SQL优化、系统资源管理、存储配置等。在处理数据库性能问题时,首先需要确定问题是出在数据库内部还是操作系统层面。描述中提到的方法主要关注通过...
《ORACLE 数据库优化指南》是一份详尽的文档,旨在帮助用户提升ORACLE数据库的运行效率和性能。本文将围绕课程大纲中的各个主题进行深入探讨。 首先,Oracle9i Performance Tuning的纵览介绍了数据库优化的基本概念...
【Oracle数据库优化方案】 Oracle数据库是关系型数据库管理系统的一个重要代表,其性能优化对于企业级应用至关重要。本文主要从四个不同级别的调整分析入手,即操作系统级、Oracle RDBMS级、数据库设计级和SQL级,...
### Oracle数据库优化经验——ADDM应用详解 #### 一、ADDM概述 **ADDM**(Automatic Database Diagnostic Monitor,自动数据库诊断监视器)是Oracle数据库管理工具中的一个重要组件,旨在帮助数据库管理员(DBA)快速...