Oracle执行计划突变诊断之统计信息收集问题
Oracle执行计划突变诊断之统计信息收集问题
1. 情形描述
DB version:11.2.0.4
WITH SQL1 AS(SELECT LAC,CI,TO_NUMBER(C.LONGITUDE) LONGITUDE,TO_NUMBER(C.LATITUDE) LATITUDEFROM MB_SYS_CELL_INFO CWHERE C.CONTY_NAME = '道孚县'),
SQL2 AS(SELECT DISTINCT IMSI, LAC, CIFROM MB_BSS_USER_LOCATIONWHERE HOUR IN (16, 15, 14, 13)AND TIME = TO_TIMESTAMP('20170621','YYYYMMDD')),
SQL3 AS(SELECT C.LONGITUDE, C.LATITUDE,WM_CONCAT(C.SITE_NAME) SITE_NAMEFROM (SELECT DISTINCT TO_NUMBER(A.LONGITUDE)LONGITUDE,TO_NUMBER(A.LATITUDE)LATITUDE,A.SITE_NAMEFROM MB_SYS_CELL_INFO AWHERE A.CONTY_NAME = '道孚县') CGROUP BY C.LONGITUDE, C.LATITUDE)
SELECT SQL1.LONGITUDELNG,SQL1.LATITUDE LAT,COUNT(DISTINCT SQL2.IMSI) COUNT,TO_CHAR(SQL3.SITE_NAME)SITE_NAMEFROM SQL1, SQL2, SQL3WHERE SQL2.LAC = SQL1.LAC AND SQL2.CI =SQL1.CI AND SQL1.LONGITUDE = SQL3.LONGITUDE AND SQL1.LATITUDE = SQL3.LATITUDEGROUP BY SQL1.LONGITUDE, SQL1.LATITUDE, TO_CHAR(SQL3.SITE_NAME) ORDER BY COUNTDESC;
最初的报错,临时表空间不足,
上述SQL为开发应用SQL, 当执行上述SQL时,通过以下命令监控临时表空间。
使用 V$TEMPSEG_USAGE 可监视空间使用情况和分配情况:
SELECTsession_num, username, segtype, blocks, tablespace
FROMV$TEMPSEG_USAGE;
使用 V$SORT_SEGMENT 可确定空间真实使用率百分比:
SELECT(s.tot_used_blocks/f.total_blocks)*100 as pctused
FROM(SELECT SUM(used_blocks) tot_used_blocks
FROMV$SORT_SEGMENT
WHEREtablespace_name='TEMP') s,
(SELECTSUM(blocks) total_blocks
FROMDBA_TEMP_FILES
WHEREtablespace_name='TEMP') f;
发现一条SQL能把64G的临时表空间exhaust,查看对应之行划,发现merge join cartesian
这部分无法回现了。
补:数据库为新建数据库,大量基础表为其他库同步过来的,应用表为实时入库的表(MB_BSS_USER_LOCATION),且很清晰记得当时开启了auto maintaining任务。
查看统计信息任务是否开启:
select client_name,statusfrom dba_autotask_client;
2. 处理步骤
1
2
2.1 查看大表的统计信息
select table_name, partition_name,last_analyzed, STATTYPE_LOCKED fromuser_tab_statisticswhere table_name = 'MB_BSS_USER_LOCATION';
STATTYPE_LOCKED VARCHAR2(5) Type ofstatistics lock:
■ DATA
■ CACHE
■ ALL
last_analyzed, STATTYPE_LOCKED分析得来,该表并没有收集过统计信息,且统计信息被锁。
查看库中其他表的统计信息。
select count(distinct table_name) fromuser_tab_statistics where stattype_locked is not null;
发现还有98张表统计信息被锁定。
2.2 强制收集对应表统计信息
SQL> exec dbms_stats.gather_table_stats(ownname => 'GZ_SAFETY',tabname=>'MB_BSS_USER_LOCATION', force=>TRUE);
PL/SQL proceduresuccessfully completed
再次查看执行计划。
--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 16 | 32608 | 41343 | 00:08:17 |
| 1 | SORT ORDER BY | | 16 | 32608 | 41343 | 00:08:17 |
| 2 | HASH GROUP BY | | 16 | 32608 | 41343 | 00:08:17 |
| 3 | VIEW |VM_NWVW_1 | 16 | 32608 | 41341 | 00:08:17 |
| 4 | HASH GROUP BY | | 16 | 33744 | 41341 | 00:08:17 |
| * 5 | HASH JOIN | | 16 | 33744 | 41340 | 00:08:17 |
| * 6 | HASH JOIN | | 1 | 2069 | 138 | 00:00:02 |
| * 7 | TABLE ACCESS FULL |MB_SYS_CELL_INFO | 448 | 18368 | 68 | 00:00:01 |
| 8 | VIEW | | 448 | 908544 | 70 | 00:00:01 |
| 9 | SORT GROUP BY | | 448 | 26880 | 70 | 00:00:01 |
| 10 | VIEW | | 448 | 26880 | 69 | 00:00:01 |
| 11 | HASH UNIQUE | | 448 | 22400 | 69 | 00:00:01 |
| * 12 | TABLE ACCESS FULL |MB_SYS_CELL_INFO | 448 | 22400 | 68 | 00:00:01 |
| 13 | PARTITION RANGE SINGLE | | 3237748 | 129509920 |41192 | 00:08:15 |
| 14 | PARTITION LIST INLIST | | 3237748 | 129509920 |41192 | 00:08:15 |
| * 15 | TABLE ACCESS FULL | MB_BSS_USER_LOCATION | 3237748 |129509920 | 41192 | 00:08:15 |
发现笛卡尔积merge join消失,执行计划正常。
2.3 查看其他表的统计信息情况(分区表)
select table_name,partition_name, last_analyzed, stattype_lockedfrom user_tab_statistics wherestattype_locked is not null and object_type in ('PARTITION', 'SUBPARTITION');
因为是测试环境,暂不关注这些表,先把MB_BSS_USER_LOCATION表的统计信息锁定打开。
SQL> execdbms_stats.unlock_table_stats(ownname => 'GZ_SAFETY',tabname=>'MB_BSS_USER_LOCATION');
PL/SQL procedure successfully completed, 打开后可通过user_tab_statistics.stattype_locked查看。
补:打开对应用户的统计信息。
DBMS_STATS.UNLOCK_schema_STATS(user);
转载于:https://blog.51cto.com/90sirdb/1941240
相关文章:

