如何基于复杂度对工作负载中的SQL查询排序并构建复杂度评分函数
SQL查询复杂度评分计算方案
第一步:指标标准化处理
不同指标的量纲差异极大,需要先统一归一化到0-1区间才能合并计算,各指标处理规则如下:
- Join数量(J):统计全量工作负载中join数量的最大值
max_j、最小值min_j,单条查询的标准化值为J_norm = (当前查询join数 - min_j) / (max_j - min_j) - 过滤条件数量(F):统计全量工作负载中过滤条件数的最大值
max_f、最小值min_f,单条查询的标准化值为F_norm = (当前查询过滤条件数 - min_f) / (max_f - min_f) - 访问表数量(T):统计全量工作负载中访问表数量的最大值
max_t、最小值min_t,单条查询的标准化值为T_norm = (当前查询访问表数 - min_t) / (max_t - min_t) - 涉及表总元组规模(S):先计算单条查询所有访问表的元组数量之和
query_s,再统计全量工作负载的max_s、min_s,单条查询的标准化值为S_norm = (query_s - min_s) / (max_s - min_s) - 查询选择度(Se):选择度本身为0-1区间值(返回结果行数/扫描总行数),选择度越低查询扫描无效数据越多、复杂度越高,因此做反向处理:
Se_norm = 1 - 当前查询选择度
第二步:设置加权系数
可根据业务场景中各因素对查询复杂度的实际影响程度分配权重,所有权重之和需为1,通用场景参考权重如下:
- Join数量权重:0.3(多表关联对查询性能影响最大,权重最高)
- 涉及表总元组规模权重:0.25
- 访问表数量权重:0.2
- 过滤条件数量权重:0.15
- 查询选择度权重:0.1
第三步:最终评分计算
复杂度得分 = 0.3*J_norm + 0.2*T_norm + 0.15*F_norm + 0.25*S_norm + 0.1*Se_norm
得分越高代表查询复杂度越高,直接按得分降序排序即可得到复杂度从高到低的查询列表。
可选优化
如果已有标注好复杂度等级的查询样本,可以用线性回归算法自动拟合最优加权系数,无需手动分配权重,结果会更贴合你的业务实际情况。
内容的提问来源于stack exchange,提问作者Mohammed Ragab
相关产品推荐
相关产品推荐

