海山数据库(He3DB)技术解析:海山数据库智能调参技术实践


传统的数据库调参方法有网格搜索或者随机搜索,而近年来流行的贝叶斯优化算法,因其具有极强的样本有效性,只需较少地迭代次数,即可得到一个较好的结果,因此广泛应用于当前的机器学习模型算法调参中,下面我们将介绍贝叶斯优化的原理。

1、贝叶斯优化问题

贝叶斯优化是一种黑盒优化算法,用于求解表达式未知的函数的极值问题。算法根据一组采样点处的函数值预测出任意点处函数值的概率分布,这通过高斯过程回归而实现。之后根据高斯过程回归的结果构造采集函数,用于衡量每一个点值得探索的程度,求解采集函数的极值从而确定下一个采样点,最后返回这组采样点的极值作为函数的极值。总的说来,贝叶斯优化解决下面函数优化问题:

x ∗ = arg ⁡ max ⁡ x ∈ X f ( x ) (1) x^{*}=\arg \max _{x \in X} f(x) \tag{1} x=argxXmaxf(x)(1)

(1) X X X 为感兴趣的参数空间,在机器学习领域中可理解为超参数空间,比如我们感兴趣的模型的全集,以及每个感兴趣的模型所对应的感兴趣的超参数集合;
(2) f ( x ) f(x) f(x)为参数空间到我们所感兴趣的一个指标的映射函数,通常这个指标是我们实际所关心的问题,比如在回归问题中可以为MSE, 分类问题中可以为accuracy等;
(3) f f f的结构不明确,因此可以说 f f f 是一个黑箱函数,而解决该优化问题被称为黑箱优化。 f f f 没有一阶或者高阶导数,不能通过梯度下降或者牛顿相关算法求解, f f f 为连续函数,这一点在用高斯回归过程对 f f f 进行建模时被要求。

如下图1所示,贝叶斯优化根据已经搜索的点的函数值估计真实目标函数值的均值和方差(即波动范围),图中红色的曲线为估计出的目标函数值即在每一点出处的目标函数值的均值。从图中可以看出有3个已经搜索的点,用黑色实心点表示,两条虚线所夹区域为在每一点处函数值的变动范围,在以均值即红色曲线为中心,与标准差成正比的区间内波动。在搜索点处,红色曲线经过搜索点,且方差最小,在远离搜索点处方差更大,这也符合我们的直观认识,远离采样点处的函数值估计的更不可靠。

在这里插入图片描述

图1 贝叶斯优化波动图

根据均值和方差可以构造出采集函数(acquisition function),即对每一点是函数极值点的可能性的估计,反映了每一个点值得搜索的程度,该函数的极值点是下一个搜索点,如上图1所示。上图中的矩形框所表示的点是采集函数的极大值点,也是下一个搜索点。

由此可见,贝叶斯算法的核心主要由两部分构成:首先对目标函数进行建模,即建立代理模型 (surrogate model)计算每一点处的函数值的均值和方差,通常用高斯过程回归实现;构造采集函数(acquisition function),用于决定本次迭代时在哪个点处进行采样。

1.1 高斯过程回归(surrogate model)

高斯过程回归(Gaussian Process Regression,GPR)对表达式未知的函数(黑盒函数)的一组函数值进行贝叶斯建模,给出函数值的概率分布。高斯过程回归根据已经搜索的点估计其他点处目标函数值的均值和方差。如下图2所示。图中蓝色实线为真实的目标函数曲线,黑色虚线为算法估计出的在每一点处的目标函数值。图中有7个已经搜索的点,用红色点表示。蓝色带状区域为在每一点处函数值的置信区间。函数值在以均值,即黑色虚线为中心,与标准差成正比的区间内波动。
在这里插入图片描述

图2 高斯回归波动图

高斯过程回归可以根据某些点以及在这些点处的函数值得到一个模型,拟合此黑盒函数。对于任意给定的输入值 x x x可以预测出 f ( x ) f(x) f(x),并给出预测结果的置信度,事实上模型给出的是 f ( x ) f(x) f(x)的概率分布。

1.2 采集函数(acquisition function)

采集函数用于确定在何处采集下一个样本点,它需要满足下面的3个条件:首先在已有的采样点处采集函数的值更小,因为这些点已经被探索过,再在这些点处计算函数值对解决问题没有什么用;再者在置信区间更宽的点处采集函数的值更大,因为这些点具有更大的不确定性,更值得探索;最后在函数均值更大的点处采集函数的值更大,因为均值是对该点处函数值的估计值,这些点更可能在极值点附近。

