被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权限.登录进 ...
随机推荐
- Bootstrap在线编辑器简单分享
Bootstrap 已经使响应式网站开发变得简单很多. 但是如果你不必手动写全部代码,事情会如何呢? 如果你可以自由地选择你想要使用的Bootstrap 组件.并可以把它们拖拽到画布中,事情会如何呢? ...
- 怎样实现IOS开发中的数据存储方式
iOS 开发中,一般有如下几种数据存储方式.需要根据具体的业务场景,选择 合适的数据存储方式. (1) 用户默认设置 – 这种情况通常不需要用户干预,如游戏通关信息,Video 播放记录,或者 Ap ...
- Guice 学习(六)使用Provider注入服务( Provider Inject Service)
1.定义接口 package com.guice.providerInject; import com.google.inject.ProvidedBy; public interface Servi ...
- 设置 git config 的一些默认配置
设置 git status的颜色. git config --global color.status auto 一.Git已经在你的系统中了,你会做一些事情来客户化你的Git环境.你只需要做这些设置一 ...
- js 随手记
var name = 'frog' function hello(){ alert(name); // undefined var name = 'bbc'; } 在javascript中,函数是可以 ...
- MySQL 触发器的定义
-- Insert DELIMITER $$ USE `testdatabase`$$ DROP TRIGGER /*!50032 IF EXISTS */ `Trigger_XXX_INSERT`$ ...
- HTML5新增的拖放API---(一)
HTML5新增了关于拖放的API,通过API可以让HTML页面的任意元素都变成可拖动的,通过使用拖放机制可以开发出更友好的人机交互的界面. 拖放操作可以分为两个动作:在某个元素上按下鼠标移动鼠标(没有 ...
- C#遍历数组
Eg: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- Linux中Firefox——Httpfox插件安装及使用
Httpfox插件安装步骤: 1.打开firefox浏览器,点击左上方"工具"中的"附加组件" 2.在弹出页中搜索"Httpfox",点击下 ...
- Ubuntu14.04上安装tftpd服务
首先sudo apt-get install tftpd-hpa, tftp-hpa 然后sudo vim /etc/default/tftpd-hpa 配置文件如下 TFTP_USERNAME=& ...