今天凌晨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全局暂时表坑了的更多相关文章

  1. Oracle中暂时表空间的清理

    作者:iamlaosong Oracle暂时表空间主要用来做查询和存放一些缓冲区数据. 暂时表空间消耗的主要原因是须要对查询的中间结果进行排序.暂时表空间的主要作用: 索引create或rebuild ...

  2. oracle 创建暂时表

    提交事务后会自己主动清空,不同的事务之间数据隔离 create global temporary table GLS_REPORT_EXPR (   EXPRNO VARCHAR2(30) not n ...

  3. ORACLE 五种表的优缺点总结

    ORACLE 五种表的优缺点总结: 1.普通表(heap table):适合大部分设计场景,有长处也有缺点. 长处: a,语法简单方便 b,适合大部分场景 缺点: a,更新日志开销较大 b,Delet ...

  4. 数据库中暂时表,表变量和CTE使用优势极其差别

    1 在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势: 1. 暂时表:分为局部暂时表和全局暂时表. 1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接 ...

  5. oracle暂时表空间 ORA-01652:无法通过16(在表空间XXX中)扩展 temp 字段

    今天在查数据的时候报错  ORA-01652:无法通过16(在表空间temp1中)扩展 temp 字段 查看表空间使用明细 SELECT b.tablespace,        b.segfile# ...

  6. oracle表空间查询维护命令大全之三(暂时表空间)史上最全

    --UNDO表空间汇总 --查看全部的表空间名字 SELECT NAME FROM V$TABLESPACE; --创建新的UNDO表空间,并设置自己主动扩展參数; CREATE UNDO TABLE ...

  7. MySQL 5.7怎么爬出暂时表空间的坑

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/n88Lpo/article/details/78126267 导读 怎样确认暂时表是由哪个用户连接创 ...

  8. 在oracle存储过程中创建暂时表

    在oracle的存储过程中,不能直接使用DDL语句,比方create.alter.drop.truncate等. 那假设我们想在存储过程中建立一张暂时表就仅仅能使用动态sql语句了: create o ...

  9. ORACLE-015:ora-25153 暂时表空间为空,ora01652 无法通过128

    写了一个复杂的select语句,突然oracle就报了:ora-25153 暂时表空间为空,这个错误,于是网上查了下.发现了例如以下解决方法:创建一个新的暂时表空间. 首先要有system权限.登录进 ...

随机推荐

  1. Bootstrap在线编辑器简单分享

    Bootstrap 已经使响应式网站开发变得简单很多. 但是如果你不必手动写全部代码,事情会如何呢? 如果你可以自由地选择你想要使用的Bootstrap 组件.并可以把它们拖拽到画布中,事情会如何呢? ...

  2. 怎样实现IOS开发中的数据存储方式

    iOS 开发中,一般有如下几种数据存储方式.需要根据具体的业务场景,选择 合适的数据存储方式. (1)  用户默认设置 – 这种情况通常不需要用户干预,如游戏通关信息,Video 播放记录,或者 Ap ...

  3. Guice 学习(六)使用Provider注入服务( Provider Inject Service)

    1.定义接口 package com.guice.providerInject; import com.google.inject.ProvidedBy; public interface Servi ...

  4. 设置 git config 的一些默认配置

    设置 git status的颜色. git config --global color.status auto 一.Git已经在你的系统中了,你会做一些事情来客户化你的Git环境.你只需要做这些设置一 ...

  5. js 随手记

    var name = 'frog' function hello(){ alert(name); // undefined var name = 'bbc'; } 在javascript中,函数是可以 ...

  6. MySQL 触发器的定义

    -- Insert DELIMITER $$ USE `testdatabase`$$ DROP TRIGGER /*!50032 IF EXISTS */ `Trigger_XXX_INSERT`$ ...

  7. HTML5新增的拖放API---(一)

    HTML5新增了关于拖放的API,通过API可以让HTML页面的任意元素都变成可拖动的,通过使用拖放机制可以开发出更友好的人机交互的界面. 拖放操作可以分为两个动作:在某个元素上按下鼠标移动鼠标(没有 ...

  8. C#遍历数组

    Eg: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  9. Linux中Firefox——Httpfox插件安装及使用

    Httpfox插件安装步骤: 1.打开firefox浏览器,点击左上方"工具"中的"附加组件" 2.在弹出页中搜索"Httpfox",点击下 ...

  10. Ubuntu14.04上安装tftpd服务

    首先sudo apt-get install tftpd-hpa,  tftp-hpa 然后sudo vim /etc/default/tftpd-hpa 配置文件如下 TFTP_USERNAME=& ...