f ( x ) f(x) f(x)是一个随机变量,直接用它的数学期望 μ ( x ) μ(x) μ(x) 作为采集函数并不是好的选择,因为没有考虑方差的影响。常用的采集函数有期望改进(expected improvement)和知识梯度(knowledge gradient)等,新加入点的改进值可以表示为:
[ f ( x ) − f n ∗ ] + (2) [f(x)-f^*_n]^+\tag{2} [f(x)fn]+(2)

现在的目标是找到使得上面的改进值最大的 x x x,但该点处的函数值 f ( x ) f(x) f(x) 在我们找到这个点 x x x 并进行函数值计算之前又是未知的。由于我们知道 f ( x ) f(x) f(x)的概率分布,因此我们可以计算所有 x x x 处的改进值的数学期望,并选择数学期望最大的 x x x 作为下一个探索点。因此可以定义下面的期望改进函数:
E I n ( x ) = E n [ [ f ( x ) − f n ∗ ] + ] (3) EI_{n}(x) = E_n[[f(x)-f_n^*]^+]\tag{3} EIn(x)=En[[f(x)fn]+](3)
E n [ ⋅ ] = E [ ⋅ ∣ x 1 : n , y 1 : n ] (4) E_n[·] = E[·|x_{1:n},y_{1:n}]\tag{4} En[]=E[x1:n,y1:n](4)

E n [ ] E_n[] En[]表示根据前面 n n n个采样点以及这些点处的函数值计算出的条件期望值。计算这个数学期望所采用的概率分布由高斯过程回归定义,是 f ( x ) f(x) f(x)的条件概率。由于高斯过程回归假设 f ( x ) f(x) f(x) 服从正态分布,可以得到数学期望的解析表达式,借助于均值和方差进行进一步优化计算得到如下公式:
E I n ( x ) = [ Δ ( x ) ] + + σ ( x ) φ [ Δ ( x ) σ ( x ) ] − ∣ Δ ( x ) ∣ ϕ ( Δ ( x ) σ ( x ) ) (4) EI_n(x) = [\Delta(x)]^++\sigma(x)\varphi [\frac{\Delta(x)}{\sigma(x)} ] -|\Delta(x)|\phi(\frac{\Delta(x)}{\sigma(x)})\tag{4} EIn(x)=[Δ(x)]++σ(x)φ[σ(x)Δ(x)]∣Δ(x)ϕ(σ(x)Δ(x))(4)
Δ ( x ) = μ ( x ) − f n ∗ (5) \Delta (x) = \mu (x)-f_n^* \tag{5} Δ(x)=μ(x)fn(5)

期望改进将每个点处的期望改进表示为该点的函数,下一步是求期望改进函数的极值以得到下一个采样点:
x n + 1 = a r g m a x E I n ( x ) (6) x_{n+1} = argmaxEI_n(x)\tag{6} xn+1=argmaxEIn(x)(6)

1.3 贝叶斯迭代算法

贝叶斯迭代的具体流程如下所示:

选择n0个采样点,计算 f ( x ) f(x) f(x)在这些点处的值,
n = n 0 n = n_0 n=n0
While n < = N n<= N n<=N do
  根据当前采样数据 D = D = D= { ( x 1 , f ( x 1 ) ) , i = 1... n (x_1,f(x_1)),i=1...n (x1,f(x1)),i=1...n}更新 p ( f ( x ) ∣ D ) p(f(x)|D) p(f(x)D)的均值和方差
  根据𝑝(𝑓(𝑥)|𝐷)的均值和方差计算采集函数𝑢(𝑥)
  根据采集函数的极大值确定下一个采样点 x n + 1 = a r g m a x x u ( x ) x_{n+1} = argmax_xu(x) xn+1=argmaxxu(x)
  计算在下一个采样点处的函数值: y n = f ( x n + 1 ) y_n = f(x_{n+1}) yn=f(xn+1)
   n = n + 1 n = n+1 n=n+1
End while
Return: a r g m a x ( f ( x 1 ) , . . . , f ( x N ) ) argmax(f(x_1),...,f(x_N)) argmax(f(x1),...,f(xN))以及对应的 y y y

