千家信息网

Oracle执行计划突变诊断之统计信息收集问题

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,Oracle执行计划突变诊断之统计信息收集问题1. 情形描述DB version:11.2.0.4WITH SQL1 AS (SELECT LAC, CI, TO_NU
千家信息网最后更新 2025年11月08日Oracle执行计划突变诊断之统计信息收集问题

Oracle执行计划突变诊断之统计信息收集问题

1. 情形描述

DB version11.2.0.4

WITH SQL1 AS (SELECT LAC,         CI,         TO_NUMBER(C.LONGITUDE) LONGITUDE,         TO_NUMBER(C.LATITUDE) LATITUDE    FROM MB_SYS_CELL_INFO C   WHERE C.CONTY_NAME = '道孚县'),SQL2 AS (SELECT DISTINCT IMSI, LAC, CI    FROM MB_BSS_USER_LOCATION   WHERE 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_NAME    FROM (SELECT DISTINCT TO_NUMBER(A.LONGITUDE)LONGITUDE,                          TO_NUMBER(A.LATITUDE)LATITUDE,                          A.SITE_NAME            FROM MB_SYS_CELL_INFO A           WHERE A.CONTY_NAME = '道孚县') C   GROUP BY C.LONGITUDE, C.LATITUDE)SELECT SQL1.LONGITUDELNG,       SQL1.LATITUDE LAT,       COUNT(DISTINCT SQL2.IMSI) COUNT,       TO_CHAR(SQL3.SITE_NAME)SITE_NAME  FROM SQL1, SQL2, SQL3 WHERE 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, tablespaceFROMV$TEMPSEG_USAGE;


使用 V$SORT_SEGMENT 可确定空间真实使用率百分比:

SELECT(s.tot_used_blocks/f.total_blocks)*100 as pctusedFROM(SELECT SUM(used_blocks) tot_used_blocksFROMV$SORT_SEGMENTWHEREtablespace_name='TEMP') s,(SELECTSUM(blocks) total_blocksFROMDBA_TEMP_FILESWHEREtablespace_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_statistics where 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_locked        from 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);


信息 统计 空间 情况 任务 数据 数据库 道孚 道孚县 应用 问题 使用率 再次 命令 基础 实时 情形 步骤 环境 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 neo4j数据库连接 慧源通网络技术有限公司电话 西门子中国软件开发 华为济南互联网科技产业园 物联网网络安全的新动向是 芜湖管理软件开发要多少钱 湖北出口外贸软件开发 idea远程部署到腾讯云服务器 网络安全加解密实验 华东师范大学自由数据库 git 服务器 钩子 文明重启发现服务器不见了 小学生网络网络安全竞赛 获取db2数据库日期函数 手机端软件开发学习 饥荒联机版找不到服务器解决办法 辽宁华盛软件开发有限公司 看懂服务器日志 计算机网络技术子网划分实训 服务器怎么通过管理口装系统 网关与服务器建立连接失败 ssl网络安全工程师教程 2核4g服务器一天多少流量 软件开发和网站怎么关联 益阳长沙会员管理软件开发 软件开发中的非移交产品 360网络安全中心现在叫什么 数据库签到系统设计 戴尔870w服务器电源启动 关系数据库基础期末考试
0