常见的分区表DDL如 split partition、add partition都会生成没有统计信息的表分区table partition,长期以来我对dbms_stats.lock_table_stats有一个错误的认识,即对于没有统计信息的分区,LOCK_STATS并不生效。 实际测试发现锁表统计信息对没有统计信息的分区同样有效,结果就是自动收集统计信息的作业不会收集这些实际没有统计信息的分区:

CREATE TABLE MacleanV
nologging
partition by range(object_id)
(partition p1 values less than (99999) tablespace users,
partition p2 values less than (maxvalue) tablespace users)
as select * from dba_objects where rownum=0; SQL> insert into macleanV select * from dba_objects; 51029 rows created. SQL> commit; Commit complete. SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV'); PL/SQL procedure successfully completed. SQL> select num_rows,blocks from dba_tables where table_name='MACLEANV'; NUM_ROWS BLOCKS
---------- ----------
51029 748 SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV'; PARTITION_NAME NUM_ROWS BLOCKS
------------------------------ ---------- ----------
P1 51029 748
P2 0 0 SQL> exec dbms_stats.lock_table_stats('SYS','MACLEANV'); PL/SQL procedure successfully completed. SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV');
BEGIN dbms_stats.gather_table_stats('SYS','MACLEANV'); END; *
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 15027
ORA-06512: at "SYS.DBMS_STATS", line 15049
ORA-06512: at line 1 SQL> alter table macleanv split partition p1 at (20001) into (partition p3, partition p4); Table altered. SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV'; PARTITION_NAME NUM_ROWS BLOCKS
------------------------------ ---------- ----------
P4
P2 0 0
P3 SQL> exec DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC; PL/SQL procedure successfully completed. SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV'; PARTITION_NAME NUM_ROWS BLOCKS
------------------------------ ---------- ----------
P2 0 0
P3
P4 SQL> exec DBMS_STATS.GATHER_DATABASE_STATS; PL/SQL procedure successfully completed. SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV'; PARTITION_NAME NUM_ROWS BLOCKS
------------------------------ ---------- ----------
P2 0 0
P3
P4

使用DBMS_STATS.LOCK_TABLE_STATS锁定相关统计信息
语句为:
EXECUTE DBMS_STATS.LOCK_TABLE_STATS (‘owner name’, ‘table name’);

查询锁定状态
SELECT stattype_locked FROM dba_tab_statistics

当锁定表的统计信息后,这个表相关的对象的统计信息也被锁定,比如列信息、直方图、索引的统计信息。

在锁定前,请在适当时刻对表的统计信息进行收集,并确认当前的统计信息是合适的。
在锁定后,请用刷新shared pool或grant/revoke等方法将表相关的SQL失效。

更多DBMS_STATS.LOCK_TABLE_STATS信息可以参考:

Preserving Statistics using DBMS_STATS.LOCK_TABLE_STATS [ID 283890.1]
ORA-7445 [kdapprv] Running dbms_stats.gather_table_stats or dbms_stats.lock_table_stats [ID 333377.1]
FAQ: Automatic Statistics Collection Jobs (10g and 11g) [ID 1233203.1]

[z]dbms_stats.lock_table_stats对于没有统计信息的表分区同样有效的更多相关文章

  1. 使用dbms_stats.gather_table_stats调整表的统计信息

    创建实验表,插入10万行数据 SQL> create table test (id number,name varchar2(10)); Table created. SQL> decla ...

  2. oracle里的统计信息

    1 oracle里的统计信息 Oracle的统计信息是这样的一组数据,存储在数据字典,从多个维度描述了oracle数据库对象的详细信息,有6种类型 表的统计信息:记录数.表块的数量.平均行长度等 索引 ...

  3. 有关Oracle统计信息的知识点[z]

    https://www.cnblogs.com/sunmengbbm/p/5775211.html 一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如, ...

  4. 使用DBMS_STATS来收集统计信息【转】

    overview Oracle's cost-based optimizer (COB) uses statistics to calculate the selectivity (the fract ...

  5. 为准确生成执行计划更新统计信息-analyze与dbms_stats

    如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息. 例如索引跳跃式扫描(INDEX ...

  6. 收集oracle统计信息

    优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...

  7. ORACLE收集统计信息

    1.     理解什么是统计信息 优化器统计信息就是一个更加详细描述数据库和数据库对象的集合,这些统计信息被用于查询优化器,让其为每条SQL语句选择最佳的执行计划.优化器统计信息包括: ·       ...

  8. PLSQL_统计信息系列09_统计信息在不同数据库中迁移

    2014-01-05 Created By BaoXinjian

  9. PLSQL_统计信息系列02_统计信息的对象

    20150505 Created By BaoXinjian

随机推荐

  1. [C语言]逆序的三位数

    ---------------------------------------------------------------------------------------- //  main.c ...

  2. 吴裕雄 01-mysql管理

    SHOW DATABASES; update user set authentication_string = password("123456") where user='roo ...

  3. 梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python)

    梯度迭代树(GBDT)算法原理及Spark MLlib调用实例(Scala/Java/python) http://blog.csdn.net/liulingyuan6/article/details ...

  4. Struts 框架

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...

  5. java-学习1

    作为一个想要深入的程序猿,只是学习前端是不够的,我总结我的前端工作是围绕着html.css.js展开写的再好也是展现在表面,所以 我想学习一门能够深入的后台语言,想来想去我还是选择java作为以后深入 ...

  6. Navicat远程连接不上mysql解决方案(已测试过)

    内容参考网上的文章,此处只做记录. 一.can‘t connect to MySql server on ‘192.168.X.X’ 这是因为mysql端口被防火墙拦截,需用linux执行如下指令:( ...

  7. Compute Shader

    [Compute Shader] 1.Similar to regular shaders, compute shaders are Asset files in your project, with ...

  8. 修复回写PR时到料日期重复扣减检验周期的问题:

    问题描述: 修复回写PR时到料日期重复扣减检验周期的问题:系统回写的外购半成品PR交货日期未按采购周期回写,从8-10日开始均于10天交期回写,例以下9-5日今天回写的PR,采购周期12天,结果回写到 ...

  9. .net连接MySql 出错

    1>C#连接MySQL异常:The host localhost does not support SSL connections. 需要在连接字符串加入:SslMode = none;即可解决 ...

  10. C library:<cctype>(ctype.h)

    1, isalnum(): check whether c is either a decimal digit or an uppercase or lowercase letter. 2, isal ...