安装gym库_强化学习Gym库学习实践(一)
最近看了一篇研究方向相关的文章,介绍了一种DQN的应用,感觉还挺新鲜的。想着把这篇文章复现出来,就开始学习强化学习的相关知识,作为一名小白,这一路走的可是真的十分艰难(我太菜了啊!ÿ…

VS2005编译QT4.8.2
为什么要编译? 因为安装安装版的QT4.8.2,vs2005编译报错。 1.下载QT4.8.2,qt-everywhere-opensource-src-4.8.2.zip,下载vs-AddIn1.1.11. 2.解压QT源码包到C盘, 这里路径为 c:\qt\4.8.2\。 3.配置系统环境变量…

Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)
大龙的博客C博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理 Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译) Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads不要用Win32 API PostThreadMessage…
Matlab编程与数据类型 -- 文本M文件
本微信图文详细介绍了Matlab中的文本M文件。

安卓x86_Android:虚拟机体验基于安卓10的BlissOS V12.2 Android X86版
我是科技鲁工,今天带来基于Android10的x86版本的Bliss os的安装体验。喜欢的朋友可以关注支持一下。Bliss OS是一个基于Android x86项目的开源操作系统,能让您在PC电脑或平板电脑设备上运行最新的Android 10操作系统。该系统基于AOSP(Android开放源代码项…
《C#精彩实例教程》小组阅读10 -- C#属性与方法
本微信图文详细介绍了C#的属性与方法。

JavaScript中几个重要的知识点(1) ---- 面向对象
JavaScript中几个最重要的大知识点 面向对象DOM事件异步交互ajax面向对象 在JS中可以把任意的引用和变量都看成是一个对象。面向对象的主要三个表现形式: 封装继承多态1. 封装 1.1 单例模式 var obj{name: "sam",age: 12,method: function(){var objNamet…

scrollLeft,scrollWidth,clientWidth,offsetWidth到底指的哪到哪的距离
轉自:http://www.cnblogs.com/mrhgw/archive/2006/11/08/553737.html 补充: scrollHeight: 获取对象的滚动高度。 scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的…

连接服务器_命令行连接FTP服务器
Windows下: 打开命令行窗口,输入 ftp,进入ftp命令模式: 输入 open ip地址 端口,进入ftp服务器,如open 172.16.3.77 2121。如下图: 输入Windows下的用户名,然后输入密码(注意:密码是不显示的,输入用户名密码不能时间太长,否则连接断掉)。 查看ftp服务器中的文件,输…

mapreduce作业reduce被大量kill掉
之前有一段时间。我们的hadoop2.4集群压力非常大。导致提交的job出现大量的reduce被kill掉。同样的job执行时间比在hadoop0.20.203上面长了非常多。这个问题事实上是reduce 任务启动时机的问题,因为yarn中没有map slot和reduce slot的概念,且ResourceMan…
Matlab编程与数据类型 -- M文件的编辑和存储
本微信图文详细介绍了Matlab中M文件的编辑和存储。

一个老工程师对理工科学生的忠告
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行…

64 安装_解决“不能安装 64 位Office,因已安装 32 位 Office 产品”问题
换了个电脑装64位的Office 2010(Office_64),双击setup刚准备装,就收到以下错误提示:“不能安装 64 位版本的 Office 2010,因为您当前已经安装 32 位 Office 产品。64 位安装不支持 32 位产品安装:如果要安装 64 位 Off…

Python---内置函数
一、数值类操作 abs(x)求绝对值 1、参数可以是整型,也可以是复数 2、若参数是复数,则返回复数的模complex([real[, imag]])创建一个复数divmod(a, b)分别取商和余数 注意:整型、浮点型都可以float([x])将一个字符串或数转换为浮点数。如果无参…
《C#精彩实例教程》小组阅读11 -- C#结构与类
本微信图文详细介绍了C#的结构与类。

软件测试工程师职业介绍和规划
如存在没有任何错误的程序,那么世界也会不复存在。” 因错误而存在,因修正错误而存在,这就是软件测试工程师的存在之道。虽然测试不是解决错误的根本举措,但却是必须的手段。 软件测试工程师(Software Testing Engine…

python selenium脚本_怎样开始写第一个基于python的selenium脚本
1、下载并安装python(http://www.python.org/geti/)。2、安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩selenium-2.32.0.tar.gz. 把selenium-2.32.0\py\下的selenium整个文件夹放入Python33\Lib\site-packages目录下。3 下载Eclipse后安装pydev插件4 打…
《C#精彩实例教程》小组阅读12 -- C#面向对象技术高级应用
本微信图文详细介绍了C#面向对象技术高级应用。

linux php --ini
$ php --ini

文档类型定义DTD
XML系列:文档类型定义DTD (转) 一,什么是DTD?1,XMl是一种元标记语言,是描叙语言的语言,定义标记的语法结构,从而生成新标记。而DTD则是为新标记建立文档并进行规范说明。也就是说XML定义标记的语…

gis中的擦除_擦除—帮助 | ArcGIS for Desktop
输出 coverage 已不存在。如果注记的左下起点位于擦除多边形内部,则擦除该注记。新结点的属性将设置为零。移除与擦除 coverage 多边形重叠的输入 coverage 多边形。擦除 coverage 必须具有面拓扑。输出 coverage 中所有要素的 User-ID 与输入 coverage 中所有要素的…

C# 3.0/3.5语法新特性示例汇总[转]
//作者:杨卫国//时间:2008年2月21日//说明:C#语法新特型示例usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceC3{ class Program { //新特性1:简单属性,无需另外多写一个私有字段,比较适合于…
Matlab编程与数据类型 -- 循环控制语句之二:while/end
本微信图文详细介绍了Matlab中while/end循环控制语句。

Centos6,7默认启动模式的更改
有时候我们想以为图形页面启动,启动后直接到图形页面,但是有时候也想启动后直接进入文本页面,我们只需要修改init即可; Centos6启动模式配置文件路径:/etc/inittab Centos7启动模式配置文件路径:/usr/lib/s…

python中计数_Python中的统计计数
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。6年前关闭。我有一组五个字母A..E。我想将它们分成3个一组,不重复字母,但是对于从哪里开始我一无所知。解决方案假…

angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )
Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们其中任何一个效果都一样. 但又觉得好像哪里不太对.... 这篇就来说说,我在开发时的应用方…
【转】Flex Application 初始化顺序
转自:http://www.jexchen.com 大家都知道,我们在编写Flex应用程序时,通常是以<mx:Application>标签作为开头,实际上,Flex应用程序在启动运行的时候并不是直接从Application开始运行,在这之前还有一部…
Matlab编程与数据类型 -- 分支条件选择语句if/end
本微信图文详细介绍了Matlab中if/end分支条件选择语句。

插槽 查看硬盘状态_摄影路上的“全能”伴侣 | LaCie DJI Copilot 移动硬盘
照片的安全是摄影人不得不考虑的问题,尤其是长时间外出拍摄时,一旦出现意外,比如存储卡损坏或丢失,那么千辛万苦拍摄的照片将付之东流,造成无法挽回的损失。虽然意外发生的概率并不高,但是为了保险起见&…

【转载】C语言变量详解
原链接:http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html 刚做题时发现全局变量会自动初始化,如int型则自动初始化为0,double则初始化为0.000000....。而局部变量如果没有初始化的话,初值为一随机数。于是…