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

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

例如索引跳跃式扫描(INDEX SKIP SCAN)例子中,如果不对表EMPLOYEE 及索引收集一下统计信息,就不是INDEX SKIP SCAN策略了。

分析统计信息

analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有索引。 若不指定则全部都分析。

---table统计信息
analyze table EMP compute statistics for table;

---column统计信息
analyze table EMP compute statistics for all columns;

---索引统计信息
analyze table EMP compute statistics for all indexes;

---索引列统计信息
analyze table EMP compute statistics for all indexed columns; 

---效果等于 analyze table tablename compute statistics for table for all indexes for all columns
analyze table tablename compute statistics

查看统计信息

for table的统计信息存在于视图:user_tables 、all_tables、dba_tables

for all indexes的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes

for all columns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns

SCOTT@PDBORCL> analyze table EMP compute statistics for table;
表已分析。

SCOTT@PDBORCL> analyze table EMP compute statistics for  all columns;
表已分析。

SCOTT@PDBORCL> analyze table EMP compute statistics for  all indexes;
表已分析。

SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = ‘EMP‘;
TABLE_NAME    NUM_ROWS
----------- -----------
  EMP            14

SCOTT@PDBORCL> select index_name,uniqueness  from user_indexes where table_name = ‘EMP‘;
INDEX_NAME   UNIQUENES
--------    ---------
PK_EMP       UNIQUE

SCOTT@PDBORCL> select column_name,data_type  from user_tab_columns where table_name = ‘EMP‘ ;

COLUMN_NAME   DATA_TYPE
-------------------------
EMPNO        NUMBER
ENAME        VARCHAR2
JOB          VARCHAR2
MGR          NUMBER
HIREDATE     DATE
SAL          NUMBER
COMM         NUMBER
DEPTNO       NUMBER

已选择 8 行。

SCOTT@PDBORCL> ^A

删除统计信息

会删除emp所有的statistics。

analyze table emp delete statistics

删除只是某些列变为空,如emp表的行数为空了

SCOTT@PDBORCL> analyze table emp compute statistics;

表已分析。

SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = ‘EMP‘;

TABLE_NAME    NUM_ROWS
--------    ----------
EMP         14

SCOTT@PDBORCL> analyze table emp delete statistics;

表已分析。

SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = ‘EMP‘;

TABLE_NAME   NUM_ROWS
-------- ----------
EMP

SCOTT@PDBORCL>

dbms_stats

dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。

语法:

dbms_stats.gather_table_stats (
    ownname varchar2,
    tabname varchar2,
    partname varchar2,
    estimate_percent number,
    block_sample boolean,
    method_opt varchar2,
    degree number,
    granularity varchar2,
    cascade boolean,
    stattab varchar2,
    statid varchar2,
    statown varchar2,
    no_invalidate boolean,
    force boolean
);

dbms_stats.delete_table_stats 用于删除统计信息。

例子:

------删除统计信息[email protected]> exec dbms_stats.delete_table_stats (ownname => ‘scott‘,tabname => ‘emp‘);

PL/SQL 过程已成功完成。
----查询统计信息
SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = ‘EMP‘;

TABLE_NAME NUM_ROWS
-------- ----------
EMP

---获取统计信息[email protected]> exec dbms_stats.gather_table_stats (ownname => ‘scott‘,tabname => ‘emp‘);

PL/SQL 过程已成功完成。
---重新查新统计信息
SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = ‘EMP‘;

TABLE_NAME  NUM_ROWS
-------- ----------
EMP          14

SCOTT@PDBORCL>

参考:

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

http://docs.oracle.com/database/121/TGSQL/tgsql_stats.htm#TGSQL389

时间: 2024-10-12 02:34:15

为准确生成执行计划更新统计信息-analyze与dbms_stats的相关文章

Oracle执行计划与统计信息的一些总结

