分析执行计划
| Id
| Operation
| Name
| Rows
| Bytes | Cost (%CPU)| Time
|
-------------------------------------------------------------------------------------------------
|
0 | SELECT STATEMENT
|
|
1 |
21 |
540
(1)| 00:00:07 |
|
1 |
SORT AGGREGATE
|
|
1 |
21 |
|
|
|*
2 | TABLE ACCESS BY INDEX ROWID | CUST_INFO |
1866 | 39186 |
540
(1)|00:00:07 |
|
3 | BITMAP CONVERSION TO ROWIDS|
|
|
|
|
|
|*
4 | BITMAP INDEX SINGLE VALUE|IND_CUST_INFO_5 |
|
|
|
|
执行计划是
SQL
在数据库系统的执行轨迹,是从下向上,从右向左,从里向外的执行。
因此,我们首先看
ID
为
4
的这行操作记录。
在对象“
ND_CUST_INFO_5
“上执行“
BITMAP INDEX SINGLE VALUE
”操作。这个对象根据
dba_objects
可以查出它是一个位图索引,而操作是取出一个符合条件的位图。
位图索引的结构我这里先大概描述一下。
位图索引的物理结构和普通索引一样,也是
B-tree
结构。它存储的数据记录的逻辑结构为“
key_value,start_rowid,end_rowid,bitmap
“。
其内容类似这样:
“
’8088’,00000000000,10000034441,1001000100001111000
“
Bitmap
是一个二进制,表示
START_ROWID
到
END_ROWID
的记录,
1
表示等于
key_value
即‘
8088
‘的
ROWID
记录,
0
则表示不是这个记录。
我们了解
bitmap
的结构,就很容易理解,根据
key_value
,系统遍历一下,就能找到符合条件的记录的
ROWID
。
执行计划中
ID
为“
3
”的行,就是这种转换过程,转换出来的
ROWID
就是符合
BRHID=’8088’
的记录的
ROWID
。
结果集就是这个语句“
select ROWID from cust_info where brhid=’8088’;
“的执行结果。
在
ID
为“
4
”的那行,我们还注意到,“
4
”前面加了个“
*
”。此“
*
“表示它有条件判断。
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ASSET">50000 AND "MOBILE" IS NOT NULL AND TO_NUMBER("T1"."LOCKFLA
4 - access("BRHID"='8088')
根据位图索引的结构,只要
key_value
的值很少,那么位图索引里保存的记录就会很小。业务上这里保存营业部代码,表中营业部代码也只有几百个,所以位图索引里的记录数就很小。
执行计划遍历位图索引时,只需要扫描有限的几个数据块。
位图索引中的
ROWID
去查找
CUST_INFO
表,得出所有
ROWID
相同的表的数据记录。此记录再按照过滤条件“
filter("ASSET">50000 AND "MOBILE" IS NOT NULL AND TO_NUMBER("T1"."LOCKFLAG")=0)
“
进行过滤,即得出所求的结果集。
大家注意一下:
这里的过滤条件,系统做了一个
to_number
的转换。表的字段
lockflag
数据类型为
varchar
,参数值却是
number
,所以不得不转换。
这种写法也是不合理的,额外增加
CPU
运行。若此字段上有索引,如此操作也将导致索引不会被使用。
回到执行计划中,可看出
rows
一列中,显示符合条件的记录数为
1866
条,但执行时间为
7
秒。
这个时间是指过滤操作和
ROWID
查找的时间之和。
在位图索引中得出的
ROWID
数量和“
select count(*) from cust_info where brhid=’8088’;
“查询结果相等,约
1W
条,查询出来的结果将过滤成
1866
条记录。总计时间为
7
秒。
对于
WEB
应用的数据库而言,
7
秒种就是
7,000,000
微秒。这是一个非常漫长的时间。
正常情况下,一个数据块从内存读取所需的时间约是
10
微秒到
100
微秒不等,从磁盘读取所需的时间约
10
毫秒左右。若磁盘读超过
10
毫秒,则表示磁盘很忙或磁盘性能很差。
注:这个数值是我估计的,不一定正确,具体值还是要看环境。
最后一步是将将得到的记录进行聚合统计。
执行计划为
|
1 |
SORT AGGREGATE
|
|
1 |
21 |
|
|
这步很简单,仅是将过滤出来的
1866
条记录做记录数求和,使用的时间应该是微秒级别的,以至于这里都没有显示。
经过以上对执行计划的分析,我们可以判定,语句执行在“
TABLE ACCESS BY INDEX ROWID
”操作上消耗了绝大部分的时间。
这个操作是根据
ROWID
来读取记录,一共读取记录数约
1W
多条,使用时间为
7
秒钟。我们算一下,每条时间约
739
微秒。
这个
SQL
的运行成本统计信息显示一致性读(
consistent gets
,也叫内存读)为
10630*8KB
,物理读(磁盘读)为
745*8KB
。
745
个物理读,
10630
个一致性读。如果按照每个物理读消耗
10
毫秒,则这些物理读就需要约
7
秒的时间。
我们分析的执行计划是第一次查询操作时生成的执行计划。在第二次执行时,
SQL
快是因为没有物理读,所有记录都缓存在内存中。
我们有个疑问,为什么读取个
1W
行记录的操作,需要
7000
毫秒时间?
分享到:
相关推荐
根据提供的文件内容,我们可以了解到文档《SQL优化指导示例2.pdf》主要讨论了在Vertica数据库系统中如何进行SQL语句的优化。Vertica是一个面向列的高性能分析数据库,特别适合于处理大规模数据集。本文的知识点涉及...
嵌套查询是指在一个外部查询中使用另一个内部查询的结果。这种查询结构可以用来处理更为复杂的业务逻辑,特别是在需要跨多个表进行深入分析时。 **示例:** - **找出选了“数据库原理”这门课的学生数量:** ```...
下面是sql语句优化的一些提示要点,主要讲述的是操作符优化过程。 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。 但是用IN的SQL性能总是比较低的,从sql执行的步骤来...
本PPT课件主要讲述了MySQL数据库优化的重要知识点,特别是SQL优化方面的内容。从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和Count等方面对MySQL数据库优化进行了...
通过`TO_CHAR`函数将日期转换为字符串形式,然后按照年份进行分组统计平均工资。 **题目8.9:** 查询EMP员工表下每个部门工资前二名的员工信息。 **解答:** ```sql SELECT DEPTNO, ENAME, SAL FROM EMP E1 WHERE ...
总结来说,Oracle SQL优化是一个综合性的任务,需要考虑索引、连接方式、查询结构等多个方面。理解并应用上述知识点,能够帮助你更好地管理和优化你的Oracle数据库,实现更高效的SQL执行。通过持续学习和实践,你...
### SQL优化教程 #### 一、SQL优化的重要性与原则 ...综上所述,SQL优化是一个综合性的过程,涉及从SQL语句本身到数据库架构设计的方方面面。通过对上述方法的合理应用,可以显著提高系统的查询性能和响应速度。
总结,Oracle SQL优化是一个综合性的过程,涉及到SQL语句的编写、数据库结构的设计、索引的管理和优化器的配置等多个方面。通过对上述策略的理解和应用,可以显著提高Oracle数据库的性能和响应速度,为用户提供更好...
然而,随着数据量的增长,SQL查询的性能优化成为了一个关键问题。本篇将深入探讨“基于Oracle的SQL优化典型案例分析”,旨在帮助数据库管理员和开发人员提升SQL查询效率,降低系统负载,从而提高整体系统性能。 1. ...
例如,每当有新的订单插入,可以触发一个存储过程来计算并更新销售统计信息。 在实践中,这些功能极大地提高了数据库管理的效率和灵活性。然而,需要注意的是,过度依赖存储过程可能会增加维护难度,因为它们可能与...
B-tree索引由于其平衡树的特性,适合用于范围查询、排序和分组统计等操作,能够大幅提升查询效率。而hash索引由于其快速的查找性能,在内存表中使用时可以发挥巨大优势,但由于其散列后数据随机存储的特性,不便于...
首先,我们需要理解SQL执行计划的生成过程。大多数DBMS,如Oracle、MySQL、SQL Server等,都提供了获取执行计划的功能。在查询执行前,DBMS会解析SQL语句,生成一棵逻辑操作树,然后转化为物理操作计划,即执行计划...
每个操作都有一个成本值,表示完成该操作所需的资源量。数据库会选取总成本最低的执行计划。 二、查看SQL执行计划 在Oracle中,可以使用`EXPLAIN PLAN`或`DBMS_XPLAN`包来查看执行计划。例如,使用`EXPLAIN PLAN ...
2. **选择(SELECT)语句**:学习如何使用WHERE子句筛选数据,使用GROUP BY进行分组,使用HAVING过滤分组后的结果,以及ORDER BY进行排序。 3. **联接(JOIN)操作**:了解INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL ...
查看SQL语句的执行计划是优化过程中的一个重要步骤。执行计划可以详细显示SQL语句如何被数据库解析、编译和执行。通过分析执行计划,可以了解是否有不必要的表扫描或索引扫描发生,以及是否有潜在的性能问题,例如...
通过上述知识点的详细说明,我们可以了解到Oracle SQL优化涉及多个层面的内容,从具体的优化技巧到理论概念,从基本的操作到高级的性能分析工具,每一个环节都是优化过程中不可或缺的一环。通过实例讲解,能够更加...
- **设置单用户模式**:`EXEC sp_dboption 'db_Name', 'singleuser', 'TRUE'`将数据库设置为只允许一个用户访问,通常在进行数据库检查或维护时使用。 - **检查并修复数据库**: - `dbcc checkdb('db_Name', repair...
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 NOT IN 此操作是强列推荐不使用的,因为不能应用表的索引。 推荐方案:用NOT EXISTS 或...
2. **分组统计**:指通过SQL语句对查询结果按照一个或多个字段的值进行分组,并对每个分组进行计数或其他聚合操作的过程。 3. **Spring框架**:一个开源的应用程序框架,旨在简化企业级应用程序的开发过程。Spring...
**3.2 SQL数据排序、分组和统计技巧** 正确使用`ORDER BY`、`GROUP BY`和`SUM`、`COUNT`等聚合函数可以有效提高查询效率。例如,合理地使用`GROUP BY`可以减少不必要的行。 **3.3 SQL Server查询速度慢的原因** -...