Oracle 数据库全表扫描的4种优化方法(DB)

全表扫描的工作是扫描高水位一下所有的数据块。
这里就有一个问题,什么是高水位线。高水位的标志存在表头。
该数据块以后都是崭新未格式化的数据块,高水位的目的有二。它是全表扫描的
终点,并行插入的起点!
优化全表扫描的办法有四,核心就是降低高水位!
一、降低高水位;二、紧密码放数据;三、并行查询;四、修改初始化参数
降低高水位的办法有三:
    一、在线回收空间;二、挪动表空间;三、导出和导入。
紧密码放数据办法有二:
    一、调整pctfree;二、使用压缩特性。

实验如下:
建立大表,50万左右,分析表,列select * from t1;的计划,看代价!
SQL> conn scott/tiger
Connected.
SQL> drop table t1 purge;

Table dropped.

SQL> create table t1 as select * from emp where 0=9;

Table created.

SQL> insert into t1 select * from emp;

已创建14行。

SQL> insert into t1 select * from t1;

已创建14行。

SQL> /

--一直斜杠,直到

已创建229376行。

SQL> commit;
现在我们就有了45万行左右的大表!
分析表,获得统计信息!
analyze table T1 compute statistics; 

Table analyzed.

SQL> set autot trace expl
SQL> select * from t1;

执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   458K|    14M|   544  (10)| 00:00:07 |
|   1 |  TABLE ACCESS FULL| T1   |   458K|    14M|   544  (10)| 00:00:07 |
--------------------------------------------------------------------------
我们看到代价为544,我们围绕544进行优化,降低代价!

set autot off
delete t1 where deptno=30;
commit;
analyze table T1 compute statistics; 
select * from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   262K|  8192K|   526   (7)| 00:00:07 |
|   1 |  TABLE ACCESS FULL| T1   |   262K|  8192K|   526   (7)| 00:00:07 |
--------------------------------------------------------------------------
我们看到代价为526,比原来小一点,因为cost是根据块,内存,cpu,网络综合计算的。
行少了一半,但代价没有少多少!因为这里高水位没有变化!

一、在线回收空间;
alter table t1 enable row  movement;
alter table t1 shrink space;
analyze table T1 compute statistics; 
SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE from tabs where table_name='T1';
NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE
-------- ---------- ------------ ----------
  262144       1376           32         21
占用了1376个数据块。

select * from t1;

执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   262K|  8192K|   275  (11)| 00:00:04 |
|   1 |  TABLE ACCESS FULL| T1   |   262K|  8192K|   275  (11)| 00:00:04 |
--------------------------------------------------------------------------
我们看到代价为275,比原来小了接近一半。

二、挪动表空间;
SQL> alter table t1 move tablespace users;
这句话也可以重新码放数据。
SQL> analyze table T1 compute statistics; 

表已分析。

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE from tabs where table_name='T1';

  NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE
---------- ---------- ------------ ----------
    262144       1568           96        826
占用了1568个数据块,比原来多了192个数据块,这是因为高水位不是一个一个块的挪动,
而是一组一组的挪动。

select * from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   262K|  8192K|   310  (10)| 00:00:04 |
|   1 |  TABLE ACCESS FULL| T1   |   262K|  8192K|   310  (10)| 00:00:04 |
--------------------------------------------------------------------------
代价为310,比原来的275大,因为浪费了一些块,这些块存在于高水位下,但没有数据。
但数据库全表扫描的时候还是查看了空块,浪费了!

三、调整pctfree
SQL> alter table t1 pctfree 0;
Table altered.
这句话的目的是使每个数据块更加紧密的码放数据,没有update,或者update行长不变的表,
pctfree应该设置为0.

SQL> alter table t1 move tablespace users;


analyze table T1 compute statistics; 
select * from t1;

执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   262K|  8192K|   281  (10)| 00:00:04 |
|   1 |  TABLE ACCESS FULL| T1   |   262K|  8192K|   281  (10)| 00:00:04 |
--------------------------------------------------------------------------
代价为281,比310笑了10%,因为pctfree默认为10。

四、使用压缩存储的新特性
alter table t1 compress;
alter table t1 move tablespace users;
analyze table T1 compute statistics; 
select * from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   262K|  8192K|    97  (27)| 00:00:02 |
|   1 |  TABLE ACCESS FULL| T1   |   262K|  8192K|    97  (27)| 00:00:02 |
--------------------------------------------------------------------------
代价为97,因为压缩了,数据在同一个数据块内复用了,减少了存储空间。
但带来的负面影响是当我们update的时候,表会暴涨,比不压缩还大,而且普通的
插入不能压缩,只有在直接加载的时候,才会有压缩的特性,参考网站内的压缩表文章。

五、使用并行查询来提高全表扫描的性能。
SQL> select /*+ full(t1) parallel(t1 16) */ * from t1;

执行计划
----------------------------------------------------------
Plan hash value: 2494645258

-----------------------------------------------------------------------------------


| Id  | Operation      | Name     | Rows  | Bytes | Cost (%CPU)| Time  |  TQ  |IN-OUT| PQ Distrib |

--------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |   |   262K| 8192K  |  7  (29)| 00:00:01 |        |      |         |
|   1 |  PX COORDINATOR      |       |    |       |       |     |      |      |         |
|   2 |   PX SEND QC (RANDOM)|:TQ10000 |262K|8192K| 7  (29)| 00:00:01 |  Q1,00 | P->S | QC (RAND) |
|   3 |    PX BLOCK ITERATOR |   |   262K|  8192K |   7  (29)| 00:00:01 |  Q1,00 | PCWC |         |
|   4 |     TABLE ACCESS FULL| T1  |  262K|  8192K|  7  (29)| 00:00:01 |  Q1,00 | PCWP |        |

-----------------------------------------------------------------------------------------------
代价为7,比原来的544小了近百倍。效果明显。

六、修改db_file_multiblock_read_count参数,使每次的i/o尽量多读数据块,也会提高全表扫描性能。

SQL> conn / as sysdba
已连接。
SQL> alter system set db_file_multiblock_read_count=1;

系统已更改。

SQL> startup force
重新启动数据库

SQL> conn scott/tiger
已连接。
SQL> set autot trace expl
SQL> select * from t1;

执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   262K|  8192K|   419   (7)| 00:00:06 |
|   1 |  TABLE ACCESS FULL| T1   |   262K|  8192K|   419   (7)| 00:00:06 |
--------------------------------------------------------------------------
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/813387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类和对象(拷贝构造函数)

目录 拷贝构造函数 特征 结论: 拷贝构造函数 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。 特征 拷贝构造函数也是特殊的成员函数&…

AD7685BRMZRL7 16位 2.3V 低功耗模数转换器芯片 ADI

AD7685BRMZRL7是一款由ADI(亚德诺)公司生产的模数转换器(ADC)芯片。该芯片的主要功能是将模拟信号转换为数字信号,以便在数字系统中处理. AD7685BRMZRL7 规格信息: 制造商:Analog Devices Inc. 产品种类:模…

【SpringBoot】获取参数

获取参数 传递单个参数传递多个参数传递对象后端参数重命名传递数组传递 json 数据获取 URL 中参数上传文件获取 cookie 和 session获取cookie获取session 传递单个参数 RequestMapping("/user") RestController public class UserController {// 传递单个参数Reque…

实现自动打包py及替换pyinstaller --add-data参数的方法

2024年了,PyInstaller已经来到了6.5.0版本,可我还是不会用它那个--add-data的方法,度了几圈试了试,始终不(行)如(不)意(通),就是没能把附加文件&a…

红色文化展馆3D线上互动展览推动党建创新发展

实现现代化是世界各国人民的共同追求。在追求现代化的艰苦卓绝奋斗中,我们党领导人民不仅创造了世所罕见的经济快速发展和社会长期稳定两大奇迹,而且成功走出了中国式现代化道路,创造了人类文明新形态。对党建学习也应该与时俱进,…

c语言多功能计算软件170

定制魏:QTWZPW,获取更多源码等 目录 题目 要求 主要代码片段 题目 设计一个计算器软件,具备如下功能提示界面。 要求 设计出界面,注意界面名称最后为自己的姓名;(20分)能够实现加、减、乘、…

Linux之bpfjit(2)使用分析和mini-tcpdump实现

Linux之bpfjit(2)使用分析和mini-tcpdump实现 Author: Once Day Date: 2024年4月13日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可以参考专栏:…

QT windeployqt打包出现无法正常启动问题

QT 通过windeployqt 打包后出现的问题 原因QT构建选择的是64位的 但是windows下运行的却是32位的 步骤打开32的所在路径 一般在上一级目录会有安装好的64位的MSVC工具 运行打包即可

《乱弹篇(27)回乡祭扫感慨多》

人老了,真的就要记住“好汉不提当年勇,梅花不提前世绣”这话。 忆往昔,中青年时代的笔者精力旺盛,也曾只身一人闯荡江湖,把自己的足迹印到过大半个中国土地上,可如今岁近耄耋残年,清明节想回一…

Python | Leetcode Python题解之第19题删除链表的倒数第N个结点

题目: 题解: class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:dummy ListNode(0, head)first headsecond dummyfor i in range(n):first first.nextwhile first:first first.nextsecond second.nextsecond.ne…

gemini1.5 API调用

https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…

聊一下HashMap的底层原理

HashMap作为我们熟悉的一种集合,今天就来聊一下它的原理、数据结构。 1.HashMap的数据结构 JDK1.7的数据结构是数组链表,JDK1.7还有人在用?不会吧…… 说一下JDK1.8的数据结构吧: JDK1.8的数据结构是数组链表红黑树。 数据结…

Vue pdfjs

最终效果图 官网 https://mozilla.github.io/pdf.js 下载 放入项目 vue页面嵌入本地下载好的html sessionStorage.setItem(sdfDldj8KJ45SDF, encodeURIComponent(file_url)) <template><div style"height:100%"><iframe:id"1":key"…

阿里云服务器租用费用,这价格可以呀!

2024阿里云服务器租用优惠价格4月最新报价&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器108元一年、香港30M带宽轻量服务器24元1个月、云服务器4核16G10M带宽30元1个月、90元3个月&#xff0c;云…

【数据分享】中国首套1米分辨率土地覆盖数据(2023年发布)

土地覆盖数据是我们在各项研究中都非常常用的数据&#xff01;本次我们整理的是全国各城市的1米分辨率的土地覆盖数据&#xff01; 武汉大学李卓鸿、何伟等研究者基于深度学习框架和开放数据&#xff0c;具体包括全球土地覆盖&#xff08;GLC&#xff09;数据、OSM地图数据、谷…

每日两题 / 3. 无重复字符的最长子串 84. 柱状图中最大的矩形(LeetCode热题100)

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 双指针&#xff0c;l和r从字符串最左边开始&#xff0c;保存l和r之间的所有字符 移动r&#xff0c;若新加入的字符和已有字符重复&#xff0c;则不断移动l&#xff0c;直到l和r之间不出现重复字符 注意&#…

【机器学习】深入剖析贝叶斯算法原理及其广泛应用

一、引言 在机器学习的广阔领域中&#xff0c;贝叶斯算法以其独特的概率推理方式占据了重要的地位。它不仅为分类问题提供了有效的解决方案&#xff0c;还在自然语言处理、信息检索、垃圾邮件过滤等诸多领域发挥着不可替代的作用。 贝叶斯算法的基本思想源于贝叶斯定理&#xf…

数据结构学习之路--实现带头双向循环链表的详解(附C源码)

嗨嗨大家~本期带来的内容是&#xff1a;带头双向循环链表的实现。在上期文章中我们提到过带头双向循环链表&#xff0c;那么它的实现又是怎样的呢&#xff1f;今天我们来一探究竟&#xff01; 目录 前言 一、认识带头双向循环链表 1 认识双向链表 2 带头双向循环链表的定…

Oracle获取对象的DDL创建语句

1.命令行方式&#xff08;如&#xff1a;sqlplus&#xff09; ## 用户 select dbms_metadata.get_ddl(USER,TEST) from dual;## 表 select dbms_metadata.get_ddl(TABLE,TEST,T1) from dual;## 表空间 select dbms_metadata.get_ddl(TABLESPACE,TBS_NAME) from dual;## 索引 s…

【教学类-50-06】20240410“数一数”4类星号图片制作PDF学具

作品展示&#xff1a; 背景需求&#xff1a; 前文遍历四个文件夹&#xff0c;分别将每个文件夹内的10个图片的左上角加入星号&#xff0c;显示难度系数 【教学类-50-05】20240410“数一数”4类图片添加“难度星号”-CSDN博客文章浏览阅读55次&#xff0c;点赞2次&#xff0c;…