一个分组统计SQL的优化过程(1)
一个分组统计SQL的优化过程(2)
一个分组统计SQL的优化过程(3)
一个分组统计SQL的优化过程(4)
测试
我们在新建的表
cust_info_bk2
进行测试。新表的记录是按照
brhid
排序插入,相同
brhid
的记录就近可能地保存在相邻的数据块上。
我们使用
brhid=’8088’
的条件进行测试,符合这个条件的记录有
1.1W
条,占用的存储空间的数据块有
686
个。测试的操作过程如下所示:
SQL> set autotrace trace exp stat
and t1.brhid = '8088'; 2 3 4 5 6
----------------------------------------------------------
Plan hash value: 974315855
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Co
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 |
| 1 | SORT AGGREGATE | | 1 | 20 |
|* 2 | TABLE ACCESS BY INDEX ROWID | CUST_INFO_BK2 | 6 | 120 |
| 3 | BITMAP CONVERSION TO ROWIDS| | | |
|* 4 | BITMAP INDEX SINGLE VALUE | IND_CUST_INFO_BK2_1 | | |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("T1"."ASSET">=50001 AND TO_NUMBER("T1"."LOCKFLAG")=0)
4 - access("T1"."BRHID"='8088')
----------------------------------------------------------
516 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
从分析结果中,可以很明确地看到,执行计划没有任何变化,磁盘读和逻辑读下降到
689
和
723
。
注:这里的物理读也是
600
多,和上次取样的物理读差不多,为什么时间差异这么大?难道是磁盘的
IO
性能在两个时间段有很大的差异?
总而言之,语句执行所需要的数据块是大量降低了,
700
个数据块的请求,执行时间比
1W
个是要相差很大的。因此生产环境优化操作按照这个方法进行优化,应该是有明显收益。
语句执行的读取的数据块的数量我们通过重组表的方式使其减少了。这样即使这些块都在内存里,也比没重组前也是要快的。这个完全是可以成线性关系的,同在内存里,读取的数据块少,时间就会短。
因为需要调整初始化参数,所以这里就没有测试缓存表的优化方案了。
实施
根据测试结果,我们实施的主要内容是将
cust_info
的表的记录按照
brhid
排序重组。
5.
使用
insert into select order by
方式插入记录数
在实施过程中因为网络不稳定,导致操作中断,所以我们采用了
”BUCK INTO”
技术,即避免
CTAS
类似操作的大回滚段的操作压力和风险,又避免单条插入的性能问题。
select * from cust_info_20111125;
type type_arr_fectch is table of c_source%rowtype;
arr_source type_arr_fectch;
fetch c_source bulk collect
into arr_source limit 1000;
forall i in 1 .. arr_source.count
insert into cust_info values arr_source (i);
exit when c_source%notfound;
该方式实现每
1000
条插入一次,是按块的方式写入数据库的,速度是传统的单条插入的
5
倍以上。
总结
这个优化方案中涉及到众多知识点。理解这些知识点,更能有利于我们开发出更高效的程序。现将知识点罗列如下:
a)
判断字段上不做任何转换如将
date
转换成
char
再比较;
5.
Forall bulk connect
技术实现批量快速插入
分享到:
相关推荐
下面是sql语句优化的一些提示要点,主要讲述的是操作符优化过程。 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。 但是用IN的SQL性能总是比较低的,从sql执行的步骤来...
第五部分 SQL优化 优化器 SQL语句执行过程 SQL优化术语 第一部分 SQL基础 SQL简介 发展历史 SQL语句分类 DDL[Data Definition Language] DML[Data Manipulation Language] DQL [Data Query Language] DCL [Data...
SQL2005性能优化大全,sqlserver性能优化,包括:什么叫做索引、利用索引优化sqlserver查询、使用数据库分区表提高程序检索效率、提高数据库查询效率的实用方法、SQL数据进行排序、分组、统计技巧;SQL Server查询...
由此可见用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 ...
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐在业务密集的SQL当中尽量不采用IN操作符 NOT IN 此操作是强列推荐不使用的,因为它不能应用...
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。 1.6.4.2 语法 select A.*, B.* from student_A A full outer join student_B B on A.Uuid...
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_Sale2,能够根据指定客户统计,汇总该客户购买每种产品的数量和花费金额 CREATE PROCEDURE P_Sale2 @CusNo nvarchar(3) AS SELECT Product.ProNO,ProName,Price ,SUM(Quantity),SUM(Price*Quantity...
3、可执行多条sql语句,或各种分组统计语句。前提是数据库支持该语法。 例1、执行简单的Sql语句:select,insert,delete,update 等 例2、[sqlserver2008]执行T-Sql语句: declare @aa int set @aa=123*2+456*3-...
5)、创建一个函数,以图书号为参数,统计该图书被订购的总数量。 湖南文理学院实验报告 课程名称 大型数据库技术 实验名称 五、PL/SQL触发器 成绩 学生姓名 专 业 年级、学号 同组者姓名 实验日期 一、实验目的...