数据库如何根据全表 NDV 估算子集的 NDV
以前我们讨论过 数据库如何根据样本的 NDV 来估计总体的 NDV也就是以一个小集合的 NDV 去估算一个更大集合的 NDV但有的时候会反过来会要求用全表的 NDV 要去估算表中某个子集的 NDV什么情况下会用到呢比如在多表关联的时候JOIN 条件的选择率为假设是等值连接j o i n _ s e l e c t i v i t y m i n ( l e f t _ s e l e c t i v i t y , r i g h t _ s e l e c t i v i t y ) join\_selectivitymin(left\_selectivity, right\_selectivity)join_selectivitymin(left_selectivity,right_selectivity)换而言之也就是j o i n _ n d v m a x ( l e f t _ n d v , r i g h t _ n d v ) join\_ndvmax(left\_ndv, right\_ndv)join_ndvmax(left_ndv,right_ndv)但不管是 JOIN 的左支还是右支是可能有本地谓词local predicate的连接时用的 NDV 就不再是全表的 NDV而是经过本地谓词过滤后的子集的 NDV。举个例子SELECTe.employee_id,e.first_name|| ||e.last_nameASfull_name,e.salary,d.department_name,d.location_idFROMemployees eJOINdepartments dONe.department_idd.department_idWHEREd.location_id1700ANDe.salary12008;在计算 e.department_id d.department_id 的 NDV 的时候就不能使用 employees 表和 departments 表的全表 NDV因为这里是经过本地谓词WHERE 条件中过滤后的部分数据那我们如何来估算它呢这个问题可以简单地抽象成一个概率问题N 个 D 种颜色的球不放回的抽取 n 个球里面有多少种d颜色也就是N 表示全量数据的个数D 表示全量数据的 NDVn 表示部分数据的个数d 表示部分数据的 NDV我们要用 N、D、n 来估算 d。在假设数据分布比较均衡的前提下可以按如下方法推导对于某一种颜色的球来说有两种可能一种是落在抽到的子集中一种是落在抽到的子集外落在子集外的概率是1 − n N 1-\frac{n}{N}1−Nn​平均而言每一种颜色的球有N D \frac{N}{D}DN​个所以该种颜色的球全部落在抽到的子集外的概率是( 1 − n N ) N D (1-\frac{n}{N})^{\frac{N}{D}}(1−Nn​)DN​于是该种颜色的球至少有一个落在抽到的子集中的概率就是1 − ( 1 − n N ) N D 1-(1-\frac{n}{N})^{\frac{N}{D}}1−(1−Nn​)DN​一共有 D 种颜色的球落在抽到子集中的颜色种数的数学期望就是d D × ( 1 − ( 1 − n N ) N D ) dD\times(1-(1-\frac{n}{N})^{\frac{N}{D}})dD×(1−(1−Nn​)DN​)看个例子100 个 5 种颜色的球每种颜色 20 个不放回的抽取 10 个球里面有多少种颜色按照上述公式可得d 5 × ( 1 − ( 1 − 0.1 ) 20 ) ≈ 4.4 d5\times(1-(1-0.1)^{20})\approx 4.4d5×(1−(1−0.1)20)≈4.4拿 Excel 做个实验随机 20 次平均 4.65比较接近。如果用D × n N 0.5 D\times\frac{n}{N}0.5D×Nn​0.5来估就会差很多。实际使用上开源的 Apache Impala 就使用了这种方式https://github.com/apache/impala/blob/master/fe/src/main/java/org/apache/impala/planner/AggregationNode.javadoubleperInstanceInputCardMath.ceil((double)inputCardinality/totalInstances);doubleglobalNdvInDouble(double)globalNdv;doubleprobValExist1.0-Math.pow((globalNdvInDouble-1.0)/globalNdvInDouble,perInstanceInputCard);doubleperInstanceNdvMath.ceil(probValExist*globalNdvInDouble);再来看之前的 SQLSELECTe.employee_id,e.first_name|| ||e.last_nameASfull_name,e.salary,d.department_name,d.location_idFROMemployees eJOINdepartments dONe.department_idd.department_idWHEREd.location_id1700ANDe.salary12008;||||ID|OPERATOR|NAME|EST.ROWS|EST.TIME(us)|||----------------------------------------------------------------- |||0|HASHJOIN||3|73||||1|├─TABLERANGE SCAN|D(DEPT_LOCATION_IX)|21|59||||2|└─TABLEFULLSCAN|E|2|9||||D:||table_rows:27||physical_range_rows:21||logical_range_rows:21||index_back_rows:21||output_rows:21|E:||table_rows:107||physical_range_rows:107||logical_range_rows:107||output_rows:2employees 表有 107 条记录department_id 的 NDV11应用本地谓词 e.salary 12008 剩 2 条departments 表有 27 条记录department_id 的 NDV26应用本地谓词 d.location_id 1700 后剩 21 条问优化器如何估算 e.department_id d.department_id 连接后的 NDV、selectivity 和行数套用上述公式也就是n e w _ l e f t _ n d v 11 × ( 1 − ( 1 − 2 107 ) 107 11 ) new\_left\_ndv11\times(1-(1-\frac{2}{107})^{\frac{107}{11}})new_left_ndv11×(1−(1−1072​)11107​) 1.844485 1.8444851.844485n e w _ r i g h t _ n d v 26 × ( 1 − ( 1 − 21 27 ) 27 26 ) new\_right\_ndv26\times(1-(1-\frac{21}{27})^{\frac{27}{26}})new_right_ndv26×(1−(1−2721​)2627​) 20.546978 20.54697820.546978o u t _ r o w s l e f t _ r o w s × r i g h t _ r o w s × 1 m a x ( n e w _ l e f t _ n d v , n e w _ r i g h t _ n d v ) out\_rowsleft\_rows\times right\_rows\times \frac{1}{max(new\_left\_ndv, new\_right\_ndv)}out_rowsleft_rows×right_rows×max(new_left_ndv,new_right_ndv)1​ 2 × 21 × 1 20.546978 2.04409622 2\times 21\times\frac{1}{20.546978}2.044096222×21×20.5469781​2.04409622从 optimizer trace 中也能看到E :rows:2.000000baserows:107.000000statistype: OPTIMIZER version:0used partitions:[502555]normal stat partitions:[]histogram stat partitions:[]DEPARTMENT_ID : NDV:1.844485BASE NDV:11.000000D :rows:21.000000baserows:27.000000statistype: OPTIMIZER version:0used partitions:[502534]normal stat partitions:[]histogram stat partitions:[]DEPARTMENT_ID : NDV:20.546978BASE NDV:26.000000分毫不差。可以推算当 NDV rows 的时候这个方法会更精确。

