数据库如何根据全表 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/8/10 9:04:00 阅读更多 →
SSM+Vue英语学习网站开发全解析

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

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

2026/8/10 9:04:00 阅读更多 →
HCIA学习笔记(六):IP编址基础概念

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

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

2026/8/10 9:04:00 阅读更多 →

最新新闻

高效算法练习:提升程序员核心竞争力的系统方法

高效算法练习:提升程序员核心竞争力的系统方法

1. 算法练习的价值与意义 每天坚持算法练习是程序员提升核心竞争力的有效途径。2026-1-18这个看似普通的日期背后,反映的正是一位开发者持续精进的决心。算法作为计算机科学的基石,其重要性不言而喻 - 无论是面试大厂、参与竞赛,还是解决实际…

2026/8/10 9:56:23 阅读更多 →
区块链与Web3:去中心化的互联网

区块链与Web3:去中心化的互联网

【810】区块链与Web3:去中心化的互联网 你有没有这种感觉: 网上身份、资产都掌握在大公司手里,他们随时可以封你的号、冻结你的资产。 Web3就是来解决这个问题的——把数据和资产还给用户。 什么是Web3? Web3是基于区块链技术的去中心化互联网。 互联网演进: ┌──…

2026/8/10 9:56:23 阅读更多 →
轻松学习yocto: 10-Yocto 学习路线

轻松学习yocto: 10-Yocto 学习路线

到此, 我可以重建core-image-minimal 带有ssh-dropbear, pi image IP设置好了, windows也可以用putty 连接pi2, 接下来我学什么? 你现在其实已经跨过了一个非常重要的坎:你不再只是“会编译 Yocto”,而是已经能从 reci…

2026/8/10 9:56:23 阅读更多 →
工业物联网时序数据库选型与实践指南

工业物联网时序数据库选型与实践指南

1. 工业IoT场景下的时序数据挑战在工业物联网领域,设备产生的数据具有典型的时序特性——每台机床、传感器、PLC控制器都在以固定间隔生成带时间戳的状态数据。某汽车制造厂的实践显示,一条焊接产线每小时就能产生超过200万条数据点,包含电流…

2026/8/10 9:56:23 阅读更多 →
Codex Security 深度解析:当 LLM Agent 开始接管代码安全审计

Codex Security 深度解析:当 LLM Agent 开始接管代码安全审计

🌊 专注 AI 大模型与前沿科技深度解析,习惯从工程师视角拆解技术热点,让我们一起在技术浪潮中保持清醒与好奇 🚀Codex Security 深度解析:当 LLM Agent 开始接管代码安全审计 过去十年,应用安全领域一直被一…

2026/8/10 9:56:23 阅读更多 →
GPU算力瓶颈下,Hugging Face模型高效部署与成本优化实战指南

GPU算力瓶颈下,Hugging Face模型高效部署与成本优化实战指南

如果你最近在尝试运行一个开源大模型,或者想微调自己的LLM,大概率会碰到同一个问题: GPU不够用 。这不仅仅是个人开发者面临的困境,连Hugging Face这样的AI基础设施巨头,其CEO Clement Delangue最近也被曝出亲赴西雅…

2026/8/10 9:55:23 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/10 1:05:29 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 1:05:29 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/10 1:05:29 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/10 1:05:29 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →