被Oracle全局暂时表坑了
今天凌晨4点多钟,在客户现场的负责人打电话给我,说非常奇怪,下载功能时快时慢。此下载功能非常复杂,之前一直是我优化,在半梦半醒中打开电脑,通过远程看着现场同事在PL/SQL developer中操作。运行同一条SQL,时快时慢,快的时候大概0.6s,慢的时候超过1分钟。
这条SQL有调用一个函数,功能是动态生成接近200条查询语句,SQL中都是有绑定变量的。是现场的測试环境,刚刚部署,心想应该不是数据库负载所致。
1. 抓取数据库AWR报告,全然没有压力,数据库server配置都是杠杠的。此刻心里有点乱,头一次遇到这样的问题。现场9点钟要跟客户演示,此时已经快5点钟了。
2. 神器出场,打算用10046 trace定位到究竟是那条SQL有问题,trace了多次,仅仅有一次是慢的。期间也有插曲,现场不太会用sqlplus,交互化了非常多时间。从众多的SQL中抽丝剥茧,最终定位到SQL,对照是:
SELECT DISTINCT D.ID, D.TABLE_NAME, DCT.COLUMN_NAME, GG.DATA_TYPE,
GG.TECHPARAM_NAME,DCT.SORT_NO FROM GG_CLASSIFY_TECHPARAM DCT, GG_TECHPARAM
GG, GG_CLASSIFY D, REL_OID_CLASSIFY T WHERE DCT.TECHPARAM_ID = GG.ID AND
D.ID = DCT.CLASSIFY_ID AND T.CLASSIFY_ID = D.ID
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 61.00 61.04 0 25968917 0 156
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 61.00 61.04 0 25968917 0 156
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.80 0.81 0 32461 0 156
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.80 0.81 0 32461 0 156
3. 分析问题,第一感觉是SQL逻辑是否有问题,可惜10046里面没有trace到运行计划,只是看逻辑读,慢的那次应该是产生了笛卡尔积。经过简单的检查,SQL逻辑没有问题,人的第一感觉不一定靠谱。
4. 我在想是什么导致运行计划不准呢,猛然想起REL_OID_CLASSIFY是全局暂时表,高速的想到一种可能,REL_OID_CLASSIFY的统计信息不准导致,通过user_tables查看这张表是没有统计信息的。那就是每次运行都动态採集啰,在Oracle
11g中运行autotrace,发现level=2,我想试试把动态採样的级别,说干就干。
SELECT /*+ dynamic_sampling(T 10) */DISTINCT D.ID, D.TABLE_NAME, DCT.COLUMN_NAME, GG.DATA_TYPE,
GG.TECHPARAM_NAME,DCT.SORT_NO FROM GG_CLASSIFY_TECHPARAM DCT, GG_TECHPARAM
GG, GG_CLASSIFY D, REL_OID_CLASSIFY T WHERE DCT.TECHPARAM_ID = GG.ID AND
D.ID = DCT.CLASSIFY_ID AND T.CLASSIFY_ID = D.ID;
发给开发者,改动相关函数。增量后,多次測试后发现问题攻克了。此时已经快7点了,天已经大亮,我有点倦意,但无法再次入睡。
总结:对于这次暂时表的问题,我想问题在于採样率低了以后造成的恶果。对于全局暂时表要注意两点,一是要锁定暂时表收集统计信息的功能,由于你收集的统计信息肯定是错的;二是使用它时最好是使用动态採用。学习知识,基础非常重要。
被Oracle全局暂时表坑了的更多相关文章
- Oracle中暂时表空间的清理
作者:iamlaosong Oracle暂时表空间主要用来做查询和存放一些缓冲区数据. 暂时表空间消耗的主要原因是须要对查询的中间结果进行排序.暂时表空间的主要作用: 索引create或rebuild ...
- oracle 创建暂时表
提交事务后会自己主动清空,不同的事务之间数据隔离 create global temporary table GLS_REPORT_EXPR ( EXPRNO VARCHAR2(30) not n ...
- ORACLE 五种表的优缺点总结
ORACLE 五种表的优缺点总结: 1.普通表(heap table):适合大部分设计场景,有长处也有缺点. 长处: a,语法简单方便 b,适合大部分场景 缺点: a,更新日志开销较大 b,Delet ...
- 数据库中暂时表,表变量和CTE使用优势极其差别
1 在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势: 1. 暂时表:分为局部暂时表和全局暂时表. 1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接 ...
- oracle暂时表空间 ORA-01652:无法通过16(在表空间XXX中)扩展 temp 字段
今天在查数据的时候报错 ORA-01652:无法通过16(在表空间temp1中)扩展 temp 字段 查看表空间使用明细 SELECT b.tablespace, b.segfile# ...
- oracle表空间查询维护命令大全之三(暂时表空间)史上最全
--UNDO表空间汇总 --查看全部的表空间名字 SELECT NAME FROM V$TABLESPACE; --创建新的UNDO表空间,并设置自己主动扩展參数; CREATE UNDO TABLE ...
- MySQL 5.7怎么爬出暂时表空间的坑
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/n88Lpo/article/details/78126267 导读 怎样确认暂时表是由哪个用户连接创 ...
- 在oracle存储过程中创建暂时表
在oracle的存储过程中,不能直接使用DDL语句,比方create.alter.drop.truncate等. 那假设我们想在存储过程中建立一张暂时表就仅仅能使用动态sql语句了: create o ...
- ORACLE-015:ora-25153 暂时表空间为空,ora01652 无法通过128
写了一个复杂的select语句,突然oracle就报了:ora-25153 暂时表空间为空,这个错误,于是网上查了下.发现了例如以下解决方法:创建一个新的暂时表空间. 首先要有system权限.登录进 ...
随机推荐
- servlet获得完整路径
request.getQueryString() request.getParameterMap() request.getParameterNames() 在servlet中GET请求可以通过Htt ...
- 谷歌推出情境感知API
在 Google I/O 2016 大会上,我们宣布推出新的 Google Awareness API,让您的应用可以利用快照和围栏智能应对用户情境,并且仅需占用极少量的系统资源. 所有开发者均可以通 ...
- ADO.NET程序访问数据的组件
组成--数据集(内存中的数据库) --DataSet数据集 --DataTable数据表 --DataColumn数据列 --DataRow数据行 --DataView数据视图--NET数据提供程序 ...
- Android Training: 设备管理
Android 设备管理 Android2.2 通过Android设备管理API提供对企业级应用的支持.设备管理API在系统级别提供了设备管理特性.这些API可以在企业环境下,需要对员工设备进行控制时 ...
- Cisco cmd命令(三)动态路由协议
路由选择协议:1.矢量距离协议 2.链路状态协议 RIP路由选择协议:1.使用矢量距离协议 2.RIPv1只能使用有类路由 3.RIPv2可以使用无类路由 路由更新定时器:用于将路由器本身完整的路由选 ...
- [Python][MachineLeaning]Python Scikit-learn学习笔记1-Datasets&Estimators
Scikit-learn官网:http://scikit-learn.org/stable/index.html Datasets 标准的数据集格式为一组多维特征向量组成的集合.数据集的标准形状(sh ...
- 仿QQ好友列表界面的实现
TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style ...
- java调试一
Eclipse 平台的特色在于内置了 Java 调试器,该调试器提供所有标准调试功能,包括进行单步执行.设置断点和值.检查变量和值以及暂挂和恢复线程的能力.Eclipse 平台工作台(Eclipse ...
- socket原理详解
1.什么是socket 我们知道进程通信的方法有管道.命名管道.信号.消息队列.共享内存.信号量,这些方法都要求通信的两个进程位于同一个主机.但是如果通信双方不在同一个主机又该如何进行通信呢?在计算机 ...
- (原)测试intel的并行计算pafor
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/4988264.html 参考网址: 关于mt19937:http://www.cnblogs.com/e ...