这是一个开发和
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执行的步骤来...
SQL2005性能优化大全,sqlserver性能优化,包括:什么叫做索引、利用索引优化sqlserver查询、使用数据库分区表提高程序检索效率、提高数据库查询效率的实用方法、SQL数据进行排序、分组、统计技巧;SQL Server查询...
第五部分 SQL优化 优化器 SQL语句执行过程 SQL优化术语 第一部分 SQL基础 SQL简介 发展历史 SQL语句分类 DDL[Data Definition Language] DML[Data Manipulation Language] DQL [Data Query Language] DCL [Data...
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 NOT IN 此操作是强列推荐不使用的,因为不能应用表的索引。 推荐方案:用NOT EXISTS 或...
基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来...由此可见用 IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。
4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习2 4.7 总结 第5章 算法和复杂性 5.1 你有一个1夸特的硬币吗? 5.1.1 如何从零钱罐中取回1夸特钱 5.1.2 有时零钱罐中没有1夸特的硬币 5.2 如何度量...
4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习208 4.7 总结214 第5章 算法和复杂性215 5.1 你有一个1夸特的硬币吗?215 5.1.1 如何从零钱罐中取回1夸特钱216 5.1.2 有时零钱罐中没有1夸特的硬币216 ...
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。 1.6.4.2 语法 select A.*, B.* from student_A A full outer join student_B B on A.Uuid...
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐在业务密集的SQL当中尽量不采用IN操作符 NOT IN 此操作是强列推荐不使用的,因为它不能应用...
4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习208 4.7 总结214 第5章 算法和复杂性215 5.1 你有一个1夸特的硬币吗?215 5.1.1 如何从零钱罐中取回1夸特钱216 5.1.2 有时零钱罐中没有1夸特的硬币...
通过对实际案例开发过程的详细分析,使读者掌握 SQL的综合应用技巧。 内容简介 本书主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析。本书分为3部分:...
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL不能转换了。 推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐方案:在业务密集的SQL当中尽量不采用IN操作符。 NOT IN操作符
10.2 SQL优化 257 10.2.1 测试执行计划 257 10.2.2 跨多个执行的测试 260 10.2.3 测试查询改变的影响 263 10.2.4 寻找其他优化机会 266 10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 ...
--创建存储过程P_Sale1,统计每种产品的销售数量和销售金额 CREATE PROCEDURE P_Sale1 AS SELECT Product.ProNO,ProName ,Price ,SUM(Quantity),SM=SUM(Price*Quantity) FROM Proout,Product WHERE Product.ProNO=...
3、可执行多条sql语句,或各种分组统计语句。前提是数据库支持该语法。 例1、执行简单的Sql语句:select,insert,delete,update 等 例2、[sqlserver2008]执行T-Sql语句: declare @aa int set @aa=123*2+456*3-...
[例3-1] 问题:编写一个过程,求和运算。 SET SERVEROUTPUT ON; DECLARE a number:=1; BEGIN a:=a+5; DBMS_OUTPUT.PUT_LINE('和为:'||TO_CHAR(a)); END; / 【例3-2】:使用%TYPE声明变量,输出制定表中的相关...