`
rendq
  • 浏览: 4541 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

提高Oracle性能--经验实谈

阅读更多

本人初出茅庐,从事对日软件开发已一年时间了,之前一直在JAVAEYE上面看大家的博客,不敢随意发表任何言论。目前我正好维护一个J2SE的项目,刚好碰到一个障害要求提高Oracle的执行效率问题。本人觉得很有意思,供大家分享!希望大家能够给点鼓励……

 

原来的SQL文需要执行15万条左右的数据记录,执行一个查询条件至少要15分钟以上。原SQL文是:

SELECT 
A.SHHN_CD, 
A.KKR_KB, 
A.DN_KB, 
A.DN_GYBN_KB, 
SUM(A.CS_SRY), 
SUM(A.BR_SRY), 
SUM(A.BR_KNZN_SRY) 
FROM TRNSCTN A, 
SHHN_MST 
WHERE A.HNSHTN_CD='001' 
AND ((A.ZK_SK_CD='1' 
AND A.ZK_KSHN_DY=TO_DATE('99991231','YYYYMMDD') 
AND DN_DY<TO_DATE('20080601', 
'YYYYMMDD')) 
OR (A.ZK_SK_CD='1' 
AND A.DN_DY BETWEEN TO_DATE('20080601','YYYYMMDD') 
AND TO_DATE('20080623','YYYYMMDD'))) 
AND DN_GYBN_KB IN('1', 
'2', 
'5', 
'7', 
'C', 
'D', 
'G', 
'H') 
AND DN_KB IN('1', 
'2', 
'3', 
'4') 
AND GY_NB<>'0' 
AND (A.HNSHTN_CD=SHHN_MST.HNSHTN_CD 
AND A.SHHN_CD=SHHN_MST.SHHN_CD 
AND SHHN_MST.BMN_CD BETWEEN '000' 
AND '999' ) 
GROUP BY A.SHHN_CD, 
A.KKR_KB, 
A.DN_KB, 
A.DN_GYBN_KB 
ORDER BY A.KKR_KB, 
A.DN_KB, 
A.DN_GYBN_KB 

  

 当我把这段SQL文拷贝到SQLPLUS中,按F5键执行时,我才发现这段SQL文没有用到索引。具体索引如下:

写道
Owner   Name             Type    Columns
KMJ       TRNSCTNFK1   Normal HNSHTN_CD, DN_NB
KMJ       TRNSCTNFK10 Normal HNSHTN_CD, INJZM_KB
KMJ       TRNSCTNFK11 Normal HNSHTN_CD, STI_INJZM_KB
KMJ       TRNSCTNFK12 Normal HNSHTN_CD, GY_NB, AT_DN_NB
KMJ      TRNSCTNFK13  Normal HNSHTN_CD, SHHN_CD, ZK_KSHN_DY, DN_DY
KMJ      TRNSCTNFK14  Normal HNSHTN_CD, TRHKSK_CD, TRHKSK_KB, DN_KB, GY_NB, STI_INJZM_KB
KMJ      TRNSCTNFK15  Normal HNSHTN_CD, TRHKSK_CD, DN_KB, SKY_DY, CHH_DY
KMJ      TRNSCTNFK2    Normal HNSHTN_CD, TRHKSK_CD, DN_DY
KMJ      TRNSCTNFK3    Normal HNSHTN_CD, SHHN_CD, DN_DY
KMJ      TRNSCTNFK4    Normal HNSHTN_CD, ZK_KSHN_DY
KMJ      TRNSCTNFK5    Normal HNSHTN_CD, SYS_SHR_DY, DN_KB
KMJ      TRNSCTNFK6    Normal HNSHTN_CD, SKY_DY
KMJ      TRNSCTNFK7    Normal HNSHTN_CD, TGT_DY, DN_KB
KMJ      TRNSCTNFK8    Normal HNSHTN_CD, DN_DY, DN_KB
KMJ      TRNSCTNFK9    Normal HNSHTN_CD, TRHKSK_CD, SKY_DY, CHH_DY
KMJ      TRNSCTNPKI    Unique HNSHTN_CD, DN_DY, DN_KB, DN_NB, DN_D, KKR_KB, GY_NB, NY_TN_NB

  我通过一天的测试,发现将原SQL文进行如下优化之后,效率最高,执行时间提高到161.875s。

SELECT
 /*+ index(SHHN_MST TRNSCTNFK4)*/ /*+ index(SHHN_MST TRNSCTNFK8)*/
 A.SHHN_CD,
 A.KKR_KB,
 A.DN_KB,
 A.DN_GYBN_KB,
 SUM(A.CS_SRY),
 SUM(A.BR_SRY),
 SUM(A.BR_KNZN_SRY)
FROM TRNSCTN A,
 SHHN_MST
WHERE A.HNSHTN_CD='001'
AND ((A.ZK_SK_CD='1'
		AND A.ZK_KSHN_DY=TO_DATE('99991231','YYYYMMDD')
		AND DN_DY<TO_DATE('20080601',
			 'YYYYMMDD'))
	OR (A.ZK_SK_CD='1'
		AND A.DN_DY BETWEEN TO_DATE('20080601','YYYYMMDD')
		AND TO_DATE('20080623','YYYYMMDD')))
AND DN_GYBN_KB IN('1',
	 '2',
	 '5',
	 '7',
	 'C',
	 'D',
	 'G',
	 'H')
AND DN_KB IN('1',
	 '2',
	 '3',
	 '4')
AND GY_NB<>'0'
AND (A.HNSHTN_CD=SHHN_MST.HNSHTN_CD
	AND A.SHHN_CD=SHHN_MST.SHHN_CD
	AND SHHN_MST.BMN_CD BETWEEN '000'
	AND '999' )
GROUP BY A.SHHN_CD,
 A.KKR_KB,
 A.DN_KB,
 A.DN_GYBN_KB
ORDER BY A.KKR_KB,
 A.DN_KB,
 A.DN_GYBN_KB

  

日方对这样的效率已基本满意,但是这仅仅时SQL文执行的时间,要是加上JAVA执行的时间的话也得要5分钟。作为天生追求完美的程序员来说似乎有点不甘休。于是我将上述SQL采取了一个最原始的优化,性能倍增,执行时间只需要8.912s。

SELECT  
 A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB,
SUM(A.CS_SRY),
SUM(A.BR_SRY),
SUM(A.BR_KNZN_SRY)
FROM 
(
SELECT 
 *
FROM TRNSCTN
WHERE ZK_SK_CD='1'
AND ZK_KSHN_DY=TO_DATE('99991231','YYYYMMDD')
AND DN_DY<TO_DATE('20080601',
	 'YYYYMMDD')
  UNION ALL
SELECT 
 * 
FROM TRNSCTN
WHERE ZK_SK_CD='1'
AND DN_DY BETWEEN TO_DATE('20080601','YYYYMMDD')
AND TO_DATE('20080623','YYYYMMDD')
) A,
SHHN_MST
WHERE A.HNSHTN_CD='001'
AND DN_GYBN_KB IN('1',
	'2',
	'5',
	'7',
	'C',
	'D',
	'G',
	'H')
AND DN_KB IN('1',
	'2',
	'3',
	'4')
AND GY_NB<>'0'
AND (A.HNSHTN_CD=SHHN_MST.HNSHTN_CD
	AND A.SHHN_CD=SHHN_MST.SHHN_CD
	AND SHHN_MST.BMN_CD BETWEEN '000'
	AND '999' )
GROUP BY A.SHHN_CD,
A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB
ORDER BY A.KKR_KB,
A.DN_KB,
A.DN_GYBN_KB

 其实我对ORACLE并没有开发经验,只是出于个人爱好,研究点皮毛。为什么这样的执行效率最高,我并不是特别清楚,希望大家给点建议!!!!!!!

 

    本人已将次文的详细叙述过程放到http://rdqwhr.iteye.com/admin/blogs/208382,敬请查阅!!!

3
0
分享到:
评论
2 楼 rendq 2008-06-25  
目前,本人也在自己的环境上对上述SQL文做各种验证,马上就快出炉了,保证给大家提供一个完整的论证过程。
1 楼 Aryang 2008-06-25  
不错,顶。可惜没对改进的措施和方法进行任何叙述或描述,一个字都没有

相关推荐

    浅谈ORACLE中基于JAVA的存储查询优化.pdf

    文章中指出了对象关系模型的建立是数据库设计的一个重要环节,并强调了关系数据模型调整和优化对于数据库性能保持和提高的影响。关系模型需要反映现实世界中实体对象之间的关系,并能够适应变化的业务需求。 5. ...

    浅谈Oracle8i中面向对象的数据功能.pdf

    集成RDB和OODB的优点,Oracle8i提高了开发效率,减少了系统复杂性,同时允许开发者根据应用场景选择最合适的模型。这种方式有助于在保持系统性能的同时,适应不断变化的业务需求。 总的来说,Oracle8i的面向对象...

    赢在起点-数据库设计规范 梁敬彬大牛的经验之谈

    《赢在起点-数据库设计规范》是梁敬彬大师关于数据库设计的一份宝贵经验分享,主要涵盖了Oracle、MySql和DB2这三种主流数据库系统。本文将深入解析该主题中的关键知识点,帮助读者理解并掌握数据库设计的核心原则。 ...

    数据库设计经验谈.doc

    在数据库设计领域,经验和理论同样重要。本文将探讨五个关键部分,帮助你提升数据库设计的效率和质量。 **第 1 部分 - 设计数据库之前** 在开始设计数据库之前,首先要对现有的环境进行深入的考察。这包括分析现有...

    浅谈基于DAO的设计模式在构建BBS网站中的应用

    例如,初期使用MySQL这样的开源数据库可能能满足需求,但随着论坛知名度提高和访问量增加,可能需要升级到如DB2、SQL Server或Oracle等更强大的商业数据库。DAO模式的引入使得这种数据库的迁移变得更为便捷,只需...

    数据库基础概论

    首先,让我们从数据库的历史谈起。数据库的发展可以追溯到上世纪60年代,那时的数据库系统主要是层次型和网络型。随着技术的进步,关系型数据库模型在1970年由E.F. Codd提出,从此成为主流。现在,我们常见的数据库...

    java面试题 含答案

    9. 当谈到主流数据库管理系统时,如SQL Server、Oracle、SYBASE、DB2和Informix,它们各有特点和适用范围。性能、可伸缩性、安全性、易用性、开放性和成本等因素都会影响选择。例如,Oracle以其高性能和高可用性著称...

    二十三种设计模式【PDF版】

    提供 Java运行性能,降低小而大量重复的类的开销. C. 行为模式 设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer ...

Global site tag (gtag.js) - Google Analytics