---
title: Databend 开源周报第 102 期
description: 本期介绍了为指定列创建 Bloom Index 的新特性，以及 Databend 支持的 SQL 语法与 SQL 标准之间的细微区别。
slug: category-weekly/databend-weekly-102
date: 2023-07-17
tags: [weekly]
category: Weekly
cover_url: 'weekly/weekly-102.jpg'
image: 'weekly/weekly-102.jpg'
contributors:
  - name: ariesdevil
  - name: b41sh
  - name: BohuTANG
  - name: Chasen-Zhang
  - name: dantengsky
  - name: Dousir9
  - name: everpcpc
  - name: flaneur2020
  - name: JackTan25
  - name: lichuang
  - name: PsiACE
  - name: RinChanNOWWW
  - name: SkyFan2002
  - name: soyeric128
  - name: sundy-li
  - name: TCeason
  - name: xudong963
  - name: youngsofun
  - name: zhang2014
  - name: zhyass
authors:
  - DatabendLabs
---

# Databend 开源周报 第 102 期

> 英文版移步：https://www.databend.com/blog/2023-07-16-databend-weekly
>
> [Databend](https://github.com/databendlabs/databend) 是一款现代云数仓。专为弹性和高效设计，为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务：[https://app.databend.cn](https://app.databend.cn) 。

## What's On In Databend

探索 Databend 本周新进展，遇到更贴近你心意的 Databend。

### 为指定列创建 Bloom Index

创建 bloom index 将会消耗大量 CPU 资源。对于仅有少数列涉及点查或者对数据摄入性能比较看重的宽表来说，为所有列都创建 bloom index 可能不是什么好选择。

Databend [Fuse Engine](https://docs.databend.cn/sql/sql-reference/table-engines/fuse) 新增对 `bloom_index_columns` 选项的支持，这意味着你可以按需为指定列创建 bloom index，从而达到查询性能和数据摄入性能之间的平衡。

创建带有 bloom index 的表：

```SQL
CREATE TABLE table_name (
  column_name1 column_type1,
  column_name2 column_type2,
  ...
) ... bloom_index_columns='columnName1[, ...]'.
```

为现存的表创建或修改 bloom index：

<small><i>现有的 bloom index 选项将被新选项替换，另外，不会为现有数据创建 bloom filter。</i></small>

```SQL
ALTER TABLE <db.table_name> SET OPTIONS(bloom_index_columns='columnName1[, ...]');
```

禁用 bloom index：

```SQL
ALTER TABLE <db.table_name> SET OPTIONS(bloom_index_columns='');
```

如果您想了解更多信息，请查看下面列出的资源。

- [PR #12048 | feat: support specify bloom index columns](https://github.com/databendlabs/databend/pull/12048)

### 理解 SQL 一致性

Databend 的设计目标之一是符合 SQL 标准，特别是支持 ISO/IEC 9075:2011，也称为 SQL:2011。虽然目前不是完全百分百符合，但 Databend 已经包含许多 SQL 标准所要求的特性，只是在语法或函数上存在一些轻微差异。

我们最近在文档中添加了一篇摘要，介绍了 Databend 符合 SQL:2011 标准的程度，希望它能帮助你进一步了解 Databend 的 SQL 语法。

如果你想要了解更多信息，请查看下面列出的资源。

- [Docs | SQL Conformance](https://docs.databend.cn/sql/sql-reference/ansi-sql)

{/* truncate */}

## Code Corner

一起来探索 Databend 和周边生态中的代码片段或项目。

### 了解 Databend 重聚类 Pipeline

经过良好聚类的表在某些存储块中仍然可能会变得混乱，从而对查询性能产生负面影响。例如，该表会继续进行 DML 操作（INSERT / UPDATE / DELETE）。

重聚类操作并不是从头开始对表再次聚类，而是基于聚类算法的计算来选择并重新组织现存最混乱的存储块。

重聚类的 pipeline 如下图所示：

```text
┌──────────┐     ┌───────────────┐     ┌─────────┐
│FuseSource├────►│CompoundBlockOp├────►│SortMerge├────┐
└──────────┘     └───────────────┘     └─────────┘    │
┌──────────┐     ┌───────────────┐     ┌─────────┐    │     ┌──────────────┐     ┌─────────┐
│FuseSource├────►│CompoundBlockOp├────►│SortMerge├────┤────►│MultiSortMerge├────►│Resize(N)├───┐
└──────────┘     └───────────────┘     └─────────┘    │     └──────────────┘     └─────────┘   │
┌──────────┐     ┌───────────────┐     ┌─────────┐    │                                        │
│FuseSource├────►│CompoundBlockOp├────►│SortMerge├────┘                                        │
└──────────┘     └───────────────┘     └─────────┘                                             │
┌──────────────────────────────────────────────────────────────────────────────────────────────┘
│         ┌──────────────┐
│    ┌───►│SerializeBlock├───┐
│    │    └──────────────┘   │
│    │    ┌──────────────┐   │    ┌─────────┐    ┌────────────────┐     ┌─────────────────┐     ┌──────────┐
└───►│───►│SerializeBlock├───┤───►│Resize(1)├───►│SerializeSegment├────►│TableMutationAggr├────►│CommitSink│
     │    └──────────────┘   │    └─────────┘    └────────────────┘     └─────────────────┘     └──────────┘
     │    ┌──────────────┐   │
     └───►│SerializeBlock├───┘
```

如果你想要了解更多信息，请查看下面列出的资源。

- [feat(storage): improve optimize and recluster](https://github.com/databendlabs/databend/pull/11850)

## Highlights

以下是一些值得注意的事件，也许您可以找到感兴趣的内容。

- 支持分布式 `COPY INTO` 。
- 阅读文档 [Docs | ATTACH TABLE](https://docs.databend.cn/sql/sql-commands/ddl/table/attach-table) 了解如何将现有的表附加到另一个表上。
- 阅读文档 [Docs | Deepnote](https://docs.databend.cn/guides/visualize/deepnote/) 和 [Docs | MindsDB](https://docs.databend.cn/guides/visualize/mindsdb/) 了解 Databend 如何与你的数据科学项目协同。
- 阅读文档 [Docs | Window Functions](https://docs.databend.cn/sql/sql-functions/window-functions/) 和 [Docs | Bitmap Functions](https://docs.databend.cn/sql/sql-functions/bitmap-functions/) 以全面了解 Databend 支持的 BITMAP 函数和窗口函数。

## What's Up Next

我们始终对前沿技术和创新理念持开放态度，欢迎您加入社区，为 Databend 注入活力。

### 用物化加速 CTE

内联公共表表达式（Common Table Expression，CTE）能够满足大多数情况，但是如果 CTE 像 TPCH Q15 那样比较重，那么完成查询的代价可能会非常高。在这类情况下，最好引入物化来加速 CTE。

```sql
--- TPCH Q15
WITH revenue AS
  (SELECT l_suppkey AS supplier_no,
          sum(l_extendedprice * (1 - l_discount)) AS total_revenue
   FROM lineitem
   WHERE l_shipdate >= TO_DATE ('1996-01-01')
     AND l_shipdate < TO_DATE ('1996-04-01')
   GROUP BY l_suppkey)
SELECT s_suppkey,
       s_name,
       s_address,
       s_phone,
       total_revenue
FROM supplier,
     revenue
WHERE s_suppkey = supplier_no
  AND total_revenue =
    (SELECT max(total_revenue)
     FROM revenue)
ORDER BY s_suppkey;
```

[Issue #12067 | Feature: speed up CTE by materialization](https://github.com/databendlabs/databend/issues/12067)

如果你对这个主题感兴趣，可以尝试解决其中的部分问题或者参与讨论和 PR review。或者，你可以点击 https://link.databend.com/i-m-feeling-lucky 来挑选一个随机问题，祝好运！

## Changelog

前往查看 Databend 每日构建的变更日志，以了解开发的最新动态。

地址：https://github.com/databendlabs/databend/releases
