oracle结果集过大,多重子查询/大结果集查询问题
多重子查询/大结果集查询问题:
问题接此帖http://www.itpub.net/273652.html
上次问题通过调整SGA/SQL语句得到优化[最终情况:oracle关闭重起后,程序第一次执行存储过程(需要大量读取物理文件):1500秒,等第2次跑时150秒(数据进入sga区了),完全符合一切oracle教科书的内容!]
现在的问题是上次问题的综合,
起因: 在我们的应用系统(OLTP,其他的事务都比较小且并发用户也比较多)中有一个查询重复的需求,比如企业/市/省/全国各级管理部门,每一级都需要查本级别管辖范围内是否存在重复的人员记录,程序人员采用多重子查询来实现,其中select嵌套5层,子查询的结果集返回数也很巨大,不会小于20W行;
也曾尝试使用临时表,但临时表(insert *** select )单独跑select 还比较快,12秒吧,但是insert的过程比较慢,得20多分钟
btw:临时表这个对象放在哪了呢?对它的操作(尤其是大结果集时)容易产生什么瓶颈呢?临时表后边也是接着一大堆的查询条件,有可能还有优化的,为什么单独执行SELECT比较快,而INSERT就慢呢?而且事务实在巨大,还有临时表嵌套的情况啊!
(后来没法子,又回到了多重子查询的老路上来,明知有问题啊!)
测试环境(以下都是测试机上的运行结果)/真实环境(年底上线,且还需要从SQL SERVER中迁移):
服务器: P4 2.8 内存2G/ IBM H85 POWERPC 4颗/内存 12G
软件:win2k+oracle8.1.7.0/ aix 4.3.3+ oracle8.1.7.4
表现:
oracle关闭重起后,程序第一次执行存储过程(需要大量读取物理文件):1500秒,等第2次跑时150秒(数据进入sga区了)
虽然第2次执行存储过程比较快的,可是每换一个部门,意即:查询条件改变,就需要重新的1500秒!这个很显然不能满足客户的要求,而且管理部门众多,测试的是一个部门的一个查询,实际的情况是N多的府县道台,他们各有各的查询,到时候岂不是歇菜了啊!
附件内容:
1、存储过程(Ora_PersonProc.sql/Ora_PersddonProc.sql)和最终的SELECT语句(XXXXXX.sql);
2、数据库物理文件情况(data.jpg):
TEMP/RBS表空间都有扩展,怀疑有大量的磁盘排序/回滚段请求导致扩展(因为事务请求的数据实在太多了)
3、statspack报告(statspack3_4.txt):
是第2次运行同样的存储过程时的前后SNAP,这个就比较快的(3分钟左右),初步分析了一下:问题语句不言自明,就是这个
Buffer Gets Executions Gets per Exec % Total Hash Value
--------------- ------------ -------------- ------- ------------
29,912,794 1 29,912,794.0 100.0 4192360910
select et.* from ( Select enta.*,sd.FName as FPersonTypeName f
rom ( Select ed.*,svs.FSpecialityName,svs.FSpecialityTypeName,
svt.FName As FTechName ,svt.FLevel as FTechLevel, sve.FName as
FEduName,sve.FLevel As FEduLevel from ( select ente.*, ent.FAd
dress,ent.FName as FEnterpriseName from ( select ed3.* from (
还有:
Execute to Parse %: -46.32
是什么意思呢?
各位老大,还给看看有什么别的问题么?
4、分析表时报错信息(analyze_error.txt):ora-00600
谢谢大家!
oracle结果集过大,多重子查询/大结果集查询问题相关推荐
- Oracle数据库多重子查询嵌套的坑
在Oracle数据库中多重子查询的使用 代码如下: SELECT T.*, ROWNUM RNFROM (SELECT B.*,NVL(A.AMOUNT, 0) AMOUNT,V.FULLNAME,D ...
- 怎样学好Oracle子查询,Oracle学习(六):子查询
Oracle学习(6):子查询 子查询 为何要用子查询 SQL> --查询工资比SCOTT高的员工信息 SQL> --1. 知道SCOTT的工资 SQL> select sal fr ...
- 多重子查询提取每次子查询的SQL语句
之前用的oracle大型数据库,写的sql都是依据oracle的.移动端部分用的不能是oracle数据库,只能采用小型数据库,现场采用db2. db2大小只能论k为单位,很多基本的sq ...
- 怎样将1900-01-00变成-_《转生成蜘蛛又怎样》第2集预告:人类到来,蜘蛛子遭遇大危机...
哈喽,大家好,我是木子. 在本次更新的一月新番中,有一部内定的"黑马之作",它就是<转生成蜘蛛又怎样!>.这是一部奇幻.穿越.冒险.励志题材的动漫,同时也有漫画在连载, ...
- mysql查出的结果太大 php_如何解决PHP使用mysql_query查询超大结果集超内存问题
再使用mysql_query查询超大结果集的时候会出现超出内存限制的致命错误,这是因为mysql_query采用的是查询全部结果然后把结果集全部缓存到内存中的方式. mysql的查询还提供了另外一种查 ...
- 【从零开始学习Oracle数据库】(3)函数与子查询和连接查询
#-- --查询语句的基本格式 --select 字段 1 , 字段 2 , 字段 3 , 表达式 , 函数 , ... --from 表名 --where 条件 --group by 列名 --ha ...
- Rails中多重子表多条件查询
在项目创建时为了逻辑上的简单,采用了多级子表嵌套;而且底层子表大多是静态表,即没有用has_one或belongs_to作为相互关系的. 在某个对象的搜索涉及到3个底层子表中的字段的比较,很难用whe ...
- oracle子查询 select语句,select查询之三:子查询
Select语句的总结构: Select [字段] [限制条件] from [数据表] /子查询[嵌套查询] where [筛选条件] /子查询[嵌套查询] group by[分组字段] /子查 ...
- oracle星型查询,优化星型查询
当你使用星型查询时,你需要考虑以下两点: 调整星型查询 使用星型转换 调整星型查询为了获得星型查询的最佳性能,遵循一些基本准则是非常重要的:应该为事实表的每一个外键列都创建位图索引. 初始化参数STA ...
最新文章
- SQL Server日志清除的两种方法 .
- 仿照redis写的nginx开机画面
- 正则表达式的坑与调试
- 什么是脱离文档流?什么是文档流?
- 【问链财经-区块链基础知识系列】 第三十八课 以太坊智能合约账户全解析
- 程序员面试100题之八:不要被阶乘吓倒(二进制表示中最低位1的位置 )
- 事件流调试器查看Retract事件
- forEach和for in
- Java 实现Https访问工具类 跳过ssl证书验证
- Unity网络--HLAPI(1):服务器客户端变量同步,脏标识以及定制特性SyncVar
- mysql打印语句_抓取mysql、redis、mongodb、http等协议并打印语句
- MySQL与PostgreSQL比较,哪个更好、我们该选用哪个?
- java窗体加入声音_我用JAVA写好了一个窗体游戏,怎么加背景音乐?
- mysql 去重 性能比较_mysql 去重方法distinct 与 group by 性能比较 | 学步园
- 饮冰三年-人工智能-Python-11之HelloWorld
- plc通讯的握手信号_PLC工程师教你:从原理搞懂RS485串口通讯
- 最小二乘支持向量机(LSSVM)推导
- 解决上传 Gitee 后图片显示不出来
- 支付宝对账数据下载及解析
- php抢票程序,HTML实现抢票功能(设定时间打开抢票的页面)