sql2000中的连接两个表的查询语句的执行路径对性能的影响
有两个表
表1 pay_itemdetail 大概 2-3百万条数据
表2 pay_builddetail 大概 55 条数据
1原语句,效率非常低,用时20秒以上
select * from pay_itemdetail with(nolock)
where builditemid in (select id from pay_builddetail where buildid = 1)
2 改进的语句求count ,又两种方法,连接,用时1秒
1)in 的方式
select count(1) from pay_itemdetail with(nolock)
2)连接的方式
select count(1) from pay_itemdetail a with(nolock),pay_builddetail b with(nolock)
where b.buildid=100 and a.builditemid = b.id
3 最后的改进 top ,用时0秒
select top 1 a.* from pay_itemdetail a with(nolock),pay_builddetail b with(nolock)
where b.buildid=1 and a.builditemid =b.id
4 求top时如果没有记录匹配,速度很慢,用时10秒
select top 1 a.* from pay_itemdetail a with(nolock),pay_builddetail b with(nolock)
where b.buildid=100 and a.builditemid =b.id
5. 对4进行进一步分析祥解
用
select top 1 a.* from pay_itemdetail a with(nolock),pay_builddetail b with(nolock)
where b.buildid=1 and a.builditemid =b.id
来取第一条符合条件的 pay_itemdetail 中的数据,当 b.buildid=1 条件成立时,执行时间只用0秒;
但当将语句该为
select top 1 from pay_itemdetail a with(nolock),pay_builddetail b with(nolock)
where b.buildid=100 and a.builditemid =b.id
pay_builddetail 表中不存在 b.buildid=100 的记录,执行时间竟用了12秒。
通过查看sql语句查询路径发现问题
sql2000在进行查询解释时,
1)把 pay_itemdetail 中的记录全部取出
2)在根据b.buildid=1 条件从pay_builddetail表中的取出符合条件的记录;
3)最后进行 nested loop 从 取出符合的第一条的记录。
4)但pay_builddetail表中不存在b.buildid=100记录时,它要在nested loop 时循环了2-3百万次,所以就用了20多秒。
知道慢的原因了,只要让sql2000在进行查询解释时先从 pay_builddetail 表中取出符合条件的id,再从 pay_itemdetail 中去出符合条件的记录,循环的次数最多也就 55次了吗。
于是语句修改为
select top 1 a.* from pay_itemdetail a with(nolock),pay_builddetail b with(nolock) where b.buildid=100 and a.builditemid = (b.id+0)
再查看sql用时语句查询路径,变为了
OK问题解决。
<<sql2000中的连接两个表的查询语句的执行路径对性能的影响.doc>>
- 大小: 201.5 KB
- 大小: 111.1 KB
- 大小: 219.3 KB
- 大小: 171.2 KB
- 大小: 29.9 KB
- 大小: 271.3 KB
分享到:
相关推荐
本文档主要介绍了与SQL调整有关的内容,涉及多个方面:SQL语句执行的过程、ORACLE优化器、表之间的关联、如何得到SQL执行计划、如何分析执行计划等内容。通过从浅入深的方式了解SQL优化的过程,使大家逐步步入SQL...
标题中的“SQL多表连接查询优化的相关研究”指的是在数据库管理中,如何高效地执行涉及多个数据表的SQL查询操作。在SQL(Structured Query Language)中,连接查询(JOIN)是用于合并两个或更多表中的数据的关键技术...
首先,Oracle的优化器(Optimizer)是一种内部机制,它负责分析SQL语句并确定执行查询的最佳路径。优化器有两种主要模式:基于规则的优化器(RBO)和基于成本的优化器(CBO)。RBO依赖于预定义的规则和策略来决定...
执行计划包含了如何执行查询的具体步骤,如表扫描、索引查找、联接操作等。 #### 四、SQL Server 2005中的新逻辑处理阶段 SQL Server 2005引入了一些新的逻辑处理阶段,以支持更多复杂的查询需求: - **并行查询...
在SQL Server 2000完结篇系列之六中,我们重点关注的是如何设计高效的SQL语句来进行查询优化,这是数据库管理中的关键技能,对于提升系统性能至关重要。在SQL Server 2000中,理解查询优化的过程和技巧,能够帮助...
两个语句所指的对象必须完全相同。 C. 两个 SQL 语句中必须使用相同的名字的绑定变量(bind variables)。 三、选择最有效率的表名顺序 ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM ...
执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. 这是因为ORACLE只对...
Oracle 多表查询优化需要考虑多个方面,包括选择合适的表名顺序、使用 Cache Buffer、语句共享、优化查询路径、避免多表连接查询、优化数据统计、选择合适的索引、优化数据库结构、使用 Materialized View、优化...
在这段SQL代码中,主要关注的是如何找出那些执行时间长且对系统资源消耗大的查询语句。 #### 1.1 SQL Server DMV (Dynamic Management Views) 的使用 - **sys.dm_exec_query_stats**:这是一个非常重要的动态管理...
sqljdbc.jar包含了实现这些接口的具体类,使得Java程序员能够通过编写SQL语句与SQL Server 2000进行交互,执行查询、事务处理、存储过程等功能。 msbase.jar和msutil.jar是辅助性库文件,主要包含了一些特定于SQL ...
本文对SQL Server数据库性能的影响因素进行了深入分析,并提出了相应的优化路径。 影响SQL Server数据库性能的因素主要包括: 1. 数据库设计:数据库的设计对性能有着直接的影响。在应用SQL Server数据库系统时,...
例如耽搁查询 的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT, DELETE还不能并行处理。 ...
通过分析执行计划,可以了解SQL语句的执行路径,包括如何访问数据(全表扫描、索引扫描等)、如何进行数据排序、连接等操作。掌握这些信息对优化SQL语句至关重要。 此外,Oracle提供了丰富的SQL调优工具和方法。...
在Oracle中,SQL语句优化是性能管理的核心,主要目标包括避免全表扫描、有效利用缓存、优化索引使用、改进连接技术和检查子查询的效率。 在SQL优化的不同阶段,性能收益会有所不同。设计阶段的优化可以带来最大的...
- 执行查询:遵循执行计划,对UPDATE和DELETE语句进行行锁定,从数据库缓冲区读取或修改数据。 - 返回结果:对于SELECT语句,可能涉及排序,如果内存充足,使用高效的排序算法能提高性能。 2. 影响SQL性能的原因 -...
优化器模式的选择对SQL查询的执行计划影响重大,进而影响性能。 - RULE优化器是基于数据库表的访问规则来选择执行计划的,这种方式逐渐被淘汰,因为它的规则比较固定,可能无法适应数据分布不均匀的情况,导致性能...
查询优化器随后将SQL语句分解为各个组成部分,并执行代数优化和存取路径的优化。在优化过程中,主要以CPU的使用量和磁盘I/O作为成本度量指标。经过一系列的处理后,查询优化器为每一个可能的执行计划计算成本,最终...
在查询优化中,Row Source指的是由上一步操作返回的满足条件的行集合,它可以是整个表、部分表或两个Row Source连接后的结果。Predicate则是指查询中的WHERE子句,用于筛选行。Driving Table(驱动表)和Probed ...