为什么80%的码农都做不了架构师?>>>   

大家做过统计的一些存储过程可能会知道,我们经常有这类表,要先truncate它,执行插入,再在执行相关sql,这就会导致有一个时间误差,如果在truncate和插入的中间进行了表的分析,这个统计信息是不准确的,也会影响执行计划:

[sql] view plain copy print ?
  1. SQL> select num_rows,blocks  from user_tables;
  2. NUM_ROWS     BLOCKS
  3. ---------- ----------
  4. 50315        103
  5. SQL> turncate table daodao_temp;
  6. SP2-0734: unknown command beginning "turncate t..." - rest of line ignored.
  7. SQL> truncate table daodao_temp;
  8. Table truncated.
  9. SQL> select num_rows,blocks  from user_tables;
  10. NUM_ROWS     BLOCKS
  11. ---------- ----------
  12. 50315        103
  13. SQL> execute dbms_stats.gather_table_stats(user,'DAODAO_TEMP');
  14. PL/SQL procedure successfully completed.
  15. SQL> select num_rows,blocks  from user_tables;
  16. NUM_ROWS     BLOCKS
  17. ---------- ----------
  18. 0          0
SQL> select num_rows,blocks  from user_tables; NUM_ROWS     BLOCKS
---------- ----------50315        103SQL> turncate table daodao_temp;
SP2-0734: unknown command beginning "turncate t..." - rest of line ignored.
SQL> truncate table daodao_temp;Table truncated.SQL> select num_rows,blocks  from user_tables; NUM_ROWS     BLOCKS
---------- ----------50315        103SQL> execute dbms_stats.gather_table_stats(user,'DAODAO_TEMP');PL/SQL procedure successfully completed.SQL> select num_rows,blocks  from user_tables; NUM_ROWS     BLOCKS
---------- ----------0          0

--这里是关键点,我们有个按天分析的job,如果这个时候分析了这个数据,会认为数据为0,但是之后就是录入数据到临时表

SQL> select num_rows,blocks  from user_tables;

NUM_ROWS     BLOCKS
---------- ----------
         0          0

SQL> insert into daodao_temp select object_id,object_id from dba_objects;

50315 rows created.

SQL> commit;

Commit complete.

有数据进行入库:

好了,这个时候已经不会再执行统计信息的存储过程了(除非第二天的时候),这个时候如果有一个sql执行,就会导致执行计划可能错误了。

这种现象在月初尤其明显,道理类似的。

我们可以对这类临时表进行录入数据的锁定统计信息:

SQL> execute dbms_stats.gather_table_stats(user,'DAODAO_TEMP');

SQL> select num_rows,blocks  from user_tables;

NUM_ROWS     BLOCKS
---------- ----------
     50315        103

SQL> execute DBMS_STATS.LOCK_TABLE_STATS(user,'DAODAO_TEMP');

PL/SQL procedure successfully completed.

SQL> TRUNCATE TABLE DAODAO_TEMP;

Table truncated.

SQL> execute dbms_stats.gather_table_stats(user,'DAODAO_TEMP');
BEGIN dbms_stats.gather_table_stats(user,'DAODAO_TEMP'); END;

*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 13056
ORA-06512: at "SYS.DBMS_STATS", line 13076
ORA-06512: at line 1

这样搜集统计信息的时候就不会搜集了,相关数据字典可以查询这个:

SQL> select stattype_locked from user_tab_statistics where table_name ='DAODAO_TEMP';

STATT
-----
ALL

all表示锁定了 ,空表示没有锁定:

如果需要解锁,可以执行如下:

SQL> execute dbms_stats.unlock_table_stats(user,'DAODAO_TEMP');

PL/SQL procedure successfully completed.

转载于:https://my.oschina.net/farces/blog/664334