贝叶斯优化中的高斯回归过程中参数类型不能为离散的情况,导致在实际的调参过程中会出现一些列的限制,因为实际的参数存在离散的情况,应用受限,因此接下来我们介绍一下优化方案,即基于随机森林的贝叶斯优化,将代理模型由高斯回归替换为随机森林。

2、基于随机森林的贝叶斯优化(SMAC)

贝叶斯优化中,除了代理模型为高斯过程外,另一种用得比较多的代理模型为随机森林,本文将详述基于随机森林的贝叶斯优化SMAC。 SMAC全称Sequential Model-Based Optimization for General Algorithm Configuration,算法在2011被Hutter等人提出,该算法的提出即解决高斯回归过程中参数类型不能为离散的情况。

2.1 随机森林建模

假设当前我们已有一些初始样本点 ( x 1 , f ( x 1 ) ) , ( x 2 , f ( x 2 ) ) , . . . , ( x n , f ( x n ) ) {(x_1, f(x_1)), (x_2, f(x_2)), ..., (x_n, f(x_n))} (x1,f(x1)),(x2,f(x2)),...,(xn,f(xn)),然后根据这些点,我们建立一个随机森林模型去拟合 f f f;该过程可以类比高斯回归过程中 n n n个点所构成的多维正态分布;由于随机森林可以处理离散变量,因此该方法很自然地使用与变量类型为离散情况,而对于条件限制情况,只需要在参数空间中加入条件限制,保证一些不可能的情况不会被采样到即可。在原论文中,每颗树分裂时随机选择特征比例为5/6, 叶节点需要的最少数据数量为10,树的数量也为10。

在高斯回归过程中,对于新加入的点 x x x与之前的点构成新的多维正态分布,然后求解新加入点的边际分布即可得到新加入的点的均值与标准差,那么在随机森林的模型又是如何做到的呢?对于新加入的点 x x x,在随机森林的每个树上有一个预测结果,把所有树的预测结果求平均即得到均值,预测结果求标准差即为标准差。随机森林的另外一个好处就是对于某个点 x x x, 其在每颗树上的预测复杂度只有 O ( l o g N ) O(logN) O(logN),而在高斯回归过程中,需要进行复杂的矩阵相乘才可以得到均值与标准差。

2.2 下一次迭代点选取:大规模随机采样

正因为随机森林对于需要探索的点 x x x的预测复杂度不高,因此关于候选点 x x x的选取,在SMAC原论文中通过大规模采样得到,具体的在当前数据点中选取使得acquisition function最大的10个点作为起点,通过random neighbors方法找到邻居点,并带入随机森林模型进行预测;某个点的random neighbors的定义:该点所有的离散变量的取值随机切换,该点所有连续变量以当前取值为均值,0.2为标准差采样切换(连续变量事前被normalize到[0,1] );通过该方法随机采样10000个点,带入随机森林预测均值与标准差,然后计算acquisition function,并选取最大的点作为下一个迭代点。

2.3 SMAC迭代算法

smac算法迭代具体流程如下所示:

1.随机初始化 n 0 n_0 n0个点,并得到 n 0 n_0 n0个点结果{ ( x 1 , f ( x 1 ) ) , ( x 2 , f ( x 2 ) ) , . . , ( x n , f ( x n ) ) (x_1,f(x_1)),(x_2,f(x_2)),..,(x_n,f(x_n)) (x1,f(x1))(x2,f(x2))..(xn,f(xn))};确定最大迭代次数 N N N
2.利用初始化的 n 0 n_0 n0个点,训练随机森林模型;
3.当 n < = N n<=N n<=N时:
  a)通过大规模随机采样产生候选点,将候选点带入训练好的随机森林得到均值和标准差等信息,计算采集函数 a n ( x ) a_n(x) an(x)
  b)选择最大化 a n ( x ) a_n(x) an(x)的点作为 x n + 1 x_{n+1} xn+1;
  c)新的点 x n + 1 x_{n+1} xn+1,带入得到 f ( x n + 1 ) f(x_{n+1}) f(xn+1);注意:这一步非常耗时,因为要训练一个模型
  d)更新 n = n + 1 n=n+1 n=n+1,将当前 n n n个点重新训练随机森林;
4.返回当前评估过的数据中,使得 f ( x ) f(x) f(x)最大的点 x ∗ x^* x;

