第1题:计算tps
某业务系统拥有用户1000w,每天20%用户操作平均使用3次,其中系统每天的核心时间段80%业务处理时间分布在上午10:00-12:00和下午14:00-16:00,每次核心业务操作关联的事务个数为8个,请问业务初始的tps需求为多少?
步骤1:估算系统每天的业务量T0
T0=1000w * 0.2 * 3 = 10000000 * 0.2 * 3 =10000000 * 0.6 = 6000000
步骤2:估算核心时间段的业务量T1
T1=T0 * 0.8 / (4 * 60) = 6000000 * 0.8 / (4 * 60) = 4800000 / 240 = 20000
步骤3:跟据每次核心业务操作关联的事务个数,再计算每分钟的业务量T2
T2=T1 * 8 = 20000 * 8 = 160000
步骤4:再将tpm换算成tps
T3=T2 / 60 = 16000 / 60 ≈ 2667.67 tps
注:考题中如果还给出扩展策略,预留策略,还有业务的复杂度,哪么您要进行按场景计算。
1、如业务系统预算每年同比增长20%,需要考虑未来3年的扩展需求,
2、要求资源利用率小于50%,
3、某业务系统复杂 SQL 较多,在工程实施阶段一般采用经验系数 1.6。
那么:(T3 * (1+ 20%) * (1+ 20%) * (1+20%) ) / 0.5 * 1.6
= (2667.67 * 1.2 * 1.2 *1.2 )/ 0.5 * 1.6
≈ 14751 tps
第2题:计算表存储大小
假设表 T 的 1000w 行,有 10 列,8列为INTEGER 类型,2列为date类型 ,假设表的填充因子 FILLFACTOR 是默认 100,请计算表的存储大小Mb?

根据计算公式:
每页大小8KB = 表页面头大小40KB + 每页最大记录数N * (元组头大小24B + 元组指针大小4B + 数据类型占用大小)
推导:
每页最大记录数N =(每页大小8KB – 表页面头大小40B) / (元组头大小24B + 元组指针大小4B + 数据类型占用大小)
每页最大记录数N =(8KB * 1024 – 40B) / (24B + 4B + (8 * 4 + 2 * 8))
每页最大记录数N= 8152B / (28B+48B) ≈ 107条
T表的大小为= (1000w / 107) * 8KB = 747663.55 /1024 ≈ 730.14Mb
注:在GaussDB各数据类型大小不一,在设置表字段类型时需要按需存储是设置表的基本要求:
一、数值类型
TINYINT: 微整数,别名INT1,存储空间 1字节。
SMALLINT:小范围整数,别名 INT2,存储空间占用 2字节。
INTEGER:常用整数,别名INT4,存储空间占用4字节。
BIGINT:大范围整数,别名INT8,存储空间占用8字节。
NUMERIC(p,s):别名NUMBER,每四位(十进制位)占用两个字节,然后在 整个数据上加上八个字节的额外开销,也就是 p/2 + 8 字节。
二、字符类型
VARCHAR(n): 变长字符串,别名VARCHAR2 ,一般情况按字符串实际存储需要分配空间, 最大10M字节。 n在PG兼容模式下为字符数,其他模式为字节数。
CHAR(n): 定字符串, n为存储字节长度,默认1字节, 最大10M字节。
三、日期/时间类型
DATE:日期,存储空间占用8字节。
TIMESTAMP(0) WITHOUT ZONE: 日期和时间,存储空间占用8字节。
四、布尔类型
BOOLEAN:存储空间占用1字节。
第3道:计算表索引大小
如表T的行有1000w行数据,在某date类型列上就创建索引t_idx,请计算索引大小Mb?

