摘要:本文的核心思想是利用预训练语言模型通过语义信息来做开箱即用的NDV估计,已经被SIGMOD25接收,SIGMOD25 Reviewer给出的评价:本文是第一个基于语义信息做NDV估计的工作。
本文的核心思想是利用预训练语言模型通过语义信息来做开箱即用的NDV估计,已经被SIGMOD25接收,SIGMOD25 Reviewer给出的评价:本文是第一个基于语义信息做NDV估计的工作。
论文标题:PLM4NDV: Minimizing Data Access for Number of Distinct Values Estimation with Pre-trained Language Models
论文作者:Xianghong Xu, Xiao He, Tieying Zhang, Rui Shi, Lei Zhang, Jianjun Chen,全部来自字节跳动,第一作者Xianghong Xu来自字节跳动ByteBrain团队,通讯作者Tieying Zhang为ByteBrain团队负责人
论文地址:https://arxiv.org/pdf/2504.00608
Number of Distinct Values(NDV)估计是数据科学领域的基础工作,常用来做统计分析(如数据库SQL优化的基础)。现有的NDV估计方法(无论是统计模型还是学习模型)可以分为基于sketch和基于采样的两类,前者依赖扫描全部数据,开销很大;后者需要随机采样数据,然后根据基于采样数据去计算NDV的值。尽管基于采样的算法相比基于sketch的算法有更低的代价,但是数据采样仍然是整个过程中最耗时、开销最大的环节。如何减少数据采样的量,甚至无需采样就能得到较为准确的NDV是该领域的难题和挑战。
本文目标是设计一个预训练模型,根据数据库schema中蕴含的语义信息而不需要采样数据(或尽量少的进行采样)就可以预测NDV,达到开箱即用的目的。输入是库表schema和统计信息,采样数据为可选项,输出是目标列的NDV(问题形式化参见论文)。也就是说在无需采样数据的情况下,只需要元信息便可以直接预测NDV,从而最大程度上减少采样开销。当然,如果输入提供采样数据,可以让模型预测更加准确。
PLM4NDV 模型架构
整体架构为预训练模型PLM + Self-Attention + MLP。其中PLM可采用BERT模型,参数是frozen的,只用来做语义信息的embedding。Self-attention是用来训练,主要作用是把不同column关联起来,增加信息量。MLP用来做最后的输出(图中的Estimator)。
从架构图中可以看到,初始输入有两部分:1)Semantics部分,主要是每列的metadata(包括列名,列类型,列description),表的metadata(表名,表的description),库的metadata(库名,库的description),其中必须有的信息为列名和列类型,其余为可选项。2)Statistics部分,即传统NDV estimator的输入信息,是通过采样数据后,得到各个column的frequency profile(不同值在采样数据中出现的频率的频率,是NDV估计问题中常用的统计特征,具体定义可以参见论文)。
对于Semantics部分:column name,column type, column description描述的内容均看做字符串,从左到右连成一个大的字符串,作为一列的描述,这一描述作为一个句子,假如一共有10列,那么就是10个句子。对于BERT embedding方法,我们使用sentence embedding,即这10个sentence输入到BERT里,输出为10个embedding向量。Embedding向量再作为输入到self-attention层,输入是self-attention之后的向量(还是10),用self-attention的目的是这10个column的相互影响考虑进去,比如年级和分数的相关性,性别和分数的相关性等。
对于Statistics部分:即frequency profile,是通过采样数据计算后得到的。而这部分是可有可无的,也就是没有采样的话本文的方法依然可以预测出NDV的值。如果有采样数据,就可以得到frequency profile,维度和采样数据保持一致。例如某列采样数据量为100,那么profile的维度为100。
最后,BERT embedding的vector和Self-attention的vector相加,作为semantic的表示,然后和Frequency profile的vector做连接操作(concatenate,如果有的话),输入到MLP层,然后得到该列的NDV。注意:图中最后输出的NDV是一排,仅仅是表示方便(实现起来也可以batch操作),实际上就是一个column的信息作为输入,对应了一个NDV。
训练数据来源为Tablib( https://huggingface.co/datasets/approximatelabs/tablib-v1-sample),经预处理后划分如下,Loss为MSE。
表中数据为Q-error,可以看到,当n=0,即无采样数据的时候,传统方法(统计方法,学习方法)都不能work,因为传统方法必须要有采样数据作为输入,而本文提出的方法PLM4NDV是可以工作的。随着n的提升,即采样数据量的提升,PLM4NDV的效果相比传统方法是最好的,当n=0.01N,即全部数据的1%时,PLM4NDV的Q-error为1.89(越接近1越好)。
PLM4NDV的目的是支持NDV估计的实时性(减少采样开销或无采样),最终需要和无数据Cardinality Estimation联合起来才能真正在数据库查询优化问题落地。另外,还需要what-if optimizer支持,否则无法真正达成数据库查询优化的实时性。
ByteBrain团队介绍
ByteBrain是字节跳动 AI for Infra / AI for System服务平台,旨在利用 AI技术(机器学习、大模型、运筹优化等),对基础架构和系统的全生命周期进行自动优化。优化对象包括:数据库、存储、大数据系统、虚机、容器、网络、运维和稳定性等。ByteBrain 的主要方向为AIOPS、AI4DB、运筹优化、LLM4Infra,功能模块包括容量规划、资源调度、系统调参、异常检测、根因分析、慢SQL优化、Text2SQL、LLM-AGENT 等。ByteBrain团队正在招聘相关方向的研究员和实习生,联系方式:tieying.zhang@bytedance.com
来源:字节跳动技术团队