smac算法的整体效果经过验证对于调参效果较为明显,但是算法存在训练时间较长的问题,整个迭代都处于高纬度调参,因此在达到选定的配置之前探索多种配置所涉及的成本和时间是实际相关性的核心挑战。目前经过实践,该方法需要 100 次或更多次迭代 才能收敛到良好的配置,每次迭代需要几分钟。为此,我们将研究的重点放在开发可以提高样品效率的技术上,并且这些技术与现有工作广泛互补。Llamatune框架应运而生,下面将进行详细介绍。

3、Llamatune采样高效的DBMS配置调优

Llamatune的优势在于低纬度调参,即针对用户输入的D维配置空间,找到d维的空间,d<<D,然后让d维调参的效果尽量接近D维,该思想主要基于合成搜索空间和随机低纬度投影进行实现。

合成搜索空间的思想源于我们常习惯于一个knob对应一个维度,每个维度都是有物理意义的,然而对于优化器来说维度的物理意义是不用追究的,因此我们可以人工合成维度,也就是多个维度合并成一个维度,合成knob的一个值可以决定多个knobs值。合成knob本身没有物理意义,但是可以实现降低维度,同时避免了识别重要knobs的需要。假设合成knob空间 X d Xd Xd,用户给定的空间 X D XD XD

随机低纬投影主要有两种方法,分别为REMBO方法和HeSBO方法:

(1)REMBO方法

  • 低维度 d d d,原始维度 D D D
  • 通过生成一个随机投影矩阵 A A A( D × d D\times d D×d的矩阵,每一个部分都是独立同分布,服从标准正态)
  • X d Xd Xd中的一个点 p p p d d d维向量),通过 p ′ = A p p'= Ap p=Ap得到的 p ′ p' p就是 D D D维,相当于还原回了 D D D维度中
  • 如果说 X D XD XD是无边界的,那求出来的这个 p ′ p' p就是没问题的,但是 X D XD XD要是有边界的话可能求出来的 p ′ p' p不在 X D XD XD内,这时候需要找到 X D XD XD中距离最近的点(剪切了)

(2)HeSBO方法(哈希增强子空间)

  • 一种避免剪切的随机线性投影变体
  • 原始搜索空间 X D XD XD,目标低位空间 X d ∈ [ − 1 , 1 ] Xd\in[-1,1] Xd[1,1]^ d d d
  • 生成一个随机投影矩阵 A A A( D × d D\times d D×d维,每一行恰好包含一个非零元素,列数随机,值为±1;列的索引和值的正负号是随机均匀抽样的;具体做法是通过两个uniform哈希函数实现, h h h X D XD XD每个维度选择非零列, σ \sigma σ确定符号)
  • A A A提供了一种一对多映射,投影不会落在 X D XD XD之外,效果表现优于REMBO

3.2 Llamatune算法迭代

Llamatune的算法迭代用户提供输入包括: d d d:低维度空间的维数(理想情况下是DBMS重要knobs数量的估计值),n_init:要生成的初始随机样本数,N_iters:要执行的迭代次数(时间预算),整体迭代过程如下所示:

1)生成随即投影矩阵 A A A(只生成一次,在之后的优化过程中保持不变);
2)给定n_init,采用空间填充采样方法(如LHS),生成初始点集p∈Xd;这些点属于Xd的近似空间,就是XD空间的第一次投影(如果REMBO方法则还有一个clipped过程);
3)对于每个投影点(包括近似的)计算相应目标函数,一旦对所有初始点进行了评估,这些点的目标函数值将用于初始化surrogate model;
循环(N_iters)

  • surrogate model找到一个点p∈Xd能够使得acquisition function最大;
  • 通过回顾之前的点集,acquisition function尝试找到一些点,这些点既能够提供未知领域的知识,也能够通过在已知的表现良好的区域的临近区域探索来寻找知识;
  • 将建议的点投影到XD,评估之并更新surrogate model;

Llamatune首先需要将点转化为DBMS knobs,算法中将选择的点映射到高维空间 X D = [ − 1 , 1 ] XD=[-1,1] XD=[1,1]^ D D D,然而实际的DMBS knobs有不同类型的值,例如数字类型范围是[min,max],类别knobs是离散的选项,我们需要将[-1,1]^D的值正确转换为有意义的值。数字类型采用min-max uniform scaling 方法,如公式7所示从[-1,1]映射到[min,max] ,如果是离散数字的话,将放缩后的值近似到整。类别转换主要分为两步:首先将预测值x∈[-1,1]调整到y∈[0,1],然后将这个区间按照类别数量均分为Bins,最后的y值落在哪个区间就算哪个类。

