当前位置: 首页 > ai >正文

PostgreSQL(知识片):查询/计算Selectivity(可选性)

一、视图pg_ststs查询可选性

1、当可选性较小时,可以用视图pg_ststs来查询

 表的每一列的MVC(most Common Value)作为一对most_common_vals和most_common_freqs的列存储在pg_ststs视图中。

       (1)most_common_vals:最常见的值。是统计MCVs列表的列;

       (2)most_common_freqs:最常见值的频率。是统计MCV频率的列。

2、举个例子:使用视图pg_ststs来查询Selectivity

       有一个表“countries”,记录了六大洲的信息:Africa、Europe、Asia、“North America”、Oceanic、“South America”,以及每个洲包含的所有国家。

       此时如果使用SQL:SELECT * FROM countries WHERE continent='Asia';那么这个亚洲城市的可选性是多少呢?

计算结果内容如下:

上图第三列就是可选性,即:亚洲名下所有国家的个数占总国家个数的比例。总结:

       与“亚洲”对应的最常见频率值为0.227979。因此,在该估计中使用0.227979作为选择性;

       对于列值可选项很高的情况,就不能使用MCV,则使用目标列的直方图界限值来估计成本。

此时,可以使用视图pg_ststs可以直接对可选性进行查询:

\x
SELECT most_common_vals,most_common_freqs 
FROM pg_stats 
WHERE tablename='countries' 
AND attname='continent';

二、直方图histogram_bounds查询可选性

直方图histogram_bounds是一个值列表,用于将列的值分成大致相等的总体组。

当可选性很高的时候,可以使用此方法来查询。

1、Buckets and histogram_bounds

桶和直方图边界

如上图所示,默认情况下,直方图界限会划分为100个桶, bucket从0开始编号

bucket_0~ bucket_99,0~99就是桶id。每个桶(bucket)存储大约相同数量的元组。

每个桶都有其最小值和最大值(下方对于的数即为其最小值)。直方图界限的值也是相应存储桶的界限。例如,直方图上界的第0个值是1,这意味着它是存储在bucket_0中的元组的最小值;第1个值是100,这是存储在bucket_1中的元组的最小值,依此类推。

2、PG中直方图的计算公式为

Selectivity={ bucket_id + (目标数值-hb[n])/( hb[n+1]-hb[n])} / 桶个数

#bucket_id:where子句中,限定的数值,所在的桶id

#目标数值:where子句中,限定的数值

#hb[n]:where子句中,限定的数值,所在的桶的最小界限值

#hb[n+1]:where子句中,限定的数值,所在桶的下一个桶的最小界限值

#桶个数:一共有多少个桶

SELECT histogram_bounds
FROM pg_stats
WHERE tablename='tbl'
AND attname='data';

3、举个栗子:使用直方图histogram_bounds来查询Selectivity

假设存在图内所示的数据:

使用WHERE data<240来计算选择性(Selectivity)时,公式如下:

bucket_id=2(240在hb(2)里)

目标数值=240

hb[n]=200  (hb(2)桶内的最小值)

hb[n+1]=300   (hb(3)桶内的最小值)

Selectivity={ 2+ (240-200) / (300-200) } / 100 = 0.024

http://www.xdnf.cn/news/14606.html

相关文章:

  • 将两个mp4的文件合并在一起形成新的文件
  • 从0开始学习R语言--Day31--概率图模型
  • 【MV】编排8:基于时间线数据多层分段避免过度拟合特定歌曲
  • 《C++初阶之类和对象》【初始化列表 + 自定义类型转换 + static成员】
  • FunASR搭建语音识别服务和VAD检测
  • 飞算 JavaAI 插件炸场!一小时搭图书管理系统
  • Java并发编程中高效缓存设计的哲学
  • Word2Vec 原理是什么
  • vscode 插件
  • Java底层原理:深入理解JVM内存管理机制
  • C#图书管理系统笔记(残缺版)
  • SQLite3 在嵌入式系统中的应用指南
  • Apache SeaTunnel Spark引擎执行流程源码分析
  • Java SE - 图书管理系统模拟实现
  • 国产麒麟 安装可视化数据库软件DBeaver(图解)
  • 前端开发入门指南:掌握HTML基础
  • 【RK3568 嵌入式linux QT开发笔记】 二维码开源库 libqrencode 交叉静态编译和使用
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DrinkWater(喝水记录组件)
  • DeepSeek中的提示库及其用法示例
  • 用于算法性能预测的 GNN 框架
  • H5新增属性
  • Three.js 中自定义 UV 坐标贴图详解
  • Java数据结构第二十四期:探秘 AVL 树,当二叉搜索树学会 “自我调节”
  • 华为云 Flexus+DeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践
  • 计算机操作系统(十六)进程同步
  • 安全版V4.5密码加密算法由SM3改为MD5
  • 使用Windows自带的WSL安装Ubuntu Linux系统
  • SQLite FTS4全文搜索实战指南:从入门到优化
  • Java基础(三):逻辑运算符详解
  • 【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践