对于经常需要truncate的表进行固定统计信息相关推荐

  1. Hive 3.1.2 Parquet 格式表的 rawDataSize 统计信息不正确

    Hive 统计信息的设置和使用,请参考 HIVE Statistics(Hive 统计信息) 的说明和查询优化详解 使用 tpcds-3 数据集进行测试 ORC 格式表的测试 创建 orc 格式的表, ...

  2. oracle 查询表里信息_如何查看表的历史统计信息

    多谢Yong和netbanker的回复,查看了一下,发现10205已经提供了 FUNCTION DIFF_TABLE_STATS_IN_HISTORY RETURNS DBMS_STATS Argum ...

  3. 如何查看表和索引的统计信息

    如何查看表和索引的统计信息 原文:如何查看表和索引的统计信息 这几天要求做一个服务器的统计信息,主要针对表和索引.下面我就简单分享几个查询数据表和索引统计信息的方法: 1.使用T-SQL 语句实现: ...

  4. oracle表数据收集,Oracle收集对象统计信息

    Oracle9i之前,由DBA负责收集对象统计信息.默认情况下,数据库不提供对象统计信息.到了oracle10g,在创建数据库的时候,就创建 一. 概述 Oracle9i之前,由DBA负责收集对象统计 ...

  5. 【云和恩墨】一次 truncate 核心表衍生的安全管理思考

    第一章 一次 truncate 核心表衍生的安全管理思考 云和恩墨 | 2016-05-06 17:56 本文编辑整理来自上周四晚云和恩墨大讲堂 黄嵩 关于数据安全问题的分享.安全问题涉及到信息系统的 ...

  6. MySql清空表的方法介绍 : truncate table 表名

    清空某个mysql表中所有内容 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate tabl ...

  7. Oracle的闪回特性之恢复truncate删除表的数据

    /* 2008/06/06 *环境:Windows XP +Oracle10.2.0.1 *循序渐进oracle--数据库管理.优化与备份恢复 *循序渐进oracle第8章:Oracle的闪回特性之恢 ...

  8. php delete和truncate,TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。...

    TRUNCATE 删除表,无法回退.默认选择为整个表的内容,所以不能加条件. DELETE 删除表,可以回退.可以带where 条件.建议使用delete.但是TRUNCATE 删除表数据比delet ...

  9. GTK+图形化应用程序开发学习笔记(五)—组装盒、组合表、固定容器构件

    GTK+图形化应用程序开发学习笔记(五)-组装盒.组合表.固定容器构件 一.组装盒 组装盒(GtkBox)也称为组合构件.使用组装盒可以将多个构件放在一个容器中.容器可以把组装盒看作是一个构件.不像按 ...

最新文章

  1. java 转换int类型数值到对应的金额大写
  2. wordpress安装_WordPress第三课:使用SOFTACULOUS安装WORDPRESS
  3. 内核中的内存申请:kmalloc、vmalloc、kzalloc、get_free_pages 之间的区别
  4. centos 7 一键安装gitlab
  5. C++ 内存模型——虚表(vtbl)的访问
  6. 2、两数相加(python)
  7. PC软件标题修改器 支持加壳
  8. 【.NET IoT】把达特甲醛传感器DART WZ-S接到树莓派RaspberryPi 3 b+上
  9. python的spider程序下载_开源网络爬虫程序(spider)一览
  10. 关于菜鸡学习时服务器购买的注意点
  11. COGS 2211. [BZOJ3653]谈笑风生
  12. Blockchain Empowered Asynchronous Federated Learning for Secure Data Sharing in IoV
  13. 2018大数据培训学习路线图(详细完整版)
  14. Android GPS 简介
  15. 附录3:RMA算法原理
  16. 创建TLS 客户端凭据时发生严重错误。内部错误状态为 10013。处理记录
  17. Proxy 、Relect、响应式
  18. 如何使用Zabbix官方模板轻松实现Docker容器监控?
  19. [每日100问][2011-9-08]iphone开发笔记,今天你肿了么
  20. linux 串口连接交换机,怎么用串口线连接电脑和交换机 连接步骤教程

热门文章

  1. activemq生产者和消费者的双向通信
  2. windows下gvim中文乱码解决方案
  3. Kafka架构设计:分布式发布订阅消息系统
  4. “ddl”有一个无效 SelectedValue,因为它不在项目列表中。
  5. FS_S5PC100 UBOOT-2011.12移植,支持DM9000
  6. 一个计算机爱好者的不完整回忆(二十八)关于计算机书籍
  7. 全国计算机等级考试题库二级C操作题100套(第98套)
  8. g++ linux 编译开栈_方舟编译器编译hello world踩坑全记录
  9. centos上使用高版本gcc、g++
  10. java 会话共享_java – servlet如何工作?实例化,会话,共享变量和多线程