y = y m i n + x − x m i n x m a x − x m i n ( y m a x − y m i n ) (7) y = y_{min}+ \frac{x-x_{min}}{x_{max}-x_{min}}(y_{max}-y_{min})\tag{7} y=ymin+xmaxxminxxmin(ymaxymin)(7)

投影空间的维数是其需要考虑的一个重要参数,论文选择的是16维HeSBO投影进行实验,此外并不是所有knob值都具有相同的语义性能,DMBS的配置空间是异构的,包括数字knob与类别knob;由于类别knob的特殊性(禁用启用组件的内部功能,或者为任务选择互斥算法),可能会对DBMS性能产生显著变化,所以目前最有效的BO方法独立处理每个类别knob值,并不假设其顺序,因此引入了hybrid knob的概念,其是数字值,但是当其设置为特定值时会执行与正常操作截然不同的操作(例如禁用某些功能),其余情况下则是正常的数值类knob,主要方法采用了Biasing Special Value Sampling Probability,一种能够使得优化器在调优的早期观察特殊值的影响的方法,方法步骤如下:

  • 假定这个knob的范围是[0,max],其中0为特殊值;
  • 开始优化前假定一个bias,即knob选择特殊值的概率p;
  • 然后我们得到一个建议值v∈[0,max]后,将v缩放到[0,1]区间内,如果缩放的值落在了[0,p)内部,就选择特殊值,否则还原回v;

关于Bias选取需要注意:假设随机配置初始集合由n_init个样本组成,bias设置为p的话,评估的样本遵循二项分布B(n_init, p);默认情况下将p设置为20%,这样可以使得在初始随机配置集中评估特殊值(至少一次)有90%的置信水平。注意即使具有较高的置信水平,仍然有概率在初始迭代期间不评估(然而通常优化器定期提出的随机配置也偏向于每个hybrid knob的特殊值,这样可以有效处理不同knob的特殊值之间的不良交互);当优化器执行本地搜索时,特殊值偏差不会以任何方式阻碍优化器。无论特殊值是否提高性能,优化器仍然能够微调已评估的配置,以进一步提高性能。

配置空间桶化(Configuration Space Bucketization)主要针对离散数值类型,离散数值类型的knob彼此间也有很大差异,有的只有10个值,有的可能有数十万个值,取值的多少决定控制粒度的大小。对于有些具有较大范围的配置knob,小的改动不太可能影响DBMS性能。设置一个K值,取值范围超过K个的knobs近似使用K个值(例如commit_delay有100000个值,设置K=100,就将commit均分100份,每次调整步长是1000),如果少于K值得knobs继续按照原来得粒度来。

综上,LlamaTune设计必须满足的三个要求:优化器始终在低维空间上运行,而不是在原始的DBMS配置空间中;仅应该在hybrid knobs上进行特殊值的bias设置;bucketized间隔应该告诉优化器。LlamaTune 采用基于随机投影的自动二元性缩减技术、处理某些旋钮特殊值的偏置采样方法,以及旋钮值桶化,以减小搜索空间的大小,因此LlamaTune 在各种工作负载中与最先进的优化器相比具有优势。
在这里插入图片描述

整体流程如上图所示,原本的要调整的参数有5个,降维成2维,其中第一个参数管控两个hybrid knob,第二个参数管控剩下三个参数初始值[-0.8, 0.4],映射到高维度空间中得到[-0.8, -0.4, 0.4, 0.4, 0.8],然后放缩到[0,1]空间,对hybrid knob使用bias方法,其余征程放缩到自己的空间。

4、智能调参设计的参数

识别重要的调参按钮,所有现有的识别重要旋钮的方法都使用基于排名的过程。

1、基于排名的方法通常使用空间填充采样,如拉丁超立方体采样 (LHS)。

2、对 ML 模型进行训练,以量化每个旋钮如何影响 DBMS 性能,即重要性分数。

3、SHAP 值在 DBMS 调优的上下文中提供最有意义的重要性分数。SHAP 使用博弈论方法在分析与默认配置的性能偏差时分解每个单个特征的影响。

本文主要采用第一种方法筛选出pg数据库中110个较为重要的参数进行调参,由于参数规模较大,具体挑选出的参数附在结尾进行展示,此外我们还人工设计了常用的8中参数进行对比试验,如下所示:
{“shared_buffers”, “max_connections”, “work_mem”, “bgwriter_delay”, “effective_cache_size”, “maintenance_work_mem”,“max_wal_size”, “effective_io_concurrency” }

5、Llamatune在pg数据库上的效果测试

训练和测试选用的数据集主要包括IMDB和STATS数据集,评价方式为测试SQL的平均执行时间:
1)IMDB数据集上有21个电影和明星表,其JOB工作负载包含113个真实查询;
2)Stats Stack Exchange 网络上 8 个用户贡献内容表的 STATS 数据集,其 STATS-CEB 工作负载有 146 个查询,其连接大小和形式各不相同;
每次实验,我们随机做5此实验,取平均值作为最终的结果值。以上110个参数的调参结果如下所示:

Llamatune效果测试 (stats训练数据)
测试数据Test1Test2Test3Test4Test5averagepercent
stats-origin0.6214720.6173370.6165040.6156600.6265780.619510
stats-llama0.4120520.4145100.4113530.4088410.4078240.410916+33.67%
stats-smac0.4269210.4275080.4260870.4269930.4227340.426069+31.22%
Llamatune效果测试 (imdb训练数据)
测试数据Test1Test2Test3Test4Test5averagepercent
imdb-origin2.4575242.4415952.4475472.4597882.4386192.449015
imdb-llama2.2638892.2717182.2585722.2740942.2637812.264411+7.54%
imdb-smac1.9764131.9290071.9752171.9889461.9828681.970490+19.54%

从以上实验结果可以看出,在不同 workload类型上进行智能调参实践,Llamatune和smac算法表现比较稳定,平均提升超过20%,其中Llamatune算法和smac算法在整体原理实现上基本一致,只不过Llamatune加速了整个语料的微调过程,整体训练时间缩短将近50%,同时保证其微调效果稳定。为了进一步结合人工挑选的参数进行参数调整,我们补充了8个人工参数经过算法微调的结果,其测试效果如下表格所示。

Llamatune效果测试 (imdb训练数据)
测试数据Test1Test2Test3Test4Test5averagepercent
stats-origin0.6214720.6173370.6165040.6156600.6265780.619510
stats-llama0.6182140.6131360.6112390.6243370.6114490.615679+0.60%
stats-smac0.6158900.6067880.6119270.6250670.6248000.617002+0.40%
Llamatune效果测试 (imdb训练数据)
测试数据Test1Test2Test3Test4Test5averagepercent
imdb-origin2.4575242.4415952.4475472.4597882.4386192.449015
imdb-llama2.4633312.4306722.4597642.4363972.4443282.446898+0.09%
imdb-smac2.4957432.4546362.4595732.4542222.4856912.469973-0.86%

6、总结

调整数据库系统以在给定工作负载上实现最佳性能是数据库社区中长期存在的问题。LlamaTune作为一种简单高效的DBMS 参数微调方法,除了在微调时间上较传统的SMAC方法降低了超50%,但是其参数微调之后的SQL平均运行时间缩短了超过20%,具有稳定优势。此外人工挑选的少量参数,在经过Llamatune和smac微调之后,SQL的平均运行时间基本没什么变化,说明少量参数在经过算法模型微调后效果有限,其参数之间的关联性和约束不易捕捉。下一步,我们将进一步结合pg数据库自身业务数据,进行线上真实的智能参数调优测试,相信Llamatune也会有不俗的表现。

7、附录

算法挑选的110种参数如下所示:
{‘autovacuum’: ‘on’, ‘autovacuum_analyze_scale_factor’: 98.67, ‘autovacuum_analyze_threshold’: 282, ‘autovacuum_freeze_max_age’: 750062500, ‘autovacuum_max_workers’: 3179, ‘autovacuum_multixact_freeze_max_age’: 564607177, ‘autovacuum_naptime’: 2118922, ‘autovacuum_vacuum_cost_delay’: 32, ‘autovacuum_vacuum_cost_limit’: -1, ‘autovacuum_vacuum_insert_scale_factor’: 53.349999999999994, ‘autovacuum_vacuum_insert_threshold’: 71370, ‘autovacuum_vacuum_scale_factor’: 43.410000000000004, ‘autovacuum_vacuum_threshold’: 1285698460, ‘autovacuum_work_mem’: 122551, ‘backend_flush_after’: 30, ‘bgwriter_delay’: 3664, ‘bgwriter_flush_after’: 128, ‘bgwriter_lru_maxpages’: 633, ‘bgwriter_lru_multiplier’: 2.2904, ‘checkpoint_completion_target’: 0.6822, ‘checkpoint_flush_after’: 150, ‘checkpoint_timeout’: 27478, ‘commit_delay’: 1202, ‘commit_siblings’: 13, ‘cpu_index_tuple_cost’: 2.6723999999999997, ‘cpu_operator_cost’: 1.1452, ‘cpu_tuple_cost’: 3.2704, ‘cursor_tuple_fraction’: 0.625, ‘data_sync_retry’: ‘off’, ‘deadlock_timeout’: 1412, ‘default_statistics_target’: 121, ‘effective_cache_size’: 1106248, ‘effective_io_concurrency’: 59, ‘enable_bitmapscan’: ‘on’, ‘enable_gathermerge’: ‘off’, ‘enable_hashagg’: ‘off’, ‘enable_hashjoin’: ‘off’, ‘enable_incremental_sort’: ‘off’, ‘enable_indexonlyscan’: ‘on’, ‘enable_indexscan’: ‘on’, ‘enable_material’: ‘on’, ‘enable_mergejoin’: ‘off’, ‘enable_nestloop’: ‘on’, ‘enable_parallel_append’: ‘on’, ‘enable_parallel_hash’: ‘off’, ‘enable_partition_pruning’: ‘on’, ‘enable_partitionwise_aggregate’: ‘off’, ‘enable_partitionwise_join’: ‘on’, ‘enable_seqscan’: ‘on’, ‘enable_sort’: ‘on’, ‘enable_tidscan’: ‘on’, ‘from_collapse_limit’: 41, ‘full_page_writes’: ‘on’, ‘geqo’: ‘off’, ‘geqo_effort’: 10, ‘geqo_generations’: 340, ‘geqo_pool_size’: 0, ‘geqo_seed’: 0.4013, ‘geqo_selection_bias’: 1.76675, ‘geqo_threshold’: 3, ‘hash_mem_multiplier’: 28.7291, ‘jit_above_cost’: 917200, ‘jit_inline_above_cost’: 3568500, ‘jit_optimize_above_cost’: 3532500, ‘join_collapse_limit’: 49, ‘logical_decoding_work_mem’: 296059, ‘maintenance_io_concurrency’: 362, ‘maintenance_work_mem’: 333936, ‘max_connections’: 8177, ‘max_files_per_process’: 14360, ‘max_locks_per_transaction’: 300, ‘max_parallel_maintenance_workers’: 235, ‘max_parallel_workers’: 119, ‘max_parallel_workers_per_gather’: 75, ‘max_pred_locks_per_page’: 580, ‘max_pred_locks_per_relation’: 514, ‘max_pred_locks_per_transaction’: 417, ‘max_prepared_transactions’: 663, ‘max_stack_depth’: 1482, ‘max_wal_size’: 2186, ‘max_worker_processes’: 85, ‘min_parallel_index_scan_size’: 678, ‘min_parallel_table_scan_size’: 78473, ‘min_wal_size’: 210, ‘old_snapshot_threshold’: 27453, ‘parallel_leader_participation’: ‘off’, ‘parallel_setup_cost’: 456.0, ‘parallel_tuple_cost’: 3.2704, ‘quote_all_identifiers’: ‘on’, ‘random_page_cost’: 7.3256000000000006, ‘seq_page_cost’: 0.7296, ‘shared_buffers’: 476272, ‘temp_buffers’: 37130, ‘temp_file_limit’: 53125, ‘vacuum_cost_delay’: 22, ‘vacuum_cost_limit’: 9157, ‘vacuum_cost_page_dirty’: 133, ‘vacuum_cost_page_hit’: 9172, ‘vacuum_cost_page_miss’: 843, ‘vacuum_freeze_min_age’: 625000000, ‘vacuum_freeze_table_age’: 1364400000, ‘vacuum_multixact_freeze_min_age’: 917200000, ‘vacuum_multixact_freeze_table_age’: 1091600000, ‘wal_buffers’: 21831, ‘wal_compression’: ‘off’, ‘wal_init_zero’: ‘off’, ‘wal_log_hints’: ‘off’, ‘wal_recycle’: ‘off’, ‘wal_skip_threshold’: 81920, ‘wal_writer_delay’: 3757, ‘wal_writer_flush_after’: 5402, ‘work_mem’: 47867}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值