PostGreSQL/openGauss表膨胀处理
如果面试官问你,Oracle与PG/OG最大的区别是什么?你要是没回答出MVCC机制,表膨胀,那你多半挂了。
在PG/OG数据库中,命令vacuum full,插件pg_repack用于处理表膨胀,但是别高兴得太早,如果有长事务,vacuum full执行完之后空间还是无法回收。
pg_repack需要等执行pg_repack命令时之前的长事务都提交了才能往后执行,你愿意等吗?很明显不愿意。
下面我们来模拟一下有长事务情况下vacuum full无法回收空间的问题
现在有张表test01,表结构来自Oracle11g DBA_OBJECTS,反复插入了44537344行数据,占用磁盘空间6115 MB
openGauss=# \d+List of relationsSchema | Name | Type | Owner | Size | Storage | Description
--------+--------+-------+-----------+---------+----------------------------------+-------------public | test01 | table | opengauss | 6115 MB | {orientation=row,compression=no} | public | test02 | table | opengauss | 12 MB | {orientation=row,compression=no} |
(2 rows)
创建2个测试表t_idletransaction,t_astore
openGauss=# create table t_idletransaction with(storage_type=astore) as select * from test01 where rownum<=1000;
INSERT 0 1000
openGauss=# create table t_astore with(storage_type=astore) as select * from test01 where 1=0;
INSERT 0 0
openGauss=# insert into t_astore select * from test01 where rownum<=1000000;
INSERT 0 1000000
记录表大小
openGauss=# \d+List of relationsSchema | Name | Type | Owner | Size | Storage | Description
--------+-------------------+-------+-----------+---------+------------------------------------------------------+-------------public | t_astore | table | opengauss | 137 MB | {orientation=row,storage_type=astore,compression=no} | public | t_idletransaction | table | opengauss | 176 kB | {orientation=row,storage_type=astore,compression=no} | public | test01 | table | opengauss | 6115 MB | {orientation=row,compression=no} | public | test02 | table | opengauss | 12 MB | {orientation=row,compression=no} |
(4 rows)
session1 开启长事务
openGauss=# begin;
BEGIN
openGauss=# update t_idletransaction set object_id=0;
UPDATE 1000
session2 反复对表进行批量DML操作
penGauss=# \timing
Timing is on.
openGauss=# declare
openGauss-# v_date date;
openGauss-# begin
openGauss$# for i in 1..10 loop
openGauss$# select sysdate into v_date;
openGauss$# update t_astore set owner='B' where object_id>2;
openGauss$# commit;
openGauss$# delete from t_astore where object_id>2;
openGauss$# commit;
openGauss$# insert into t_astore select * from test01 where object_id>2 and rownum<=999988;
openGauss$# commit;
openGauss$# raise info 'i=%,current_date=%',i,v_date;
openGauss$# end loop;
openGauss$# end;
openGauss$# /
INFO: i=1,current_date=2025-04-07 15:33:43
INFO: i=2,current_date=2025-04-07 15:33:48
INFO: i=3,current_date=2025-04-07 15:33:56
INFO: i=4,current_date=2025-04-07 15:34:04
INFO: i=5,current_date=2025-04-07 15:34:14
INFO: i=6,current_date=2025-04-07 15:34:26
INFO: i=7,current_date=2025-04-07 15:34:39
INFO: i=8,current_date=2025-04-07 15:34:52
INFO: i=9,current_date=2025-04-07 15:35:07
INFO: i=10,current_date=2025-04-07 15:35:23
ANONYMOUS BLOCK EXECUTE
Time: 117272.747 ms
查看表大小
openGauss=# \d+List of relationsSchema | Name | Type | Owner | Size | Storage | Description
--------+-------------------+-------+-----------+---------+------------------------------------------------------+-------------public | t_astore | table | opengauss | 2844 MB | {orientation=row,storage_type=astore,compression=no} | public | t_idletransaction | table | opengauss | 312 kB | {orientation=row,storage_type=astore,compression=no} | public | test01 | table | opengauss | 6115 MB | {orientation=row,compression=no} | public | test02 | table | opengauss | 12 MB | {orientation=row,compression=no} |
(4 rows)
t_astore从137MB膨胀到2844MB,膨胀了20倍,执行vacuum full回收空间
openGauss=# vacuum full t_astore;
VACUUM
Time: 41075.170 ms
openGauss=# \d+List of relationsSchema | Name | Type | Owner | Size | Storage | Description
--------+-------------------+-------+-----------+---------+------------------------------------------------------+-------------public | t_astore | table | opengauss | 2847 MB | {orientation=row,storage_type=astore,compression=no} | public | t_idletransaction | table | opengauss | 312 kB | {orientation=row,storage_type=astore,compression=no} | public | test01 | table | opengauss | 6115 MB | {orientation=row,compression=no} | public | test02 | table | opengauss | 12 MB | {orientation=row,compression=no} |
(4 rows)
t_astore从2844MB变到了2847MB,这说明在有长事务情况下,vacuum full不能回收空间
不得不说PG/OG的vacuum full做得很挫,我这里长事务的表是t_idletransaction,vacuum full的表是t_astore,两个表都没啥关系,还不让回收空间
内核只考虑怎么实现方便,不考虑怎么使用方便,嘿嘿
既然vacuum full无法回收,那就手工回收空间吧
1.检查表上有没有锁,如果有,不执行后面操作
2.开启事务
3.先锁住原表
4.创建一个备份表
5.truncate原表
6.把备份数据插入到原表
7.drop备份表
8.提交
openGauss=# begin;
BEGIN
Time: 0.222 ms
openGauss=# lock table t_astore;
LOCK TABLE
Time: 1002.649 ms
openGauss=# create table t_astore_bak as select * from t_astore;
INSERT 0 999999
Time: 5381.672 ms
openGauss=# truncate table t_astore;
TRUNCATE TABLE
Time: 2.081 ms
openGauss=# insert into t_astore select * from t_astore_bak;
INSERT 0 999999
Time: 628.223 ms
openGauss=# drop table t_astore_bak;
DROP TABLE
Time: 1.363 ms
openGauss=# commit;
COMMIT
Time: 235.081 msopenGauss=# \d+List of relationsSchema | Name | Type | Owner | Size | Storage | Description
--------+-------------------+-------+-----------+---------+------------------------------------------------------+-------------public | t_astore | table | opengauss | 137 MB | {orientation=row,storage_type=astore,compression=no} | public | t_idletransaction | table | opengauss | 312 kB | {orientation=row,storage_type=astore,compression=no} | public | test01 | table | opengauss | 6115 MB | {orientation=row,compression=no} | public | test02 | table | opengauss | 12 MB | {orientation=row,compression=no} |
(4 rows)
可以看到t_astore空间已经回收,表从2847MB缩小到137MB
为什么要先锁住原表呢?是因为如果能锁住原表,说明表当前没有被select,也没有在事务中,对表人工进行空间回收是安全的
在openGauss中,select没执行完,另外的会话无法lock表
session1
select count(*) from test01 a,test01 b; ---4.4kw与4.4kw笛卡尔积,跑不出结果
session2
begin;
lock table test01; ---阻塞
在openGauss中,表在事务中,另外的会话无法lock表
session1
begin;
select * from test01 where object_id=1000;
session2
begin;
lock table test01; ---阻塞
通过上面2个实验,证明了手工回收空间操作是安全的
有的读者可能会问,你为什么要折腾出人工回收空间的方法呢?
那是因为之前在一个制造业客户中遇到了表膨胀问题,客户每个月月初要做月结,每次月结都会卡死2小时,客户一直在抱怨
后面定位到是索引膨胀,索引上死元组有3到4000W行,索引是十几个字段组成的联合主键,由于死元组有几千万行,批量INSERT到
该表,每插入一行数据就要进行唯一性检查,死元组太多了,外加上联合主键的原因导致唯一性检查特别慢,就这一步卡死2小时,正常情况下几十秒跑完
由于vacuum full回收不了空间,pg_repack也回收不了,所以被逼折腾出人工回收空间的方法
最后搞个了crontab,每隔一段时间检查n_dead_tup,当n_dead_tup大于某个阈值,检查表上有没有锁,没有锁就人工回收空间,自此之后,每次月结跑批就很稳定了
我做实验的表比较小,如果表特别大,几十GB,上百GB就不好处理了,所以大表最好分区,分区之后可以按照分区单独处理表膨胀
限于篇幅,就不讨论ustore了,下一篇讨论openGauss/GaussDB ustore
注意:人工处理表膨胀相当于把表上面的历史版本数据丢了,如果你有基于快照做备份恢复的需求,自己做个实验测试一把上面操作对你是否有影响
相关文章:
PostGreSQL/openGauss表膨胀处理
如果面试官问你,Oracle与PG/OG最大的区别是什么?你要是没回答出MVCC机制,表膨胀,那你多半挂了。 在PG/OG数据库中,命令vacuum full,插件pg_repack用于处理表膨胀,但是别高兴得太早,如…...
视频融合平台EasyCVR搭建智慧粮仓系统:为粮仓管理赋能新优势
一、项目背景 当前粮仓管理大多仍处于原始人力监管或初步信息化监管阶段。部分地区虽采用了简单的传感监测设备,仍需大量人力的配合,这不仅难以全面监控粮仓复杂的环境,还容易出现管理 “盲区”,无法实现精细化的管理。而一套先进…...
基于 Node.js 和 Spring Boot 的 RSA 加密登录实践
在当今的互联网应用开发中,用户数据的安全性至关重要。登录功能作为用户进入系统的第一道防线,其安全性更是不容忽视。本文将介绍一种基于 RSA 加密的登录方案,前端使用 Node.js 的 node-forge 库对密码进行公钥加密,后端使用 Spr…...
jupyter在Pycharm中遇到的一个问题
jupyter比较简洁,可以分块执行,下面显示结果,还能用Markdown写注释,总体来说来还是比较好用的。 但是遇到了一个奇怪的问题,从一个py文件中导入一个函数,结果输出为None。但是如果直接把这个函数的内容复制…...
十二、buildroot系统 adb登录权限设置
4.6.4、adb权限设置 android-adbd 是 ADB(Android Debug Bridge)的守护进程,允许开发者远程访问和调试设备。它通常用于 Android 设备,但在嵌入式 Linux上,也可以用来提供远程 shell、文件传输和应用调试功能。 …...
MySQL、Oracle 和 PostgreSQL 是三种主流的关系型数据库的主要原理性差异分析
MySQL、Oracle 和 PostgreSQL 是三种主流的关系型数据库,它们在底层原理和设计哲学上存在显著差异,尤其在存储引擎、事务处理、并发控制、索引结构、复制机制等方面。以下是它们的主要原理性差异分析: 1. 存储引擎与架构设计 MySQL 多存储引…...
【AI开源大模型工具链ModelEngine】【01】应用框架-源码编译运行
ModelEngine提供从数据处理、知识生成,到模型微调和部署,以及RAG(Retrieval Augmented Generation)应用开发的AI训推全流程工具链。 GitCode开源地址:https://gitcode.com/ModelEngineGitee开源地址:https…...
一文掌握 google浏览器插件爬虫 的制作
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、技术栈1. 前端技术(浏览器插件开发)2. 爬虫技术3. 后端(可选)4. 整体技术栈组成二、开发步骤1. 创建 Chrome 插件基础结构(1)`manifest.json` 配置(2)前端页面(`popup.html`)(3)前端逻辑(`popup.js`)…...
【leetcode 100】贪心Java版本
划分字母区间 题目 我的思路:第一次没有一点思路,第二次看了官网思路后,写的以下答案,没有搞明白循环遍历, //是不对的以下: class Solution {public List<Integer> partitionLabels(String s) {Li…...
Linux用Wireshark进行Thread网络抓包关键步骤
用Nordic nRF52840 Dongle作为RCP配合Wireshark进行Thread网络抓包是debug Thread网络的有效工具之一,主要流程在这里,不再赘述:官方流程 但是按官方流程会卡在一个地方,第一次费劲解决后,今天在另一台机器重新配的时…...
项目管理中客户拒绝签字验收?如何处理和预防
客户拒绝签字验收?如何处理和预防?核心在于:正面沟通、证据留存、灵活应对、合同条款明确、阶段验收机制。其中正面沟通格外关键,如果在发现客户迟迟不愿签字时能够主动沟通,了解其顾虑或不满并迅速针对性解决…...
docker 修改镜像源教程
当在拉取镜像时报以下错误时,可以通过更换镜像源解决 rootlocalhost:/etc/docker# docker pull mysql Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for …...
【JAVA】十、基础知识“类和对象”干货分享~(三)
目录 1. 封装 1.1 封装的概念 1.2 访问限定符 public(公开访问) private(私有访问) 1.3 包 1.3.1 包的概念 1.3.2 导入包中的类 1.3.3 自定义包 2. static成员 2.1 static变量(类变量) 2.1.1 sta…...
Open GL ES -> SurfaceView + 自定义EGL实现OpenGL渲染框架
SurfaceView 自定义EGL实现OpenGL渲染 在Android开发中,当需要灵活控制OpenGL渲染或在多个Surface间共享EGL上下文时,自定义EGL环境是必要的选择 核心实现流程 -------------------- -------------------- -------------------- | 1. 创建Su…...
Solidity入门实战—web3
项目介绍 在这个项目中,我们建立一个小型智能合约应用,他允许用户向合约地址捐赠,允许合约所有者从合约中提取余额;并且还设定了捐赠的金额门槛;针对直接对地址进行的捐赠行为,我们也予以记录 源代码 ht…...
Open Scene Graph动画系统
OSG 提供了强大的动画功能,支持多种动画实现方式,从简单的变换动画到复杂的骨骼动画。以下是 OSG 动画系统的全面介绍: 1. 基本动画类型 1.1 变换动画 (Transform Animation) // 创建动画路径 osg::AnimationPath* createAnimationPath(co…...
无需libpacp库,BPF指令高效捕获指定数据包
【环境】无libpacp库的Linux服务器 【要求】高效率读取数据包,并过滤指定端口和ip 目前遇到两个问题 一是手写BPF,难以兼容,有些无法正常过滤二是性能消耗问题,尽可能控制到1% 大方向:过滤数据包要在内核层处理&…...
重回全面发展亲自操刀
项目场景: 今年工作变动,优化后在一家做国有项目的私人公司安顿下来了。公司环境不如以前,但是好在瑞欣依然可以每天方便的买到。人文氛围挺好,就是工时感觉有点紧,可能长期从事产品迭代开发,一下子转变做项…...
DimensionX
旨在通过可控的视频扩散模型从单张图像生成高质量的3D和4D场景。 1. 背景与问题 3D和4D生成的目标 3D生成:从单张或多张2D图像中重建出三维场景或物体,包含空间信息(长、宽、高)。4D生成:在3D的基础上加入时间维度&a…...
2025年04月08日Github流行趋势
项目名称:markitdown 项目地址url:https://github.com/microsoft/markitdown项目语言:Python历史star数:44895今日star数:1039项目维护者:afourney, gagb, sugatoray, PetrAPConsulting, l-lumin项目简介&a…...
数据结构与算法-数学-容斥原理,高斯消元解线性方程组
容斥原理 容斥原理用于计算多个集合的并集元素个数,公式为 ∣A1∪A2∪⋯∪An∣∑i1n∣Ai∣−∑1≤i<j≤n∣Ai∩Aj∣∑1≤i<j<k≤n∣Ai∩Aj∩Ak∣−⋯(−1)n−1∣A1∩A2∩⋯∩An∣ 举一个例题: 给定一个整数 nn 和 mm 个不同的质数 p1,p2,…,p…...
告别运动控制不同步:某车企用异构PLC实现99.98%焊接合格率
在长三角某新能源汽车电池工厂,工程师们正面临棘手的生产难题:随着产线速度提升到每分钟12个电芯,原有PLC系统开始频繁出现运动控制不同步现象。这直接导致极片焊接合格率从99.2%骤降至94.7%,每条产线日均损失超23万元。这个场景折…...
BetaFlight参数配置解读
BetaFlight参数配置解读 📌相关篇《Betaflight固件编译和烧录说明》🥕各型号已编译好的配置文件资源(.config):https://github.com/betaflight/unified-targets/tree/master/configs/default🌿各型号配置头…...
PowerBI累计分析
累计分析 累计分析主要有三种:年初至今(YTD)、季初至今(QTD)、月初至今(MTD)。DAX中计算累计的函数有两类:一类是datesytd、datesqtd、datesmtd,该类返回一个单列日期表…...
最新 OpenHarmony 系统一二级目录整理
我们在学习 OpenHarmony 的时候,如果对系统的目录结构了解,那么无疑会提升自己对 OpenHarmony 更深层次的认识。 于是就有了今天的整理。 首先在此之前,我们要获取源码 获取源码的方式 OpenHarmony 主干代码获取 方式一(推荐&am…...
多模态大语言模型arxiv论文略读(七)
MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文标题:MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文作者:Zhiyuan Zhao, Linke Ouyang, Bin Wang, Siyuan Huang, Pan Zhang, Xiaoyi Dong, Jiaqi Wang,…...
STM32单片机入门学习——第27节: [9-3] USART串口发送串口发送+接收
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.08 STM32开发板学习——第27节: [9-3] USART串口发送&串口发送接收 前言开发板说…...
【元表 vs 元方法】
元表 vs 元方法 —— 就像“魔法书”和“咒语”的关系 1. 元表(Metatable):魔法书 是什么? 元表是一本**“规则说明书”**,它本身是一个普通的 Lua 表,但可以绑定到其他表上,用来定义这个表应该…...
小型园区网实验
划分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…...
python 数组append数组
在Python中,可以通过多种方式将一个数组(列表)添加到另一个数组(列表)中。以下是几种常见的方法: 1. 使用 append() 方法 append() 方法将一个数组作为整体添加到另一个数组的末尾。 list1 [1, 2, 3] l…...
从0到1:STM32 RTC定时器配置全流程
1. 什么是RTC? RTC(Real-Time Clock) 是嵌入式系统中用于提供独立计时功能的硬件模块,具有以下特点: 独立于主系统时钟(即使MCU进入低功耗模式仍可运行)提供日历功能(年/月/日/时/…...
(学习总结33)Linux Ext2 文件系统与软硬链接
Linux Ext2 文件系统与软硬链接 理解硬件磁盘、服务器、机柜、机房磁盘物理结构磁盘的逻辑结构实际过程 CHS 与 LBA 地址转换 引入文件系统引入 " 块 " 概念引入 " 分区 " 概念引入 " inode " 概念 ext2 文件系统宏观认识Block Group 块组与其内…...
LeetCode算法题(Go语言实现)_36
题目 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点…...
牛客华为机试--HJ48 从单向链表中删除指定值的节点C++
题目描述 示例1 示例2 该题的核心是每来一组数据,都要从头开始找,找到数据后再插入。而不是直接在尾部插入数据。 上代码 #include <iostream> using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nu…...
Jmeter 插件【性能测试监控搭建】
1. 安装Plugins Manager 1.1 下载路径: Install :: JMeter-Plugins.org 1.2 放在lib/ext目录下 1.3 重启Jmeter,会在菜单-选项下多一个 Plugins Manager菜单,打开即可对插件进行安装、升级。 2. 客户端(Jmeter端) 2.1 安装plugins manager…...
从攻防演练到AI防护:网络安全服务厂商F5的全方位安全策略
随着AI和云原生技术的蓬勃兴起,多云架构的广泛采用,企业内部IT系统正经历着翻天覆地的变化。在这个转型期,传统的攻击手段和防守策略正面临着巨大的挑战。基于此,用户需要跳出传统的思维模式,采取新的视角,…...
【Introduction to Reinforcement Learning】翻译解读5
4 核心算法 我们将算法分为三类:基于价值的方法、基于策略的方法和混合算法。 4.1 基于价值的方法Value-based 一个重要的突破是Q-learning的引入,它是一种无模型算法,被视为off-policy时间差分(TD)学习。TD学习无疑…...
Jmeter中的bzm-concurrency thread group 与普通线程组的区别
在 JMeter 中,bzm - Concurrency Thread Group(由 BlazeMeter 提供)和标准的 Thread Group 是两种不同的线程组实现,主要区别在于 并发控制模型 和 负载调节方式。以下是详细对比: 1. 核心区别 特性bzm - Concurrency Thread Group标准 Thread Group负载模型基于并发数(C…...
VBA将Word文档内容逐行写入Excel
如果你需要将Word文档的内容导入Excel工作表来进行数据加工,使用下面的代码可以实现: Sub ImportWordToExcel()Dim wordApp As Word.ApplicationDim wordDoc As Word.DocumentDim excelSheet As WorksheetDim filePath As VariantDim i As LongDim para…...
ubuntu22部署 3d-tiles-tools
安装fnm curl -fsSL https://fnm.vercel.app/install | bash安装nodejs 20.17.0LTS版本 https://nodejs.org/zh-cn/download/package-manager安装依赖包 # Download and install nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.2/install.sh | bash# in…...
WebStrom关闭模板字符串自动转换
WebStrom关闭模板字符串自动转换 Editor > General > smart Keys > JavaScript > Automatically replace string literal with template string on typing "${"...
【零基础入门unity游戏开发——动画篇】新动画Animator的使用 —— AnimatorController和Animator的使用
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
npx vite 可以成功运行,但 npm run dev 仍然报错 Missing script: “dev“
npx vite 可以成功运行,但 npm run dev 仍然报错 Missing script: "dev",说明问题可能出在 npm 的脚本解析 或 项目配置 上。以下是具体解决方案: 1. 检查 package.json 的物理位置 可能原因: 你当前运行的目录下可能有一个 无效的 package.json,而真正的 packa…...
Java 泛型的逆变与协变:深入理解类型安全与灵活性
泛型是 Java 中强大的特性之一,它提供了类型安全的集合操作。然而,泛型的类型关系(如逆变与协变)常常让人感到困惑。 本文将深入探讨 Java 泛型中的逆变与协变,帮助你更好地理解其原理和应用场景。 一、什么是协变与…...
C语言核心知识点整理:结构体对齐、预处理、文件操作与Makefile
目录 结构体的字节对齐预处理指令详解文件操作基础Makefile自动化构建总结 1. 结构体的字节对齐 字节对齐原理 内存对齐:CPU访问内存时,对齐的地址能提高效率。操作系统要求变量按类型大小对齐。对齐规则: 每个成员的起始地址必须是min(成…...
深度学习|注意力机制
一、注意力提示 随意:跟随主观意识,也就是指有意识。 注意力机制:考虑“随意线索”,有一个注意力池化层,将会最终选择考虑到“随意线索”的那个值 二、注意力汇聚 这一部分也就是讲第一大点中“注意力汇聚”那个池化…...
特权FPGA之乘法器
完整代码如下: timescale 1ns / 1ps// Company: // Engineer: // // Create Date: 23:08:36 04/21/08 // Design Name: // Module Name: mux_16bit // Project Name: // Target Device: // Tool versions: // Description: // // Dependencies: …...
安全的企业局域网聊天工具哪个好用?
在当今数字化时代,企业对于局域网聊天工具的需求日益增长,尤其是在对数据安全和定制化服务有较高要求的大中型政企单位中。安全的企业局域网聊天工具哪个好用?虽然市面上有很多即时通讯软件,今天来介绍一下已经拥有十年行业经验的…...
如何应对客户频繁变更需求
如何应对客户频繁变更需求?要点包括: 快速响应、深入沟通、灵活规划、过程记录、风险管控。这些策略既能降低项目失控风险,也能帮助团队在变动环境中保持高效率。其中深入沟通尤为关键,它不仅能够让团队第一时间了解客户意图&…...
R语言进行聚类分析
目录 简述6种系统聚类法 实验实例和数据资料: 上机实验步骤: 进行最短距离聚类: 进行最长距离聚类: 进行中间距离聚类: 进行类平均法聚类: 进行重心法聚类: 进行ward.D聚类:…...