这是一个开发和
DBA
双方合作下,从开发的角度去思考如何优化
SQL
的完整的过程。在本文中,介绍如何阅读执行计划、如何理解位图索引、如果使用
10046 event
分析、记录是如何保存在数据块中。相信这篇文章能帮助你理解数据库的数据块结构、理解
SQL
的执行计划。希望能对大家有帮助。
事情的过程是这样的。应用系统的某一个查询功能无法出结果,导致了某关键业务不能完成。在开发人员的协助下,我们将该查询功能调用的
SQL
语句取出来。如下所示:
and T1.MOBILE IS NOT NULL
这个
SQL
中的
Brhid
,
lockflag
,
asset
都是输入变量。
从
SQL
结构上看,它属于统计类型的查询语句,这里是根据
brhid (
营业部代码
)
进行分组求和。
首先,我们在生产环境和测试环境对这个
SQL
做验证性测试,以证实客户说法是否属实。
测试结果显示它第一次执行很慢,时间超过
20
秒,甚至
100
秒。而第二次、第三次后就变快。每换一个
brhid
的值,执行速度又从慢到快。
在
WEB
类型的应用中,超过
20
秒以上响应时间,是不可接受的。其实,对于用户而言,这个功能已经完全不能用了。
SQL
看上去非常简单,这个能从什么方面着手优化呢?
分析
语句分析
在数据库系统中,任何一个
SQL
出现的性能问题,首先是分析它的执行计划和统计信息。
因为这个
SQL
的现象是可以问题重现的,所以我们使用
”set autotrace trace exp stat”
来进行分析。
打开
cmd
窗口,执行
SQLPLUS
,登录数据库后,执行
set autotrace
,如下所示:
set autotrace trace exp stat
这句是将
trace
功能打开,这是
sqlplus
的一个调试功能。然后执行我们要分析的
SQL
语句。
----------------------------------------------------------
Plan hash value: 840048105
-------------------------------------------------------------------------------------------------
| Id
| Operation
| Name
| Rows
| Bytes | Cost (%CPU)| Time
|
-------------------------------------------------------------------------------------------------
|
0 | SELECT STATEMENT
|
|
1 |
21 |
540
(1)| 00:00:07 |
|*
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 |
|
|
|
|
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ASSET">50000 AND "MOBILE" IS NOT NULL AND TO_NUMBER("T1"."LOCKFLA
----------------------------------------------------------
516
bytes sent via SQL*Net to client
492
bytes received via SQL*Net from client
2
SQL*Net roundtrips to/from client
这个结果虽然看上去很复杂,但我们可以化繁为简,一点一点地去看。
分享到:
相关推荐
下面是sql语句优化的一些提示要点,主要讲述的是操作符优化过程。 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。 但是用IN的SQL性能总是比较低的,从sql执行的步骤来...
本PPT课件主要讲述了MySQL数据库优化的重要知识点,特别是SQL优化方面的内容。从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和Count等方面对MySQL数据库优化进行了...
在这部分中,还可以看到有“NOSTATISTICS”标记,表明系统可能没有足够的统计信息来准确预估查询的成本和行数,这在优化过程中是需要关注的。 在优化SQL查询时,一个重要的方面是理解并合理使用聚合函数和分组...
通过`TO_CHAR`函数将日期转换为字符串形式,然后按照年份进行分组统计平均工资。 **题目8.9:** 查询EMP员工表下每个部门工资前二名的员工信息。 **解答:** ```sql SELECT DEPTNO, ENAME, SAL FROM EMP E1 WHERE ...
总结来说,Oracle SQL优化是一个综合性的任务,需要考虑索引、连接方式、查询结构等多个方面。理解并应用上述知识点,能够帮助你更好地管理和优化你的Oracle数据库,实现更高效的SQL执行。通过持续学习和实践,你...
总结,Oracle SQL优化是一个综合性的过程,涉及到SQL语句的编写、数据库结构的设计、索引的管理和优化器的配置等多个方面。通过对上述策略的理解和应用,可以显著提高Oracle数据库的性能和响应速度,为用户提供更好...
### SQL优化教程 #### 一、SQL优化的重要性与原则 ...综上所述,SQL优化是一个综合性的过程,涉及从SQL语句本身到数据库架构设计的方方面面。通过对上述方法的合理应用,可以显著提高系统的查询性能和响应速度。
例如,每当有新的订单插入,可以触发一个存储过程来计算并更新销售统计信息。 在实践中,这些功能极大地提高了数据库管理的效率和灵活性。然而,需要注意的是,过度依赖存储过程可能会增加维护难度,因为它们可能与...
然而,随着数据量的增长,SQL查询的性能优化成为了一个关键问题。本篇将深入探讨“基于Oracle的SQL优化典型案例分析”,旨在帮助数据库管理员和开发人员提升SQL查询效率,降低系统负载,从而提高整体系统性能。 1. ...
B-tree索引由于其平衡树的特性,适合用于范围查询、排序和分组统计等操作,能够大幅提升查询效率。而hash索引由于其快速的查找性能,在内存表中使用时可以发挥巨大优势,但由于其散列后数据随机存储的特性,不便于...
首先,我们需要理解SQL执行计划的生成过程。大多数DBMS,如Oracle、MySQL、SQL Server等,都提供了获取执行计划的功能。在查询执行前,DBMS会解析SQL语句,生成一棵逻辑操作树,然后转化为物理操作计划,即执行计划...
每个操作都有一个成本值,表示完成该操作所需的资源量。数据库会选取总成本最低的执行计划。 二、查看SQL执行计划 在Oracle中,可以使用`EXPLAIN PLAN`或`DBMS_XPLAN`包来查看执行计划。例如,使用`EXPLAIN PLAN ...
1. **创建存储过程**:定义输入参数、输出参数,编写SQL语句并保存为可重复使用的单元。 2. **调用存储过程**:通过EXEC或CALL语句执行存储过程,传入参数值。 3. **流程控制**:在存储过程中使用IF-ELSE、WHILE、...
查看SQL语句的执行计划是优化过程中的一个重要步骤。执行计划可以详细显示SQL语句如何被数据库解析、编译和执行。通过分析执行计划,可以了解是否有不必要的表扫描或索引扫描发生,以及是否有潜在的性能问题,例如...
这可以通过`SELECT DISTINCT zcxt INTO #TBype FROM #TB ORDER BY zcxt`和`SELECT IDENTITY(int,1,1) fid, zcxt INTO #TBype1 FROM #TBype`完成,这样我们可以为每个分组分配一个唯一的ID。 接下来,我们使用一个...
**3.2 SQL数据排序、分组和统计技巧** 正确使用`ORDER BY`、`GROUP BY`和`SUM`、`COUNT`等聚合函数可以有效提高查询效率。例如,合理地使用`GROUP BY`可以减少不必要的行。 **3.3 SQL Server查询速度慢的原因** -...
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 NOT IN 此操作是强列推荐不使用的,因为不能应用表的索引。 推荐方案:用NOT EXISTS 或...
通过上述知识点的详细说明,我们可以了解到Oracle SQL优化涉及多个层面的内容,从具体的优化技巧到理论概念,从基本的操作到高级的性能分析工具,每一个环节都是优化过程中不可或缺的一环。通过实例讲解,能够更加...
- **设置单用户模式**:`EXEC sp_dboption 'db_Name', 'singleuser', 'TRUE'`将数据库设置为只允许一个用户访问,通常在进行数据库检查或维护时使用。 - **检查并修复数据库**: - `dbcc checkdb('db_Name', repair...
2. **分组统计**:指通过SQL语句对查询结果按照一个或多个字段的值进行分组,并对每个分组进行计数或其他聚合操作的过程。 3. **Spring框架**:一个开源的应用程序框架,旨在简化企业级应用程序的开发过程。Spring...