根据公式推导:
每页大小为8Kb= 索引页面头大小为40B + 每页最大的记录行数 * (索引元组头大小为 8B + 索引指针大小为4B + 索引列数据类型占用大小)
每页最大的记录行数N =( 每页大小为8Kb – 索引页面头大小为40B) / (索引元组头大小为 8B + 索引指针大小为4B + 索引列数据类型占用大小)。
推导结果
每页最大的记录行数N= (8Kb *1024 – 40B) / (8B + 4B +8B) =8152 / 20 ≈ 407条
页子结点页面个数S1=1000w / 407 ≈ 24570个
分支节点页面个数S2=24570 / 407≈ 60个
索引t_idx文件大小S=( (页子结点页面个数S1+ 分支节点页面个数S2+根节点页面个数S3) * 8Kb) / 1024
索引t_idx文件大小S=((24570+60+1)* 8 Kb) /1024 ≈ 192Mb
第4道:redo文件存储空间大小
由于性能调优与存储空间的有限,现将WAL 日志段文件数量checkpoint_segments值调整为256个,保留WAL日志段文件的最小数量wal_keep_segments调整为64个,在多个16MB的WAL日志段组成环境下,请问日志最大占用空间为Mb?
根据最大的日志占用空间公式计算:(keep_wal_segments + checkpoint_segments * 2 + 1) * 16Mb
= (256 + 64 * 2 +1) * 16Mb
=6160Mb
第5道:备份容量相关计算
某银行周边业务系统数据量估算约800GB,每日新增数据量30GB,运维人设置的备份策略是每天做一次全量备份,每个备份保留7天。此外周六需要做一次手工备份,用于恢复到测试环境验证,假设当前业务系统的数据模型备份压缩比为0.5,请问总备份容量多少GB?
分析备份的关健因素:
业务总数据量S:业务数据存储的容量
备份保留周期T1:每个备份集保留的时长,单位:天
备份周期T2:多久进行一次全备,单位:天
压缩比R:经验值参考范围是0.3~0.7,建议实测评估
每日新增数据量D:平均每天数据增量
手动备份个数N :手动备份几次
全量备份容量C1
差量备份容量C2
日志归档容量C3
手动全量备份容量C4
根据推导的公式:
全量备份容量C1=业务总数据量S * (ceil(备份保留周期T1 ÷ 备份周期T2)+ 1) * 压缩比R
C1=800GB * (ceil(7÷1) +1) * 0.5 = 3200GB
差量备份容量C2=每日新增数据量D * 备份保留周期T1 * 压缩比R
C2 = 30GB * 7 * 0.5 = 105GB
日志归档容量C3=每日新增数据量D* 备份保留周期T1
C3 = 30GB * 7 =210GB
手动全量备份容量C4= 业务总数据量S * 手动备份个数N* 压缩比R
C4 = 800GB * 1 * 0.5 = 400GB
总备份容量 = 全量备份容量C1 + 差量备份容量C2 + 日志归档容量C3 + 手动全量备份容量C4
总备份容量 = 3200GB + 105GB + 210GB + 400GB = 3915GB
第6题:不等边桶的选择率估算
select * from pg_stats where tablename ='t1' and attname ='a';

请计算a=37时选择率?
计算过程:
步骤1:null_frac值为零,说明a列没有null值
步骤2:mcv选择率:可以看到most_common_vals值为150,most_common_freqs:0.935033,则:a=150的选择率:0.935033
步骤3:a=37选择率:
(1-null_frac-mcf)* n_distinct/ 桶数量 * (桶上边界-桶下边界)/ (桶最大边界值-桶最小边界值)
=(1-0-0.935033)* 102/(100) * (38-37)/(101-1)=0.0006626634
相关参考:

第7题:计算2表关联的行数估算
2表关联的行数估算,主要是通过关联字段的基数与distinct值计算出来的。现有一张A表总行数为1W行,a列n_distinct值为0.2,有一张B表总行数为1.2W行,B表a列n_distinct值为0.25,如果A表的a列与B表a列做为关联条件,请问A表与B表做连接行数估算是多少行?
解:

则: 表1行数* 表2行数 /max(d1,d2)
d1=0.2 * 10000=2000
d2=0.25 * 12000 = 3000
连接行数=(10000*12000)/ max(2000,3000)
=40000行