相关新闻

Office安装神器,流批了

Office安装神器,流批了

今天推荐的这款工具Mocreak,之前也推荐过,一款Office安装部署工具,挺好用的,这次要详细的它的功能。 下载/安装Office Mocreak有两个功能,一个是下载、安装Office,一个是卸载Office,用得最多的就…

2026/10/15 14:46:56 阅读更多 →
SSM+Vue英语学习网站开发全解析

SSM+Vue英语学习网站开发全解析

1. 项目概述 这个基于SSMVue的英语学习网站项目,是我去年指导一位计算机专业毕业生完成的毕业设计作品。整套系统采用前后端分离架构,后端使用经典的SSM框架(SpringSpringMVCMyBatis),前端则采用Vue.js生态链技术栈。项…

2026/10/17 0:10:40 阅读更多 →
HCIA学习笔记(六):IP编址基础概念

HCIA学习笔记(六):IP编址基础概念

一、关于IP地址的认识 1.网络层的主要作用:实现终端节点之间(即点对点end-to-end)的通信。因为是点对点,所以会涉及到IP编址的问题。 2.IP地址在网络中用于标识一个节点,是网络设备接口的属性,当我们需要给…

2026/10/18 9:52:32 阅读更多 →

最新新闻

基于LSTM的蔬菜价格预测:从数据清洗到模型训练的完整指南

基于LSTM的蔬菜价格预测:从数据清洗到模型训练的完整指南

简介:基于深度学习LSTM实现蔬菜价格预测的完整项目资源包,面向Python学习者、数据挖掘爱好者,以及需要进行课程设计、毕业设计或实战项目的人员,覆盖从网页数据采集、数据清洗、时间序列建模到Web与微信公众号结果展示的完整流程。…

2026/10/18 10:11:40 阅读更多 →
GESP一级《交朋友》解题:把朋友关系翻译成计数数组

GESP一级《交朋友》解题:把朋友关系翻译成计数数组

先说个考场现象。每到GESP一级的编程题环节,总有考生在《交朋友》这类题上卡住——不是不会写循环,而是读了三遍题,不知道该从哪儿下手。2026年3月这场认证第三部分的编程题(1)交朋友,题面讲的是“同学参加…

2026/10/18 10:11:40 阅读更多 →
心电信号处理全流程:从滤波、R波识别到心率计算的Python实现与踩坑指南

心电信号处理全流程:从滤波、R波识别到心率计算的Python实现与踩坑指南

简介:面向心电图算法研究与开发的Python工程包,系统覆盖滤波、R波识别、心率计算、特征提取、心律失常分类、房颤与室颤室速识别,以及伪差干扰研究,并配有可视化模块和测试工程。压缩包共91个文件、约30.81MB,包含可直…

2026/10/18 10:11:40 阅读更多 →
NLP文本分类实战:从数据清洗到模型调优的完整流程

NLP文本分类实战:从数据清洗到模型调优的完整流程

做了快三年的自然语言处理落地项目,我最深的感触是:教科书教的是从干净数据到漂亮模型,生产环境给你的却是一堆乱得离谱的原始数据。这个差距,正是"硬核实战"和"课堂Demo"之间真正的分水岭。最近我完整地从零…

2026/10/18 10:11:40 阅读更多 →
差分进化算法MATLAB实现:五种变异策略完整调试样本

差分进化算法MATLAB实现:五种变异策略完整调试样本

简介:差分进化算法MATLAB实现压缩包提供五种典型变异策略的完整代码,面向需要解决非线性、多模态或约束优化问题的工程师与科研人员,也可作为群智能优化算法课程的上手素材。包内共2个m文件,包含DE主程序与目标函数示例&#xff0…

2026/10/18 10:11:40 阅读更多 →
Stable Diffusion跨注意力图实现零样本图像分割的方法与实践

Stable Diffusion跨注意力图实现零样本图像分割的方法与实践

1. 这个思路是怎么来的:当扩散模型撞上分割任务1.1 为什么说AI看图会“瞎猜”:从三个真实痛点说起图像分割在计算机视觉里一直是个很微妙的工作。检测是告诉你“这里有个盒子”,分割是告诉你“这个盒子的边界到底在哪”。前者是粗活&#xff…

2026/10/18 10:10:40 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →