百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

详解oracle数据库动态采样(附模拟实验)

sinye56 2024-09-19 02:17 4 浏览 0 评论

概述

假设生产环境中Oracle数据库是每天晚上 10 点收集统计信息,当我们早上 9 点新建了一张表,Oracle 该如何知道这个表的记录大小然后去选择收集统计信息呢?这里就涉及到oracle的动态采样概念了。


动态采样

动态采样(Dynamic Sampling)是在ORACLE 9i Release 2中开始引入的一个技术,引入它的目的是为了应对数据库对象没有分析(统计信息缺失)的情况下,优化器生成更好的执行计划。简单的说,在数据库段(表、索引、分区)对象没有分析的情况下,为了使CBO优化器得到足够多的信息以保证优化器做出正确执行计划而发明的一种技术。它会分析一定数量段对象上的数据块获取CBO需要的统计信息。动态采样技术仅仅是统计信息的一种补充,它不能完全替代统计信息分析。

动态采样增加了那些丢失的或者不足的优化器统计信息。使用动态采样可以让优化器更好的选择谓词。动态采样能够补充类似表中block个数,相关的索引block个数,表的集势(ronded个数),相关的连接列的统计信息(提供extendedstatistics的功能)。


Dynamic Sampling Levels

动态采样默认为启动状态,可以设置 OPTIMIZER_DYNAMIC_SAMPLING=0来禁用掉这一特性。

OPTIMIZER_DYNAMIC_SAMPLING也是和动态采样最重要的参数,它控制着动态采样级别。

下面用相关实验来加深下大家对动态采样的理解。


1、新建测试数据

新建一张 T_SAMPLE 表

set autotrace off 
set linesize 200
drop table t_sample purge; 
create table t_sample as select * from dba_objects; 
create index idx_t_sample_objid on t_sample(object_id) ; 
select num_rows, blocks, last_analyzed from user_tables where table_name = 'T_SAMPLE'; 

这里我们可以发现统计信息没有被收集,对应的 NUM_ROWS,BLOCKS 和 LAST_ANALYZED 都是空的。

2、跟踪执行计划

用 set autotrace on 的方式来跟踪 SOL 的执行计划,如下 :

set autotrace traceonly;
select * from t_sample where object_id=20;

注意上面的参数dynamic sampling used for this statement (level=2),这个就是动态采样,当一张表是新建表时, Oracle 只好动态地收集这个表的相关信息。然后等到晚上 10 点,再将其收集到数据字典中。

3、手工收集统计信息

收集统计信息命令如下:

exec dbms_stats.gather_table_stats(ownname => 'SYS', tabname =>'T_SAMPLE', estimate_percent => 10,method_opt=>'for all indexed columns', cascade=>TRUE);

查看相关信息

set autotrace off;
select num_rows, blocks, last_analyzed from user_tables where table_name ='T_SAMPLE';

4、再次跟踪执行计划

用 set autotrace on 的方式来跟踪 SOL 的执行计划,如下 :

set autotrace traceonly;
select * from t_sample where object_id=20;

这里其实就可以发现dynamic sampling关键字不见了,也就是已经做了统计信息收集。


凡事有利必有弊,动态采样也不是神器。它采样的数据块越多,系统开销就越大,这样会增加SQL硬解析的时间,如果是数据库仓库(DW、OLAP)环境,SQL执行时间相当长,硬解析时间只占整个SQL执行时间的一小部分,那么可以适当的提高动态采样级别,这样是有利于优化器获取更加正确的信息。一般设置为3或4比较合适。

但是在并发比较严重的OLTP系统中,每秒中有成千上万的SQL语句执行,它要求SQL语句短小、执行时间短,所以在OLTP系统中应该减低动态采样级别或不用动态采样。

后面会分享更多DBA方面内容,感兴趣的朋友可以关注下!!

相关推荐

Linux在线安装JDK1.8

首先在服务器pingwww.baidu.com查看是否可以连网然后就可以在线下载一、下载安装JDK1.81、在下载安装的同时做好一些准备工作...

Linux安装JDK,超详细

1、了解RPMRPM是Red-HatPackageManager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux...

Linux安装jdk1.8(超级详细)

前言最近刚购买了一台阿里云的服务器准备要搭建一个网站,正好将网站的一个完整搭建过程分享给大家!#一、下载jdk1.8首先我们需要去下载linux版本的jdk1.8安装包,我们有两种方式去下载安装...

Linux系统安装JDK教程

下载jdk-8u151-linux-x64.tar.gz下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht...

干货|JDK下载安装与环境变量配置图文教程「超详细」

1.JDK介绍1.1什么是JDK?SUN公司提供了一套Java开发环境,简称JDK(JavaDevelopmentKit),它是整个Java的核心,其中包括Java编译器、Java运行工具、Jav...

Linux下安装jdk1.8

一、安装环境操作系统:CentOSLinuxrelease7.6.1810(Core)JDK版本:1.8二、安装步骤1.下载安装包...

Linux上安装JDK

以CentOS为例。检查是否已安装过jdk。yumlist--installed|grepjdk或者...

Linux系统的一些常用目录以及介绍

根目录(/):“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。在很多系统中,“/”目录是系统中的唯一分区。如果还有其他分区,必须挂载到“/”目录下某个位置。整个目录结构呈树形结构,因此也...

Linux系统目录结构

一、系统目录结构几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树...

Linux文件查找

在Linux下通常find不很常用的,因为速度慢(find是直接查找硬盘),通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。为什么...

嵌入式linux基本操作之查找文件

对于很多初学者来说都习惯用windows操作系统,对于这个系统来说查找一个文件简直不在话下。而学习嵌入式开发行业之后,发现所用到的是嵌入式Linux操作系统,本想着跟windows类似,结果在操作的时...

linux系统查看软件安装目录的方法

linux系统下怎么查看软件安装的目录?方法1:whereis软件名以查询nginx为例子...

Linux下如何对目录中的文件进行统计

统计目录中的文件数量...

Linux常见文件目录管理命令

touch用于创建空白文件touch文件名称mkdir用于创建空白目录还可以通过参数-p创建递归的目录...

Linux常用查找文件方法总结

一、前言Linux系统提供了多种查找文件的命令,而且每种查找命令都具有其独特的优势,下面详细总结一下常用的几个Linux查找命令。二、which命令查找类型:二进制文件;...

取消回复欢迎 发表评论: