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 |
--------------------------------------------------------------------------
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1688官方API商品数据采集接口|阿里巴巴中国站获得1688商品详情 API 返回值说明

随着全球经济一体化和电子商务的快速发展,网络购物的需求日益增加。不断涌现的电商企业使得行业的竞争情况愈演愈烈。在这种情况下,企业不仅要加大经营力度,还要在自己的基础设施和技术上持续投入,才能更好的适应市场和消费习惯。…

李沐-19 卷积层【动手学深度学习v2】

记录下关于权重下标变换的理解: 从原来的Wi,j到Wi,j,k,l是从二维到四维的过程,如下图所示 对全连接层使用平移不变性(如:卷积核在移动过程是不变的)和局部性(如:卷积核有一定大小)得到卷积层,这…

JetBrains2024来袭

JetBrains2024来袭,激活包含在内的编程IDE,其中AppCode已下架,Aqua,RustRover不支持本地激活需要关联帐号。 Tap:激活稳定可靠,支持Windows,macOS,Linux客户端。

Linux知识

基础 Linux系统的组成 Linux内核、Linux⽂件系统、Linux shell、Linux应⽤程序。 Linux的开机启动过程 u-boot是⼀款常⽤的开源Bootloader,它的启动顺序如下: CPU上电后,⾸先执⾏boot ROM(引导ROM)代码。boot ROM…

历史上9个不可思议的巧合

历史是神奇的,在历史上,有些明明没道理的事情,却偏偏就这样发生了,明明不相关的事情,也偏偏就有那么一个巧合对应了。 1、国际通用的公元元年正好对应着西汉刘衎的元始元年。而这个年号正是王莽所定,而王莽…

软考130-上午题-【软件工程】-系统维护

一、系统维护概述 软件维护是软件生命周期中的最后一个阶段,处于系统投入生产性运行以后的时期中,因此不属于系统开发过程。 软件维护是在软件已经交付使用之后为了改正错误或满足新的需求而修改软件的过程,即软件在交付使用后对软件所做的一…

Python | Leetcode Python题解之第25题K个一组翻转链表

题目: 题解: class Solution:# 翻转一个子链表,并且返回新的头与尾def reverse(self, head: ListNode, tail: ListNode):prev tail.nextp headwhile prev ! tail:nex p.nextp.next prevprev pp nexreturn tail, headdef reverseKGroup…

JQuery(四)---【使用JQuery实现动画效果】

目录 前言 一.隐藏和显示 1.1使用方法 1.2案例演示(1) 1.3隐藏/显示效果一键切换 二.淡入淡出效果 2.1使用方法 2.2案例演示(fadeIn) 2.3案例演示(fadeOut) 2.4案例演示(fadeToggle) 2.5案例演示(fadeTo) 三.滑动 3.1使用方法 3.2案例演示(slideDown) 3.3案例演示…

SpringBoot中使用Jackson序列化返回

SpringBoot中使用Jackson序列化返回 在Spring Boot应用中,使用Jackson库来处理JSON的序列化和反序列化是一种常见的做法。Jackson是一个高效的JSON处理器,广泛用于Java环境中,尤其是在与Spring框架集成时。本文将详细介绍如何在Spring Boot中…

预付费电表管理系统

预付费电表管理系统是一种现代化的电力管理系统,它将信息化技术和电力系统紧密结合,旨在提供更加高效、便捷的电力使用与管理方式。该系统能够有效地解决传统计费方法中存在的延迟计费、欠费风险等问题,通过预付费的方式,既保证了…

【动态规划】【01背包 尽量装满背包】Leetcode 1049. 最后一块石头的重量 II

【动态规划】【01背包 尽量装满背包】Leetcode 1049. 最后一块石头的重量 II 解法 ---------------🎈🎈题目链接🎈🎈------------------- 解法 😒: 我的代码实现> 动规五部曲 ✒️确定dp数组以及下标的含义 d…

[数据结构]——二叉树链式结构的实现

目录 1. 前置说明 2. 二叉树的遍历 1. 前序、中序以及后序遍历 1.前序遍历递归 1.图解:​编辑 2.代码 2.中序遍历递归 3.后序遍历递归 3. 节点个数以及高度等 1.二叉树节点个数 2.叶子节点个数 3.树的高度 4.K层节点个数 5.二叉树查找值为x的节点是否存在…

【考研数学】跟张宇,刷《660》正确率惨不忍睹,怎么办?

接下来要先改错 50%的正确率 ,说明一半的题目都有一些问题导致了结果错误。 做题不是检查完结果,得到一个正确率就完事了。 核心是把错题的原因找到,计算出问题?有思路把公式忘了?或是根本没解题思路?还…

《深入Linux内核架构》第3章 内存管理(1)

目录 3.1 概述 3.2 NUMA模型的内存组织 3.2.1 概述 3.2.2 三个数据结构 3.2.2.1 node 3.2.2.2 zone 3.2.2.3 page 本专栏文章将有70篇左右,欢迎关注,订阅后续文章。 本章讲物理内存的管理,而不是虚拟内存地址空间。 3.1 概述 页帧&a…

DC/DC电源模块直流升压变换器电压控制输出5V12V24V转0-50V80V110V150V180V200V250V300V500V800V1000V

特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~75℃阻燃封装,满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压线性变化 应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、…

记录Python的pandas库详解

如何生成一个pd import pandas as pd df pd.DataFrame([[1,2,3],[4,5,6]],index[A,B],columns[C1,C2,C3])df ---------------------------------------------------------------------------C1 C2 C3 A 1 2 3 B 4 5 6df.T -------------------------------------------------…

字节8年经验之谈 —— 接口测试框架接入性能测试实践分享!

1. 前言 现如今接口测试在软件质量行业中的地位,已经越来越重要,相对于上层的UI自动化测试和下层的单元测试,接口测试的“低”投入、“高”回报,也成了绝大多数质量保障实践的首选。 在开展接口测试时,往往很多时候都…

python使用redis存储时序数据

import redisdef ts_demo():"""时序数据存储RedisTimeSeries测试"""# 连接到Redisr redis.Redis(hostlocalhost, password"xxxx", port63790, db0)r1 r.ts()# print(r1.get("ts_key"))# print(r.exists(ts_key))# # 清空键…

PyQt5 快速入门

PyQt5 简介和开发环境搭建 简介 PyQt是一个GUI小部件工具包。 它是Qt的Python接口, Qt是最强大,最受欢迎的跨平台GUI库之一。 PyQt由RiverBank Computing Ltd.开发。最新版本的PyQt可从其官方网站下载 - riverbankcomputing.com PyQt API是一组包含大…

【leetcode】双指针算法技巧——滑动窗口

标题:【leetcode】双指针算法技巧——滑动窗口 水墨不写bug 正文开始: 滑动窗口介绍 滑动窗口是一种常用的算法技巧,用于解决一些涉及 连续子数组或子串 的问题。它的基本思想是 维护一个窗口,通过 在窗口内移动 来寻找满…