[日期:2011-08-05]来源:Linux社区  作者:wangshengfeng1986211[字体:大 中 小] 2010-07-01 15:03 1.SET AUTOTRACE ON EXPLAIN(set autot on exp)SQLPLUS的命令,在执行SQL语句的同时显示执行计划,设置EXP(LAIN)的目的是只显示执行计划而不显示统计信息..2.SQL>explain plan for select ````````;SQL>select * from table(dbm

SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. 今天来写一下统计信息对于复合索引在预估时候的计算方法和潜在问题. 本文原形来自于是个实际业务问题,某SQL在利用一个符合索引做查询的时候,发现始终会出现预估误差较大的情况, 而改变复合索引的列顺序,这个预估行数的误差会发生变化, 也就是说,Create  index idx_index1 ON T

执行计划基础 统计信息

我们知道ORACLE 对sql查询是基于CBO的即根据代价来进行优化.根据代价进行优化的基础是基于统计信息. 如果统计信息不准确,那么oracle sql查询就没有规则可依,导致查询计划出问题. 1.ORACLE 11G 默认启动了统计信息收集的任务,默认运行时间是周一到周五晚上10点和周6,周天的早上6点. 2.你也可以关闭自动统计新收集任务,选择手工收集的方式,但是一般不建议这样操作. select window_name, window_next_time, autotask_status

SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变

前提  本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段的统计信息做数据行数预估的算法原理,以及SQL Server 2012和SQL Server 2014该算法的差异情况, 这里暂时不涉及复合统计信息,暂不涉及统计信息的更新策略及优化相关话题,以及其他SQL Server版本计算方式. 统计信息是什么 简单说就是对某些字段的数据分布的一种描述,让SQ

通过重新生成执行计划解决绑定变量执行计划偏差导致SQL执行时间过长

基本要素(时间.用户.问题) 用户11g环境下有段SQL语句在程序中执行效率非常差,但是在plsql中执行却很快,通过查看执行计划,发现使用了不同的索引导致,程序中执行的如下: PLSQL中执行的效果如下: 可以看到差别,使用门诊费用记录_IX_登记时间索引是在plsql中的执行计划,使用门诊费用记录_UQ_NO的是程序中的执行计划,两者SQL是完全相同的,唯一却别就是前者使用了绑定变量,后者是直接带参数值执行. 问题分析 问题很明显,由于绑定变量生成的执行计划与实际有偏差,11g本来有个绑定变

第十二章——SQLServer统计信息(1)——创建和更新统计信息

原文:第十二章--SQLServer统计信息(1)--创建和更新统计信息 简介: 查询的统计信息: 目前为止,已经介绍了选择索引.维护索引.如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索引供查询之用,因为SQLServer优化器是基于开销的优化.当在where和on上的列上的数据需要显示在结果集的时候,如果有实时的统计信息,优化器会选择最好的执行方式,因为优化器会从统计信息中获得这些数据的明细情况. 在创建索引的时候,SQLServer就会在索引列上创建统计信息.简单来说,统计信息

数据库参数调优--自动更新统计信息

数据库参数调优--自动更新统计信息 原文: https://blog.csdn.net/z10843087/article/details/78356975 背景 我们都知道SQL SERVER 借助统计信息来产生执行计划,而过时的统计信息会导致SQL SERVER选择错误的执行计划,导致严重的性能问题.  在数据库中选项可以自动的更新统计信息.如下图: 默认他是开启的,所以我们很少去关注他或者修改他. 异步更新和同步更新 其实除了同步更新统计信息外,还有一个异步更新统计信息的选项.他和同步更新

理解统计信息(4/6):自动更新统计信息的阀值——人为更新统计信息的重要性

在理解统计信息(3/6):谁创建和管理统计信息?在性能调优中,统计信息的作用里我们讨论了统计信息的自动创建和自动更新.我们真的需要人为维护统计信息来保持性能最优?答案是肯定的,这取决与你的工作量.SQL Server只在达到阀限值时进行统计信息的自动更新.当大量的Insert/Update/Delete操作发生时,内建的自动更新统计信息不能持续保证性能的最优. 经过一系列的Insert/Update/Delete后,统计信息可能不会是最新.如果SQL Server查询优化器在表里需要指定列的统计

ORACLE索引失效,更新统计信息

有时候建立索引的时候不走索引,排除了字段数据问题和sql写法问题之外,应该是统计信息有问题,得重新收集. 一:解锁统计信息 为了稳定执行计划,一般统计信息都会被锁住的,在更新统计信息的时候得先解锁. ①按用户schema解锁: EXEC DBMS_STATS.UNLOCK_schema_STATS('user_name'); ②按表模式解锁:先查出被锁定的表 select table_name from user_tab_statistics where stattype_locked is n