DuckDB 扩展体系(Extensions)研究摘要
目标版本:DuckDB 1.5.5 资料来源:
duckdb-web-main/docs/current/extensions/与duckdb-web-main/docs/current/core_extensions/下全部 65 个.md文件。 说明:忽略所有 Jekyll frontmatter(--- ... ---)与 Liquid 标签({% ... %}),仅提取真实内容。技术术语保留英文。
目录
- 扩展体系架构
- INSTALL / LOAD / DROP 语法与行为
- Core Extensions 详解
- 社区扩展(Community Extensions)概览
- 版本相关事实(Version-Specific Facts)
1. 扩展体系架构
1.1 内置扩展 vs 可安装扩展
- DuckDB 把功能分成**内置扩展(build-in / statically linked)和可安装扩展(installable / dynamically loaded)**两类。
- 少数扩展被静态链接进二进制,无法在运行时安装/加载/卸载(例如
jemalloc,见 §3.23)。 - 内置到核心、开箱即用的数据格式扩展:
parquet(Parquet 读写)、json(JSON 读写)。它们不是通过仓库下载,而是随二进制一起发布,因此也无需INSTALL/LOAD(尽管显式LOAD也不会报错)。 - 其余扩展默认不随二进制发布,需要
INSTALL(下载 + 校验 + 存储)与LOAD(动态加载进当前实例)。
1.2 列出已安装/可用扩展
duckdb_extensions()表函数返回当前环境可用的扩展信息(名称、状态、安装/加载状态、版本、仓库等)。duckdb_extensions()可用于排查某个扩展是否已 autoload、是否已加载。
1.3 自动加载(Autoloading)
- 多数 core extension 支持 autoloading:首次使用时,DuckDB 会从官方仓库透明地下载并加载(需联网),无需手动
INSTALL/LOAD。 - 文档中明确标注“会被 autoload”的包括:
fts、icu、inet、tpcds、tpch(部分构建内置)、motherduck(autoinstall + autoload)、quack(autoinstall + autoload,实验性)、sqlite、excel、aws、azure、delta、ducklake等。 - 不会被 autoload 的扩展(必须手动
LOAD)包括:spatial、odbc(因为它们依赖外部系统库,例如spatial依赖 GEOS/PROJ/GDAL,odbc依赖 unixODBC/ODBC Driver Manager)。 - 一旦用户显式
INSTALL,之后即使重启,扩展通常已在本地缓存,autoload 不会再触发网络下载。
1.4 扩展仓库(Extension Repositories)
INSTALL 时通过 FROM <repository> 指定仓库来源,默认是 core。可用仓库别名:
| 别名(alias) | 含义 / URL |
|---|---|
core | 官方稳定仓库,URL http://extensions.duckdb.org(默认) |
core_nightly | 每夜构建仓库,URL http://nightly-extensions.duckdb.org |
community | 社区扩展仓库,URL http://community-extensions.duckdb.org |
local_build_debug | 本地调试构建 |
local_build_release | 本地发布构建 |
示例:
INSTALL tarfs FROM community;
INSTALL iceberg FROM core_nightly;1.5 安装位置与配置
- 扩展默认安装到用户目录:
~/.duckdb/extensions/<duckdb_version>/<platform_name>/。 - 可通过配置项自定义:
extension_directory:单个自定义目录。extension_directories:以平台分隔符分隔的多个目录列表(多个搜索路径)。
- 没有
UNINSTALL命令:要“移除”一个扩展只能手动删除其文件。
1.6 版本管理与兼容性(关键规则)
- 扩展二进制与特定的 DuckDB 版本以及平台(platform)严格绑定。版本或平台不匹配会被拒绝加载。
- 仓库中扩展按
Target DuckDB Version组织目录,例如v1.5.5/linux_amd64/。 - 稳定性分级(stability levels):
- unstable:基于 git hash,随每次提交变化,主要用于
core_nightly。 - pre-release:形如
v0.y.z(主版本仍为 0),可能不稳定。 - stable:形如
vx.y.z(x > 0)。官方core仓库发布的扩展通常带 stable 版本号。
- unstable:基于 git hash,随每次提交变化,主要用于
- in-tree(树内)vs out-of-tree(树外):
- in-tree 扩展位于 DuckDB 主仓库(
duckdb/duckdb)中,随主仓库一起版本化、构建与发布(如httpfs、parquet、json、postgres、iceberg、spatial等 core extensions)。 - out-of-tree 扩展位于独立仓库(通常以
duckdb-<name>命名,如duckdb/duckdb-avro、duckdb/duckdb-mysql、duckdb/duckdb-fts),独立版本化。
- in-tree 扩展位于 DuckDB 主仓库(
- 版本兼容性铁律(version-compatibility rule):扩展的二进制是针对某一个具体 DuckDB 版本和某一平台编译的。用错版本(例如用 1.4.0 的扩展去配 1.5.5 的 DuckDB)或错平台(例如
linux_amd64的扩展运行在osx_arm64)会被拒绝。因此升级 DuckDB 后,一般需要用FORCE INSTALL重新拉取匹配新版本的扩展。
1.7 签名(Signed)与未签名(Unsigned)
- 官方仓库(
core、community等)发布的扩展是已签名的,DuckDB 会校验签名。 - 第三方/本地构建的扩展可能未签名。加载未签名扩展需要显式开启:
- 配置:
SET allow_unsigned_extensions = true; - 或启动参数:
-unsigned。
- 配置:
- 注意:部分功能(如
ui扩展的ui_remote_url自定义远程地址)只有在allow_unsigned_extensions开启时才被尊重,因为远程 UI 资源可访问本地数据。
1.8 高级安装方法(Advanced Installation Methods)
- 直接按 URL 安装:可指向 S3/HTTP 上的
duckdb_extension文件,格式类似:sqlINSTALL 'http://example.com/path/to/extension.duckdb_extension'; LOAD 'http://example.com/path/to/extension.duckdb_extension'; - 从本地文件安装/加载:sql这在离线环境、CI、或加载自己编译的扩展时很有用。
INSTALL 'path/to/ext.duckdb_extension'; LOAD 'path/to/ext.duckdb_extension';
1.9 FORCE INSTALL(强制重装)
- 默认
INSTALL若发现本地已有所需版本则跳过。 FORCE INSTALL会忽略本地缓存、重新下载(例如升级 DuckDB 后拉取匹配版本,或从core切回community/夜晚版时):sqlFORCE INSTALL httpfs; FORCE INSTALL iceberg FROM core_nightly;- 也可用于切换仓库来源(例如先用
community,再FORCE INSTALL ... FROM core切回官方仓库)。
1.10 更新与局限
UPDATE EXTENSIONS;语句可尝试更新所有已安装扩展(按当前 DuckDB 版本和仓库)。- 重要局限:
- 已加载的扩展无法卸载(unload)或重新加载(reload)——一旦
LOAD,在当前进程生命周期内一直存在。 - 没有
UNINSTALL命令。 - 扩展与 DuckDB 版本强绑定,跨大版本升级时务必重新
INSTALL(建议FORCE INSTALL)。
- 已加载的扩展无法卸载(unload)或重新加载(reload)——一旦
- 故障排查(troubleshooting):
- 若出现 404,通常是版本/平台不匹配或仓库里没有该平台构建;可手动用浏览器下载对应
duckdb_version/platform下的文件再LOAD '...'。 - 网络受限环境用本地文件或
extension_directories指向预下载目录。
- 若出现 404,通常是版本/平台不匹配或仓库里没有该平台构建;可手动用浏览器下载对应
2. INSTALL / LOAD / DROP 语法与行为
2.1 INSTALL
INSTALL <extension_name>;
INSTALL <extension_name> FROM <repository>;
INSTALL '<url_or_path>'; -- 直接 URL 或本地路径
FORCE INSTALL <extension_name>; -- 忽略缓存,重新下载- 作用:从仓库下载扩展二进制、校验签名、存入本地扩展目录。仅安装不会把它加载进当前实例。
- 不指定
FROM时默认仓库是core。 FORCE用于重装/换源/升级。
2.2 LOAD
LOAD <extension_name>;
LOAD '<url_or_path>'; -- 直接加载网络或本地文件- 作用:把已安装的扩展动态加载到当前 DuckDB 实例,使其函数/类型/表函数/索引方法等生效。
- 对于 autoload 的扩展,首次使用时自动
LOAD,不必手动。 - 对于
spatial、odbc等非 autoload 扩展,必须显式LOAD。 LOAD之后无法在当前进程内卸载。
2.3 DROP EXTENSION(/ 删除扩展状态)
- 文档未提供“卸载已加载扩展”的语句(扩展不可 unload)。
DROP EXTENSION在部分文档语境中用于移除扩展创建的对象(如索引、宏),并非卸载扩展本身。- 真正“移除”扩展 = 删除
~/.duckdb/extensions/...下的文件,且无UNINSTALL命令。
2.4 与 ATTACH 的关系
- 很多扩展(postgres、sqlite、mysql、delta、iceberg、ducklake、unity_catalog、lance、motherduck)通过
ATTACH ... (TYPE <ext>)把外部系统作为“附加数据库(catalog)”暴露给 DuckDB,从而可用标准 SQL 读写外部表。 - 这类扩展通常先
LOAD(或 autoload),再ATTACH。ATTACH时可用SECRET参数引用 Secrets Manager 中存的连接凭据。
3. Core Extensions 详解
共 28 个 core extensions(见
core_extensions/overview.md)。维护方(Maintainer)与支持层级(Support tier):
- Primary:
httpfs、icu、json、parquet- Secondary:其余官方维护扩展
- Third-party(第三方):
lance、motherduck、ui、vortex别名(aliases):
httpfs→http/https/s3;postgres→postgres_scanner;odbc→odbc_scanner;sqlite→sqlite_scanner/sqlite3;mysql→mysql_scanner;unity_catalog→uc_catalog;motherduck→md。
3.1 httpfs(HTTP / S3 / R2 / GCS / Hugging Face 文件系统)
用途:让 DuckDB 能从 HTTP(S)、S3、Cloudflare R2、Google Cloud Storage、Hugging Face 等远程对象存储读取(以及写入)文件。
- autoload:是。首次访问
s3://、https://、hf://等会触发 autoload。 - 别名包含
http/https/s3,所以LOAD httpfs;、LOAD s3;等价。
S3 配置与凭据(s3api)
- 提供
s3secret,常见参数:KEY_ID、SECRET、REGION、ENDPOINT、SESSION_TOKEN、ENDPOINT_URL、URL_STYLE(path或vhost)、USE_SSL等。 - credential_chain provider:支持链式的凭据提供者,包括:
config(~/.aws/credentials)env(环境变量)sts/assume_role(STS 临时凭据、跨账号 AssumeRole)sso(AWS SSO)instance(EC2/ECS 实例元数据)process(外部进程凭据)web_identity(Web Identity / OIDC)
- 例:sql
CREATE SECRET ( TYPE s3, PROVIDER credential_chain, CHAIN config,sts, ASSUME_ROLE_ARN 'arn:aws:iam::123456789012:role/my-role', REGION 'us-east-1' ); - R2 / GCS:通过
ENDPOINT+URL_STYLE='path'或相应厂商端点配置;例如 R2 用endpoint 'https://<acctid>.r2.cloudflarestorage.com',GCS 用endpoint 'https://storage.googleapis.com'(注意 GCS 的 region 处理差异)。
写入(multipart upload)
- 通过 S3 的分块上传(multipart upload)写入大文件,相关调优参数:
s3_uploader_max_parts_per_file:默认 10000s3_uploader_max_filesize:默认 800 GBs3_uploader_thread_limit:默认 50
s3_version_id_pinning:可固定读取某个 S3 对象版本(version id pinning),便于可重复读取。
Legacy 认证
s3api_legacy_authentication.md记录老的s3_region、s3_access_key_id等旧的会话级配置方式,现已建议改用 Secrets Manager。
HTTPS(https.md)
httpsecret 支持:BEARER_TOKEN(Bearer 认证)、EXTRA_HTTP_HEADERS(自定义请求头)。- 支持代理(proxy)与自定义 CA 证书(custom certificate)。
Hugging Face(hugging_face.md)
- 通过
hf://协议读取 Hugging Face 数据集/文件,例如:sqlSELECT * FROM 'hf://datasets/.../data.parquet' LIMIT 10; - 可用 HF token secret 访问私有仓库。
3.2 parquet(内置)
- 内置扩展,开箱即用,无需
INSTALL/LOAD。 - 提供
read_parquet、COPY ... TO 'x.parquet'、以及parquet_metadata/parquet_schema/parquet_file_metadata等函数。 - 支持 filter/project pushdown、并行读取、Hive 分区、多文件 glob、S3/HTTP 直读。
3.3 json(内置)
- 内置扩展,开箱即用。
- 提供
read_json、read_json_auto、json/json_extract系列函数、to_json/json_serialize、json_object/json_array等。 - 支持自动推断 schema、嵌套 JSON、line-delimited JSON(NDJSON)。
3.4 postgres
用途:把运行中的 PostgreSQL 数据库作为外部 catalog 附加到 DuckDB,直接读取/写入 PostgreSQL 表。
- autoload:首次使用相关函数/
ATTACH时触发。 - 别名:
postgres_scanner。
连接与 ATTACH
ATTACH '' AS postgres_db (TYPE postgres);
-- 早期写法 postgres_attach(...) 已废弃,推荐用 ATTACH- 凭据可用
TYPE postgressecret 存储(支持 AWS RDS IAM 认证;secret 可存入 PostgreSQL 的duckdb_secrets表实现跨会话持久化)。 - 相关设置(settings)表:控制 pushdown、事务、类型映射等。
关键函数
postgres_query(attached_db, query):在 PostgreSQL 侧执行只读查询,结果返回 DuckDB。postgres_execute(attached_db, query):在 PostgreSQL 侧执行任意语句(含 DDL/DML)。postgres_clear_cache():清除 schema 缓存(当外部 schema 变化后)。
连接池(connection_pool)
- 通过连接池复用 PostgreSQL 连接;可配置池大小、空闲超时、最大存活时间、获取模式(
force/wait/try)、reaper 线程、线程本地缓存等。
版本相关事实(v1.5.5)
- v1.5.5 新增自动检测 schema 变化:设置
pg_staleness_query_enabled(BOOLEAN,默认FALSE)。启用后,DuckDB 可通过周期性查询判断缓存的 PostgreSQL schema 是否过期,从而自动失效(来自duckdb/duckdb-postgres#514)。默认关闭以保持向后兼容。
3.5 iceberg
用途:读取(及部分写入)Apache Iceberg 表。两种访问模式:
- Path-based(只读):
iceberg_scan('path/to/metadata.json')直接读本地/S3 上的 Iceberg 元数据文件。 - Catalog-based(读写):
ATTACH ... (TYPE iceberg, ENDPOINT_TYPE ...)连接 Iceberg REST Catalog 后进行读写。
- autoload:是(首次访问 Iceberg 相关函数时)。
关键函数
iceberg_scan(metadata_file):按 metadata 文件读取快照。iceberg_metadata('table_or_metadata'):读取表元数据。iceberg_snapshots('table_or_metadata'):列出快照。iceberg_table_properties/set_iceberg_table_properties/remove_iceberg_table_properties:表属性查看/设置/删除。iceberg_to_ducklake(...):把 Iceberg catalog 迁移/复制到 DuckLake(互操作)。
选项(iceberg_options)
format-version:可指定 2 或 3。- 分区变换(partition transforms):
identity、year/month/day/hour、bucket(n, col)、truncate(n, col)。 PARTITIONED BY (...)建表,ALTER TABLE ... SET PARTITIONED BY (...)改分区。
REST Catalogs(iceberg_rest_catalogs)
- 通过
ATTACH选项接入 Iceberg REST Catalog,支持兼容性标志(compatibility flags)。 - 支持的 catalog 后端(
catalogs.md):- S3 Tables(Amazon S3 Tables,实验性):
ENDPOINT_TYPE s3_tables - AWS Glue / SageMaker Lakehouse(实验性):
ENDPOINT_TYPE glue - Cloudflare R2
- Polaris(Apache Polaris)
- Lakekeeper
- BigLake(Google Biglake)
- S3 Tables(Amazon S3 Tables,实验性):
- 写入必须通过已附加的 REST catalog;path-based
iceberg_scan只读。
写入(writing / writing_to_iceberg)
- 创建 schema/table、INSERT、UPDATE、DELETE、MERGE INTO、ALTER TABLE(加/删/改名/改类型列)均支持。
COPY FROM DATABASE duckdb_db TO my_catalog与反向复制可做深度拷贝。- V3 spec 支持(v1.5.5):支持
VARIANT、TIMESTAMP_NS、默认值(default values)、binary deletion vectors。 - UPDATE/DELETE 限制:
- 只支持 positional delete 文件,不支持 copy-on-write。
- 只支持 merge-on-read 语义;若表把
write.update.mode/write.delete.mode设为非merge-on-read则失败。 - 只能作用于**非排序(non-sorted)**表。
- 分区表的
write.target-file-size-bytes与write.parquet.row-group-size-bytes不被遵守(会报错,除非设置ignore_target_file_size_for_partitioned_tables/ignore_row_group_size_for_partitioned_tables)。 GEOGRAPHY/UNKNOWN类型计划于 v2.0.0 支持。
3.6 spatial
用途:地理空间(GIS)函数与类型,基于 GEOS、PROJ、GDAL。
- autoload:否——必须显式
LOAD spatial;(因为依赖外部系统库,无法 autoload)。 functions.md提供大量ST_*标量函数(如ST_Area、ST_AsText、ST_Buffer、ST_Distance、ST_Within、ST_Transform等)与若干聚合函数。- 注:该文件输出很大(函数清单完整),实际使用时按
ST_前缀查找即可。
- 注:该文件输出很大(函数清单完整),实际使用时按
- GDAL 集成(gdal.md):
ST_Read(...)读取数十种矢量/栅格格式;COPY ... FORMAT gdal导出到 GDAL 支持的格式。
R-Tree 空间索引(r-tree_indexes)
- 可建 R-Tree 索引加速空间查询:sql
CREATE INDEX idx ON tbl USING RTREE (geom); - 参数
max_node_capacity:默认 128。 - 诊断:
rtree_index_dump(...)查看索引结构。
3.7 odbc
用途:通过 ODBC 驱动访问任意支持 ODBC 的 DBMS(SQL Server、Oracle、MySQL、Access 等)。
- autoload:否——必须显式
LOAD odbc;。 - Linux/macOS 需系统安装 unixODBC(ODBC Driver Manager);Windows 用系统 ODBC。
- 版本无关 C API(nightly 版):nightly 构建使用与版本无关的 ODBC C API,同一二进制可用于 1.2.0 及以后所有版本(这是 odbc 扩展相对早期仅匹配单版本的改进,降低重装负担)。
- DBMS 类型分层(tiers):不同数据库的能力/类型映射分三档支持度。
关键函数(functions.md)
odbc_connect(connection_string):建立连接返回连接句柄。odbc_query(handle, query):执行查询返回表。odbc_copy(handle, query, table):把查询结果写入 DuckDB 表。odbc_close(handle):关闭连接。odbc_begin_transaction(handle)/odbc_commit(handle)/odbc_rollback(handle):事务控制。odbc_create_params(...)/odbc_bind_params(...):参数化查询。odbc_list_drivers()/odbc_list_data_sources():列出系统已配置驱动与数据源。
3.8 sqlite
用途:把 SQLite 数据库文件作为外部 catalog 附加,直接读写。
- autoload:是。别名
sqlite_scanner/sqlite3。 - 用法:sql
ATTACH 'file.db' AS my_sqlite (TYPE sqlite); - 类型亲和(type affinity)规则:SQLite 的存储类(INTEGER/REAL/TEXT/BLOB/NULL)映射到 DuckDB 类型;提供
sqlite_all_varchar选项把所有列读成VARCHAR(应对脏数据)。 - Turso 兼容:可与 Turso(libSQL)数据库文件配合。
3.9 excel
用途:读写 Excel(.xlsx)文件。
- autoload:是。
- 读取:
excel_text/text(把单元格文本读出)、read_xlsx(...)。 - 写入:
COPY ... TO 'out.xlsx' (FORMAT xlsx)。 - 限制:
.xls(旧版二进制格式)不支持,仅支持.xlsx(Office Open XML)。
3.10 aws
用途:AWS 凭据与服务的 Secrets Manager 集成(S3、Glue、S3 Tables、RDS 等)。
- autoload:是。
credential_chain提供多种 provider:config、env、sts、sso、instance、process、web_identity(详见 §3.1)。- 新增 rds secret type:支持 AWS RDS IAM 认证(用 IAM 令牌连接 RDS/PostgreSQL/MySQL)。
- 凭据自动刷新(auto-refresh):临时凭据过期前自动续期。
3.11 azure
用途:Azure Blob Storage / Data Lake Storage(ADLS)访问。
- autoload:是。
- 支持协议 scheme:
az/azure/abfss。 - 凭据 provider:
CONFIG、credential_chain、managed_identity、service_principal。 - Blob vs ADLS globbing:ADLS Gen2 支持递归通配(
/**),Blob 的 glob 语义略有差异,文档给出注意点。
3.12 delta
用途:读取 Delta Lake 表(基于 delta-kernel-rs)。
- autoload:是。
- 读取:
delta_scan('path');ATTACH ... (TYPE delta)。 - Time travel:
SELECT * FROM tbl AT (VERSION => n)或按时间戳。 - 平台:仅 Linux/macOS/Windows 的 AMD64(
linux_amd64、linux_arm64也支持)。 - 辅助函数:
delta_list_files、delta_set_transaction_version。 - 注:
unity_catalog(见 §3.27)构建在delta之上。
3.13 ducklake
用途:DuckLake——DuckDB 原生的湖仓(lakehouse)格式,元数据与数据分离存储。
- autoload:是。
- 用法:sql
ATTACH 'ducklake:metadata.ducklake' AS my_ducklake (DATA_PATH 's3://bucket/data'); - 提供
ducklake_*系列函数(管理快照、表、schema 等)。 - 版本相关事实:DuckLake 1.0 于 2026 年 4 月发布。
- 与 Iceberg 互操作:
iceberg_to_ducklake(...)。
3.14 vss(Vector Similarity Search,实验性)
用途:向量相似度搜索,基于 HNSW 索引。
- 实验性(experimental)。
- 建索引:sql
CREATE INDEX idx ON vec_tbl USING HNSW (vec); - 距离度量(metrics):
l2sq(欧氏平方)、cosine(余弦)、ip(内积)。 - 相关函数:
vss_join、vss_match。 - 仅支持 FLOAT 向量(不支持其他数值类型)。
- 持久化实验开关:
hnsw_enable_experimental_persistence(索引持久化仍为实验特性)。
3.15 autocomplete
- 为 CLI 客户端提供自动补全;CLI 默认随附该扩展。
- 函数:
sql_auto_complete(query_string)返回补全建议(列suggestion、suggestion_start)。
3.16 avro
- 读取 Apache Avro 文件:
read_avro('x.avro'),支持 HTTP/S3 直读、glob、文件名列(filename=true)。 - 2024 年底作为社区扩展发布,2025 年初成为 core extension。
- 限制:
- 单文件/多文件读取不并行;
- 无 projection/filter pushdown(计划中);
- 不支持 Wasm 与 Windows-MinGW 构建;
- DuckDB 无法表达 Avro 的递归类型定义;
- 不支持
union_by_name标志。
3.17 encodings
- 让 CSV 读取支持 1000+ 字符编码(基于 ICU 字符集数据)。
- 用法:
FROM read_csv('x.csv', encoding = 'shift_jis'); - 完整编码清单含
utf-8、utf-16、big5、gb18030、EUC_CN、CP1252、windows-1251-2000、shift_jis等上千项(见原文件长表)。
3.18 fts(Full-Text Search)
- 类 SQLite FTS5 的全文检索。
- autoload:是(
fts扩展)。 - 用法:sql
PRAGMA create_fts_index('documents', 'document_identifier', 'text_content', 'author'); -- 检索 SELECT *, fts_main_documents.match_bm25(document_identifier, 'small cats') AS score FROM documents WHERE score IS NOT NULL ORDER BY score DESC; - 参数:stemmer(porter/english/.../none)、stopwords、ignore 正则、
strip_accents、lower、overwrite。 PRAGMA drop_fts_index('table')删除索引;stem(str, stemmer)内部宏。- 限制:索引不会随基表变更自动更新,需重建。
3.19 icu
- 提供 ICU 库的**排序规则(collations)与时区(time zones)**支持。
- autoload:是(首次使用区域相关排序或时区时)。
3.20 inet
- 定义
INET数据类型,存储 IPv4/IPv6 及 CIDR 子网。 - autoload:是。
- 函数/操作符:
HOST()、netmask()、network()、broadcast();谓词<<=(被包含)、>>=(包含);支持整数加减 IP。 - 另提供
html_escape/html_unescape。
3.21 jemalloc
- 静态链接扩展,替代系统内存分配器;不能运行时安装/加载。
- Linux:随发行版自带;
GEN=ninja SKIP_EXTENSIONS="jemalloc" make可禁用。 - macOS:默认不带,需
BUILD_JEMALLOC=1 make自行构建。 - Windows:不可用。
- 配置:
DUCKDB_JE_MALLOC_CONF环境变量;SET allocator_background_threads = true;开启后台线程异步回收。
3.22 lance
- 读取/写入 Lance 数据集(面向 ML/AI 的 lakehouse 格式,原生云存储)。
- 第三方维护(lance-format/lance-duckdb)。
- 读写:
SELECT * FROM 'x.lance';COPY (...) TO 'x.lance' (FORMAT lance, MODE 'overwrite'|'append')。 ATTACH 'dir' AS ns (TYPE lance)后可用CREATE TABLE/ CTAS。- 向量搜索:
lance_vector_search(...);全文:lance_fts(...);混合:lance_hybrid_search(...)。 - 平台:
linux_amd64、linux_arm64、osx_arm64、windows_amd64。
3.23 motherduck
- 连接 MotherDuck(云端 DuckDB 数仓)。
- autoload:是(autoinstall + autoload);别名
md。 - 用法:
ATTACH 'md'; - 平台:
linux_amd64、linux_arm64、osx_amd64、osx_arm64、windows_amd64(windows_arm64暂不支持)。
3.24 mysql
- 直接读写运行中的 MySQL 实例(类比 postgres 扩展)。
- autoload:首次使用时。
- 连接:
ATTACH 'host=localhost user=root port=0 database=mysql' AS mysqldb (TYPE mysql);(别名mysql_scanner)。 - 凭据可用
TYPE mysqlsecret(支持命名 secret、持久 secret、SSL 参数ssl_mode等)。 - 支持操作:
CREATE TABLE、INSERT、SELECT、COPY(含COPY FROM DATABASE)、UPDATE、DELETE、ALTER TABLE、DROP、CREATE VIEW、CREATE/DROP SCHEMA、事务。 - 函数:
mysql_query(attached_db, query)、mysql_execute(attached_db, query)、mysql_clear_cache()。 - 设置项丰富:
mysql_bit1_as_boolean、mysql_tinyint1_as_boolean、mysql_enable_filter_pushdown、mysql_pool_*、mysql_session_time_zone、mysql_time_as_time等。 - 注意 MySQL 的 DDL 非事务性。
3.25 quack
- 支持 Quack remote protocol(远程查询协议)。
- autoload:是(实验性,beta)。
- 版本相关事实:自 v1.5.3 起处于实验状态,协议/函数名/实现都可能变;预计 v2.0.0(计划 2026 年 9 月)达到稳定。
3.26 sqlsmith
- 测试用途:注册
sqlsmith、fuzzyduck、reduce_sql_statement、fuzz_all_functions等函数,用于模糊测试 SQL 路径。
3.27 tpch
- TPC-H 基准的数据生成器与查询。
- 部分构建默认内置,否则 autoload。
CALL dbgen(sf = 1);生成数据;PRAGMA tpch(4);跑固定查询;tpch_queries()/tpch_answers()列出查询与预期答案。- 预生成数据集可从 blobs.duckdb.org 下载(sf1 ~ sf3000)。
3.28 tpcds
- TPC-DS 基准的数据生成器与查询。
- autoload:是。
CALL dsdgen(sf = 1);;PRAGMA tpcds(8);;tpcds_queries()/tpcds_answers()。- 版本相关事实:v2.0 起 tpcds 扩展将变更以兼容 TPC-DS version 4(见
duckdb/duckdb#21746)。当前 v1.x 生成的预生成数据集与 v2.x 略有差异。
3.29 ui
- 由 MotherDuck 维护的本地 DuckDB 图形界面(嵌入 HTTP 服务器,默认
http://localhost:4213)。 - 启动:
duckdb -ui或CALL start_ui();;CALL start_ui_server();仅起服务不弹浏览器;CALL stop_ui_server();停止。 - 默认完全本地执行,数据不出本机;接入 MotherDuck 需显式登录。
- 配置:
ui_local_port(默认 4213)、ui_remote_url(默认https://ui.duckdb.org,仅allow_unsigned_extensions时尊重自定义值)、ui_polling_interval(默认 284 ms)。 - 不支持
windows_arm64;只读数据库上运行 UI 不支持(需用另一个 db 文件 +ATTACH ... READ_ONLY)。
3.30 unity_catalog
- 在 Delta Lake 格式与 DuckDB
delta扩展之上,支持 Unity Catalog(Databricks / OSS)。 TYPE unity_catalogsecret:TOKEN、ENDPOINT、AWS_REGION。- 支持:
SHOW ALL TABLES、SELECT、time travelAT (VERSION => ...)、INSERT、CALL unity_catalog_checkpoint_table(...)、Catalog-Managed Commits(CCv2,透明使用)。 - 不支持:
DELETE/UPDATE、CREATE TABLEDDL(CMC 表须由 Spark/UC CLI 先建)。 - 平台:
linux_amd64、linux_arm64、osx_amd64、osx_arm64、windows_amd64(与delta相同,仅 AMD64/ARM64,无windows_arm64)。
3.31 vortex
- 读写 Vortex 文件格式。
- 第三方维护(vortex-data/duckdb-vortex)。
- 读:
SELECT * FROM read_vortex('x.vortex');;写:COPY (...) TO 'x.vortex' (FORMAT vortex);(务必带FORMAT vortex,否则退化为 CSV)。 - 平台:仅 Linux(
linux_amd64、linux_arm64)与 macOS(osx_amd64、osx_arm64)。
4. 社区扩展(Community Extensions)概览
- 社区扩展仓库(
community,URLhttp://community-extensions.duckdb.org)自 2024 年夏 起可用。 - 由社区(非 DuckDB 核心团队)维护、独立版本化、独立仓库(out-of-tree),例如
tarfs、avro(先社区后转正为 core)、quack、lance、vortex、unity_catalog等。 - 使用:sql
INSTALL tarfs FROM community; LOAD tarfs; - 社区扩展同样受签名校验;从
community仓库安装需联网且版本匹配当前 DuckDB(见 §1.6 版本兼容性铁律)。 - 注意:从
community安装后若想切回core,使用FORCE INSTALL ... FROM core(§1.9)。
5. 版本相关事实(Version-Specific Facts)
以下为面向 DuckDB 1.5.5 写作本书时必须标注的版本相关要点:
扩展加载模型(loading model)
- 两阶段:
INSTALL(下载+校验+存本地)与LOAD(动态加载进实例)。多数 core 扩展首次使用自动加载;spatial、odbc因依赖外部库必须手动LOAD。 - 已加载扩展无法 unload/reload,无
UNINSTALL命令。 - 无网络/离线场景:可用
INSTALL/LOAD '<url_or_path>'或extension_directories指向预下载文件。
- 两阶段:
版本兼容性铁律(version-compatibility rule)
- 扩展二进制绑定具体 DuckDB 版本 + 平台(
~/.duckdb/extensions/<duckdb_version>/<platform>/)。 - 跨版本(尤其跨主版本)须重新
INSTALL,推荐FORCE INSTALL。 - 升级 DuckDB 后旧版扩展会被拒绝加载。
- 扩展二进制绑定具体 DuckDB 版本 + 平台(
v1.5.5 具体新增/变更
- postgres:新增
pg_staleness_query_enabled(BOOLEAN,默认FALSE),实现自动检测 PostgreSQL schema 变化、自动失效缓存(duckdb-postgres#514)。 - iceberg:支持 V3 spec(VARIANT、TIMESTAMP_NS、默认值、binary deletion vectors);写入仅支持 positional delete + merge-on-read,且受限于非排序表;
GEOGRAPHY/UNKNOWN计划于 v2.0.0。 - ducklake:DuckLake 1.0 于 2026 年 4 月发布。
- quack:自 v1.5.3 起实验性,协议不稳定,预计 v2.0.0(2026-09)稳定。
- odbc:nightly 使用版本无关 C API,同一二进制兼容 1.2.0+。
- tpcds:将在 v2.0 变更为兼容 TPC-DS v4(生成数据会与 v1.x 略有差异)。
- postgres:新增
平台注意事项
windows_arm64不被motherduck、ui、unity_catalog/delta支持;vortex仅 Linux/macOS;avro不支持 Wasm/MinGW;encodings依赖 ICU。- 签名:官方仓库扩展已签名;加载未签名扩展需
allow_unsigned_extensions或-unsigned。
备注:本摘要已覆盖
extensions/与core_extensions/下全部 65 个.md文件(含 httpfs/postgres/iceberg/spatial/odbc 子目录)。json与parquet为内置扩展,其文档位于docs/data/而非本目录树,本书相关章节应另行引用docs/data/json.md与docs/data/parquet.md。