【GreatSQL优化器-08】statistics和index dives

【GreatSQL优化器-08】statistics和index dives

一、statistics和index_dives介绍

GreatSQL的优化器对于查询条件带有范围的情况,需要根据 mm tree 来估计该范围内大概有多少行,然后以此来计算cost。对于等号条件,给出了两种方法来估计对应行数--Statisticsindex dives,前者不精确后者精确,可以通过系统变量eq_range_index_dive_limit设置阈值来决定用哪种方法来估计等号条件的行数。对于一条查询 SQL 如果等号条件太多的时候执行index dives会占用较多资源,这时候设置一个合理的阈值改为统计值估计可以有效避免占用过多资源,提升执行效率。

名称 定义 说明
Statistics 用统计值来估计等号条件的行数,不精确 意味着SKIP_RECORDS_IN_RANGE模式,计算方式: rows = table->key_info[keyno].records_per_key()
index dives 精确计算等号条件的行数 意味着RECORDS_IN_RANGE,计算方式: rows = this->records_in_range()

下面用一个简单的例子来说明index dives是什么:

greatsql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT,date1 DATETIME);
greatsql> INSERT INTO t1 VALUES (1,10,'2021-03-25 16:44:00.123456'),(2,1,'2022-03-26 16:44:00.123456'),(3,4,'2023-03-27 16:44:00.123456'),(5,5,'2024-03-25 16:44:00.123456'),(7,null,'2020-03-25 16:44:00.123456'),(8,10,'2020-10-25 16:44:00.123456'),(11,16,'2023-03-25 16:44:00.123456');
greatsql> CREATE TABLE t2 (cc1 INT PRIMARY KEY, cc2 INT);
greatsql> INSERT INTO t2 VALUES (1,3),(2,1),(3,2),(4,3),(5,15);
greatsql> CREATE TABLE t3 (ccc1 INT, ccc2 varchar(100));
greatsql> INSERT INTO t3 VALUES (1,'aa1'),(2,'bb1'),(3,'cc1'),(4,'dd1'),(null,'ee');
greatsql> CREATE INDEX idx1 ON t1(c2);
greatsql> CREATE INDEX idx2 ON t1(c2,date1);
greatsql> CREATE INDEX idx2_1 ON t2(cc2);
greatsql> CREATE INDEX idx3_1 ON t3(ccc1);

