ClickHouse 发布 24.2 版本
像往常一样,我们特别欢迎所有在 24.2 版中的新贡献者!ClickHouse 的受欢迎程度在很大程度上归功于社区的努力贡献。看到这个社区不断壮大总是令人感到自豪的。 以下是新贡献者的名字: johnnymatthews, AlexeyGrezz, Aris Tritas, Charlie, Fille, HowePa, Joshua Hildred, Juan Madurga, Kirill Nikiforov, Nickolaj Jepsen, Nikolai Fedorovskikh, Pablo Musa, Ronald Bradford, YenchangChan, conicliu, jktng, mikhnenko, rogeryk, una, Кирилл Гарбар_ 提示:如果您想知道我们是如何生成这个列表的...请点击这里(https://gist.github.com/gingerwizard/5a9a87a39ba93b422d8640d811e269e9)。 如果您在这里看到了您的名字,请与我们联系...不过我们也会在 Twitter 等地方找到您。 您也可以在 YouTube 上查看本次版本视频,查看演示文稿的幻灯片。(https://presentations.clickhouse.com/release_24.2/#) 好的,让我们进入功能介绍吧! 由 Pavel Kruglov 贡献 在处理文件时,即使文件没有有效的扩展名,ClickHouse 也会自动检测文件的类型。例如,以下文件 foo 包含了 JSON 行格式的数据:
RogerYK 如果您曾经需要快速解释查询结果中的大数字,那么这个功能就适合您。当您返回单个数字列时,如果该列中的值大于一百万,则可读数量将作为注释显示在值本身旁边。
由 Artem Brustovetskii 贡献 在此版本之前,如果您在表上定义了视图,要想用户访问该视图,他们还需要访问该表。这不是理想的情况,在 24.2 版本中,我们为 CREATE VIEW 查询添加了 SQL SECURITY 和 DEFINER 规范,以解决这个问题。 假设我们有一个公司的工资表,其中包含员工的姓名、部门、工资和地址详情。我们可能希望允许人力资源团队访问所有信息,但也允许其他用户查看员工姓名和部门。 让我们首先创建一个表并填充它:
由 Robert Schulze 贡献 在最近的博客文章中,我们探讨了 ClickHouse 如何在用户需要高性能线性扫描以获得准确结果和/或能够通过 SQL 将向量搜索与元数据过滤和聚合相结合时,作为向量数据库使用。用户可以利用这些功能通过检索增强生成(RAG)流水线为基于 LLM 的应用程序提供上下文。我们在底层支持向量搜索方面的投入继续进行,最近的工作重点是改进计算两个向量之间距离的函数族的性能。有关背景信息,我们建议阅读这篇文章以及我们自己 Mark 的最新视频:(https://www.youtube.com/watch?v=BFtWe2xG5cU) 尽管对于较大的数据集,向量搜索的查询性能很容易受到 I/O 限制,但许多用户只需要搜索适合内存的较小数据集的 SQL。在这些情况下,ClickHouse 中的性能可能会受到 CPU 的限制。因此,确保该代码被适当地矢量化并使用最新的指令集,可以显著提高性能,并将性能限制为内存带宽 - 对于具有 DDR-5 的机器,这意味着更高的扫描性能。 在 24.2 版本中,我们很高兴地宣布,cosineDistance、dotProduct 和 L2Distance(欧几里德距离)函数都已经优化,以利用最新的指令集。对于 x86,这意味着使用了融合乘-加(FMA)和 AVX-512 指令进行水平加-减运算,并针对 ARM 进行了自动矢量化。 作为潜在改进的示例,请考虑以下在几乎正式的 ANN 基准测试中流行的 glove 数据集。这个特定的子集(我们已经提供了 Parquet 格式,大小为 2.5GiB),包含了从 840B CommonCrawl 标记中训练的 2.1m 个向量。该集合中的每个向量都有 300 维,并表示一个单词。鉴于简单的架构,这需要几秒钟加载到 ClickHouse 中:
机器规格: 我们可以通过找到与特定单词的向量最接近的单词,来比较不同版本 ClickHouse 的性能。例如,在 23.12 版本中:
在 24.2 版本中,同样的查询性能提高了超过 25%:
关于点积的一小点说明 在 24.2 版本之前,dotProduct 函数没有被矢量化。在确保这一点尽可能高效的同时,我们注意到该函数还执行了任何常量参数的必要解包操作(最常见的用例即我们传递一个常量向量进行比较),这导致了不必要的内存复制。这意味着实际函数运行时间主要受内存操作的影响 - 在这种情况下,矢量化只是相对较小的收益。一旦消除了这一点,基准测试的性能就提高了惊人的 270 倍! 虽然与以前版本的这个函数进行性能比较并不值得(它们有点令人尴尬 :)),但我们认为利用这些改进的机会可以展示出用户现在可以利用的一个很好的性能优化。 读者可能还记得余弦距离和点积之间的密切关系。更具体地说,余弦距离测量多维空间中两个向量之间的夹角的余弦。它是从余弦相似度导出的,其中余弦距离定义为 1 - 余弦相似度。余弦相似度计算为向量的点积除以它们的大小的乘积,即 1- ((a.b)/||a||||b||)。相反,点积测量两个数字序列的对应条目的乘积的总和,即具有分量 ai 和 bi 的向量 A 和 B 的点积为 A⋅B=∑aibi。 当规范化向量时(即两个向量的大小都为 1 时),余弦距离和点积变得特别相关。在这种情况下,余弦相似度实际上就是点积,因为余弦相似度公式中的分母(向量的大小)都是 1,从而相互抵消。因此,我们的余弦距离简单地变为 1-(a.b)。 我们如何利用这一点? 我们可以在插入时使用 L2Norm 函数(向量大小)对我们的向量进行规范化,从而使我们能够在查询时使用 dotProduct 函数。这样做的主要动机是 dotProduct 函数的计算更简单(我们不必为每个向量计算大小),因此可能节省一些查询时间。 要在查询时执行规范化:
|
版权声明:本文为 clickhouse 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。