greatsql> SELECT * FROM t1 WHERE (c1=4 AND c2<10) OR (c2=4 AND c1<9) OR (c2=10 AND c1<9) OR (c2=12 AND c1=8) OR (c2<8 AND date1<'2023-03-25 16:44:00.123456') OR (c2<15 AND date1<'2023-03-25 16:44:00.123456');
                  "analyzing_range_alternatives": {
                    "range_scan_alternatives": [
                      {
                        "index": "idx1",
                        "ranges": [
                          "NULL < c2 < 8",
                          "8 <= c2 < 10",
                          "c2 = 10",
                          "10 < c2 < 12",
                          "c2 = 12",
                          "12 < c2 < 15"
                        ],
                        "index_dives_for_eq_ranges": true,
                        "rowid_ordered": false,
                        "using_mrr": false,
                        "index_only": false,
                        "in_memory": 1,
                        "rows": 9, # 这里的值包含c2 = 10和c2 = 12根据index dive估算出来的值
                        "cost": 4.66,
                        "chosen": false,
                        "cause": "cost"
                      },
                      {
                        "index": "idx2",
                        "ranges": [
                          "NULL < c2 < 4",
                          "c2 = 4",
                          "4 < c2 < 8",
                          "8 <= c2 < 10",
                          "c2 = 10",
                          "10 < c2 < 12",
                          "c2 = 12",
                          "12 < c2 < 15"
                        ],
                        "index_dives_for_eq_ranges": true,
                        "rowid_ordered": false,
                        "using_mrr": false,
                     
### HHO优化算法简介 哈里斯鹰优化算法(Harris Hawks Optimization, HHO)是一种基于群体智能的元启发式优化算法,其灵感来源于自然界中哈里斯鹰的独特捕食策略[^1]。该算法通过模拟哈里斯鹰在狩猎过程中的围攻、突袭以及追逐行为来解决复杂的全局优化问题。 HHO的核心思想在于利用种群个体之间的协作与竞争机制,在搜索空间中动态调整候选解的位置,从而逐步逼近最优解。这种算法具有较强的探索能力开发能力,适用于连续优化问题离散优化问题。 --- ### HHO优化算法的主要步骤 HHO算法的关键组成部分包括以下几个方面: #### 1. 初始化参数 初始化过程中需要定义一些基本参数,例如种群规模 \(N\)、最大迭代次数 \(T_{\text{max}}\) 搜索空间维度 \(D\)。此外,还需要随机生成初始种群位置矩阵 \(\mathbf{X}=[x_1,x_2,\ldots,x_N]\),其中每个个体代表一个潜在解决方案。 #### 2. 计算适应度值 对于每一个候选项 \(\mathbf{x}_i\),计算对应的适应度函数值 \(f(x_i)\)。这一步骤决定了当前解的质量,并作为后续更新的基础依据。 #### 3. 更新位置 根据哈里斯鹰的行为模式,HHO采用不同的数学模型描述其捕食动作。具体而言,当猎物被发现时,鹰会采取以下几种策略之一: - **软包围**:表示缓慢接近目标的过程; - **快速潜水攻击**:模仿突然加速冲向猎物的动作; 这些行为由概率因子 \(E\) 控制,\(E\) 的取值范围为 [-1, 1],并随时间逐渐减小以增强收敛性能。 #### 4. 收敛条件判断 重复执行上述操作直至达到预设的最大迭代次数或者满足其他停止准则为止。最终返回最佳找到的解及其对应的目标函数值。 --- ### Python 实现代码示例 以下是基于 HHo 算法的一个简单实现版本,假设我们试图最小化某个测试函数 (如 Sphere 函数): ```python import numpy as np def objective_function(X): """Sphere function""" return sum([x**2 for x in X]) class HarrisHawksOptimization: def __init__(self, dim, pop_size, max_iter, lb, ub): self.dim = dim # 维数 self.pop_size = pop_size # 种群大小 self.max_iter = max_iter # 最大迭代次数 self.lb = lb # 下界 self.ub = ub # 上界 def optimize(self): population = np.random.uniform(self.lb, self.ub, (self.pop_size, self.dim)) best_position = None best_fitness = float('inf') convergence_curve = [] for t in range(1, self.max_iter + 1): E0 = 2 * (1 - (t / self.max_iter)) # 能量系数 for i in range(self.pop_size): fitness = objective_function(population[i]) if fitness < best_fitness: best_fitness = fitness best_position = population[i].copy() for j in range(self.pop_size): E = 2 * np.random.rand() - 1 # 随机能量水平 r1 = np.random.rand() r2 = np.random.rand() Q = 0.5 * np.random.randn(len(best_position)) if abs(E) >= 1: # Soft besiege strategy rand_hawk_index = int(np.floor(self.pop_size * np.random.rand())) X_rand = population[rand_hawk_index] J = 2 * (1 - r2) Y = X_rand - E * abs(J * X_rand - population[j]) elif abs(E) < 1 and r1 >= 0.5: # Hard besiege with progressive rapid dives Y = best_position - E * abs(best_position - population[j]) Z = Y + Q # Perform Levy flight around the rabbit else: # Soft besiege with progressive rapid dives Z = best_position - E * abs(best_position - population[j]) # Boundary check Z = np.clip(Z, self.lb, self.ub) new_fitness = objective_function(Z) if new_fitness < fitness: population[j] = Z.copy() convergence_curve.append(best_fitness) return best_position, best_fitness, convergence_curve if __name__ == "__main__": D = 30 # Dimensionality of problem space N = 20 # Population size T_max = 500 # Maximum number of iterations lower_bound = -100 # Lower bound per dimension upper_bound = 100 # Upper bound per dimension hho_instance = HarrisHawksOptimization(D, N, T_max, lower_bound, upper_bound) optimal_solution, optimal_value, curve = hho_instance.optimize() print(f'Best Solution Found: {optimal_solution}') print(f'Minimum Objective Value: {optimal_value}') ``` 此段程序展示了如何构建一个基础版的 HHO 求解器,并应用于求解标准球形函数(Sphere Function)。 --- ### 总结 综上所述,HHO 是一种高效的仿生学优化技术,能够有效处理高维复杂优化场景下的难题。通过对自然现象抽象建模的方式,HHO 不仅保持了良好的多样性维持特性,而且具备较快的局部精炼速率,使其成为现代工程领域不可或缺的研究工具之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值