⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
Pragmas

PRAGMA 语句是 DuckDB 从 SQLite 采纳的一种 SQL 扩展。PRAGMA 语句的发布方式与常规 SQL 语句类似。PRAGMA 命令可以更改数据库引擎的内部状态,并可能影响引擎后续的执行或行为。

为选项赋值的 PRAGMA 语句也可以使用 SET 语句来发布,并且可以使用 SELECT current_setting(option_name) 来获取选项的值。

有关 DuckDB 内置配置选项的信息,请参阅配置参考。DuckDB 扩展可能会注册额外的配置选项。这些选项记录在相应扩展的文档页面中。

本页面包含支持的 PRAGMA 设置。

元数据

模式信息 (Schema Information)

列出所有数据库

PRAGMA database_list;

列出所有表

PRAGMA show_tables;

列出所有表并提供额外信息,类似于 DESCRIBE

PRAGMA show_tables_expanded;

列出所有函数

PRAGMA functions;

对于针对不存在的模式的查询,DuckDB 会生成“did you mean…”(您是指……吗)样式的错误消息。当有成千上万个附加数据库时,这些错误可能需要很长时间才能生成。要限制 DuckDB 检查的模式数量,请使用 catalog_error_max_schemas 选项

SET catalog_error_max_schemas = 10;

表信息 (Table Information)

获取特定表的信息

PRAGMA table_info('table_name');
CALL pragma_table_info('table_name');

table_info 返回有关名为 table_name 的表的列信息。返回表的具体格式如下所示

cid INTEGER,        -- cid of the column
name VARCHAR,       -- name of the column
type VARCHAR,       -- type of the column
notnull BOOLEAN,    -- if the column is marked as NOT NULL
dflt_value VARCHAR, -- default value of the column, or NULL if not specified
pk BOOLEAN          -- part of the primary key or not

数据库大小 (Database Size)

获取每个数据库的文件和内存大小

PRAGMA database_size;
CALL pragma_database_size();

database_size 返回有关每个数据库的文件和内存大小的信息。返回结果的列类型如下所示

database_name VARCHAR, -- database name
database_size VARCHAR, -- total block count times the block size
block_size BIGINT,     -- database block size
total_blocks BIGINT,   -- total blocks in the database
used_blocks BIGINT,    -- used blocks in the database
free_blocks BIGINT,    -- free blocks in the database
wal_size VARCHAR,      -- write ahead log size
memory_usage VARCHAR,  -- memory used by the database buffer manager
memory_limit VARCHAR   -- maximum memory allowed for the database

存储信息 (Storage Information)

获取存储信息

PRAGMA storage_info('table_name');
CALL pragma_storage_info('table_name');

此调用返回给定表的以下信息

名称 类型 描述
行组 ID BIGINT  
列名 (column_name) VARCHAR  
列 ID BIGINT  
column_path(列路径) VARCHAR  
segment_id(段 ID) BIGINT  
segment_type(段类型) VARCHAR  
start(起始行 ID) BIGINT 此块的起始行 ID
count BIGINT 此存储块中的条目数量
compression VARCHAR 用于此列的压缩类型 – 请参阅“DuckDB 中的轻量级压缩”博客文章
stats(统计信息) VARCHAR  
has_updates(是否有更新) BOOLEAN  
persistent(持久化) BOOLEAN 如果是临时表,则为 false
block_id(块 ID) BIGINT 除非是持久化的,否则为空
block_offset(块偏移量) BIGINT 除非是持久化的,否则为空

更多信息请参阅存储 (Storage)

显示数据库 (Show Databases)

以下语句等同于 SHOW DATABASES 语句

PRAGMA show_databases;

资源管理

内存限制

设置缓冲区管理器的内存限制

SET memory_limit = '1GB';

警告:指定的内存限制仅适用于缓冲区管理器。对于大多数查询,缓冲区管理器处理绝大多数已处理的数据。然而,某些内存内数据结构(如 向量 和查询结果)是在缓冲区管理器之外分配的。此外,具有复杂状态的 聚合函数(例如 listmodequantilestring_aggapprox 函数)也会使用缓冲区管理器之外的内存。因此,实际内存消耗可能高于指定的内存限制。

线程

设置并行查询执行的线程数

SET threads = 4;

排序规则

列出所有可用的排序规则 (Collations)

PRAGMA collations;

将默认排序规则设置为可用规则之一

SET default_collation = 'nocase';

NULL 的默认排序

将 NULL 的默认排序设置为 NULLS_FIRSTNULLS_LASTNULLS_FIRST_ON_ASC_LAST_ON_DESCNULLS_LAST_ON_ASC_FIRST_ON_DESC

SET default_null_order = 'NULLS_FIRST';
SET default_null_order = 'NULLS_LAST_ON_ASC_FIRST_ON_DESC';

将默认结果集排序方向设置为 ASCENDING(升序)或 DESCENDING(降序)

SET default_order = 'ASCENDING';
SET default_order = 'DESCENDING';

按非整数文字排序

默认情况下,不允许按非整数文字排序

SELECT 42 ORDER BY 'hello world';
-- Binder Error: ORDER BY non-integer literal has no effect.

要允许此行为,请使用 order_by_non_integer_literal 选项

SET order_by_non_integer_literal = true;

隐式转换为 VARCHAR

在 0.10.0 版本之前,DuckDB 在函数绑定期间会自动允许任何类型隐式转换为 VARCHAR。因此,例如无需显式转换即可计算整数的子字符串。对于 v0.10.0 及更高版本,需要使用显式转换。要恢复到执行隐式转换的旧行为,请将 old_implicit_casting 变量设置为 true

SET old_implicit_casting = true;

Python:扫描所有 Dataframe

在 1.1.0 版本之前,DuckDB 在 Python 中的 替换扫描机制 (replacement scan mechanism) 会扫描全局 Python 命名空间。要恢复到这种旧行为,请使用以下设置

SET python_scan_all_frames = true;

关于 DuckDB 的信息

版本

显示 DuckDB 版本

PRAGMA version;
CALL pragma_version();

平台

platform 返回当前 DuckDB 可执行文件所编译平台的标识符,例如 osx_arm64。此标识符的格式与扩展加载说明中描述的平台名称相匹配

PRAGMA platform;
CALL pragma_platform();

用户代理 (User Agent)

以下语句返回用户代理信息,例如 duckdb/v0.10.0(osx_arm64)

PRAGMA user_agent;

元数据信息

以下语句返回有关元数据存储的信息(block_idtotal_blocksfree_blocksfree_list

PRAGMA metadata_info;

进度条

运行查询时显示进度条

PRAGMA enable_progress_bar;

PRAGMA enable_print_progress_bar;

不显示运行查询的进度条

PRAGMA disable_progress_bar;

PRAGMA disable_print_progress_bar;

EXPLAIN 输出

EXPLAIN 的输出可以配置为仅显示物理计划。

EXPLAIN 的默认配置

SET explain_output = 'physical_only';

仅显示优化后的查询计划

SET explain_output = 'optimized_only';

显示所有查询计划

SET explain_output = 'all';

性能分析

启用性能分析 (Profiling)

以下查询使用默认格式 query_tree 启用性能分析。无论格式如何,enable_profiling 都是启用性能分析的必要条件

PRAGMA enable_profiling;
PRAGMA enable_profile;

性能分析覆盖范围

默认情况下,性能分析覆盖范围设置为 SELECTSELECT 会针对 SELECT 语句物理计划中的每个运算符运行性能分析器。

SET profiling_coverage = 'SELECT';

默认情况下,性能分析器不会为其他语句类型(INSERT INTOATTACH 等)输出性能分析信息。要为所有语句类型运行性能分析器,请将此设置更改为 ALL

SET profiling_coverage = 'ALL';

性能分析格式

enable_profiling 的格式可以指定为 query_treejsonquery_tree_optimizerno_output。除 no_output 外,每种格式都将其输出打印到配置的输出位置。

默认格式是 query_tree。它会打印物理查询计划以及树中每个运算符的指标。

SET enable_profiling = 'query_tree';

或者,json 将物理查询计划作为 JSON 返回

SET enable_profiling = 'json';

提示:要可视化查询计划,请考虑使用由图宾根大学数据库系统研究小组开发的 DuckDB 执行计划可视化工具

返回物理查询计划,包括优化器和计划程序指标

SET enable_profiling = 'query_tree_optimizer';

数据库驱动程序和其他应用程序也可以通过 API 调用访问性能分析信息,这种情况下用户可以禁用任何其他输出。尽管参数名为 no_output,但必须注意,这影响打印到可配置输出的内容。当通过 API 调用访问性能分析信息时,启用性能分析仍然至关重要。

SET enable_profiling = 'no_output';

性能分析输出

默认情况下,DuckDB 将性能分析信息打印到标准输出。但是,如果您更喜欢将性能分析信息写入文件,可以使用 PRAGMA profiling_output 来指定文件路径。

警告:文件内容会被每个新执行的查询覆盖。因此,该文件将仅包含最后一次运行查询的性能分析信息。

SET profiling_output = '/path/to/file.json';
SET profile_output = '/path/to/file.json';

性能分析模式

默认情况下,提供有限的性能分析信息 (standard)。

SET profiling_mode = 'standard';

如需更多详细信息,请通过将 profiling_mode 设置为 detailed 来使用详细性能分析模式。此模式的输出包括对计划程序和优化器阶段的性能分析。

SET profiling_mode = 'detailed';

自定义指标

默认情况下,性能分析会启用除详细性能分析激活的指标之外的所有指标。

使用 custom_profiling_settings PRAGMA,可以单独启用或禁用每个指标(包括来自详细性能分析的指标)。此 PRAGMA 接受一个 JSON 对象,以指标名称为键,布尔值为开关。此 PRAGMA 指定的设置会覆盖默认行为。

注意:这仅在 enable_profiling 设置为 jsonno_output 时影响指标。query_treequery_tree_optimizer 始终使用一组默认指标。

在以下示例中,禁用了 CPU_TIME 指标。启用了 EXTRA_INFOOPERATOR_CARDINALITYOPERATOR_TIMING 指标。

SET custom_profiling_settings = '{"CPU_TIME": "false", "EXTRA_INFO": "true", "OPERATOR_CARDINALITY": "true", "OPERATOR_TIMING": "true"}';

性能分析文档包含可用指标的概述。

禁用性能分析

禁用性能分析

PRAGMA disable_profiling;
PRAGMA disable_profile;

查询优化

优化器

禁用查询优化器

PRAGMA disable_optimizer;

启用查询优化器

PRAGMA enable_optimizer;

选择性禁用优化器

disabled_optimizers 选项允许选择性地禁用优化步骤。例如,要禁用 filter_pushdownstatistics_propagation,请运行

SET disabled_optimizers = 'filter_pushdown,statistics_propagation';

可以使用 duckdb_optimizers() 表函数查询可用的优化。

要重新启用优化器,请运行

SET disabled_optimizers = '';

警告:disabled_optimizers 选项仅应用于调试性能问题,应避免在生产环境中使用。

日志记录

设置查询日志记录路径

SET log_query_path = '/tmp/duckdb_log/';

禁用查询日志记录

SET log_query_path = '';

全文搜索索引

create_fts_indexdrop_fts_index 选项仅在加载 fts 扩展时可用。其使用方法记录在 全文搜索扩展页面上。

验证

外部运算符验证

启用外部运算符验证

PRAGMA verify_external;

禁用外部运算符验证

PRAGMA disable_verify_external;

往返能力验证

为支持的逻辑计划启用往返能力验证

PRAGMA verify_serializer;

禁用往返能力验证

PRAGMA disable_verify_serializer;

对象缓存

启用对象缓存(例如 Parquet 元数据)

PRAGMA enable_object_cache;

禁用对象缓存

PRAGMA disable_object_cache;

检查点 (Checkpointing)

压缩

在检查点期间,现有的列数据加上任何新的更改都会被压缩。存在几个可以影响使用哪些压缩函数的 pragmas。

强制压缩

如果可能,优先使用此压缩方法而不是任何其他方法

PRAGMA force_compression = 'bitpacking';
禁用的压缩方法

避免使用逗号分隔列表中的任何已列出的压缩方法

PRAGMA disabled_compression_methods = 'fsst,rle';

强制检查点

当调用 CHECKPOINT 且没有进行任何更改时,仍强制执行检查点

PRAGMA force_checkpoint;

关闭时检查点

在成功关闭时运行 CHECKPOINT 并删除 WAL,只留下一个数据库文件

PRAGMA enable_checkpoint_on_shutdown;

关闭时不运行 CHECKPOINT

PRAGMA disable_checkpoint_on_shutdown;

用于将数据溢出到磁盘的临时目录

默认情况下,DuckDB 使用名为 database_file_name.tmp 的临时目录溢出到磁盘,该目录位于与数据库文件相同的目录中。要更改此设置,请使用

SET temp_directory = '/path/to/temp_dir.tmp/';

以 JSON 格式返回错误

errors_as_json 选项可以设置为以原始 JSON 格式获取错误信息。对于某些错误,提供了额外信息或分解信息,以便于机器处理。例如

SET errors_as_json = true;

然后,运行导致错误的查询会产生 JSON 输出

SELECT * FROM nonexistent_tbl;
{
   "exception_type":"Catalog",
   "exception_message":"Table with name nonexistent_tbl does not exist!\nDid you mean \"temp.information_schema.tables\"?",
   "name":"nonexistent_tbl",
   "candidates":"temp.information_schema.tables",
   "position":"14",
   "type":"Table",
   "error_subtype":"MISSING_ENTRY"
}

IEEE 浮点运算语义

DuckDB 遵循 IEEE 浮点运算语义。如果您想关闭此功能,请运行

SET ieee_floating_point_ops = false;

在这种情况下,浮点除以零(例如 1.0 / 0.00.0 / 0.0-1.0 / 0.0)都将返回 NULL

查询验证(用于开发)

以下 PRAGMA 主要用于开发和内部测试。

启用查询验证

PRAGMA enable_verification;

禁用查询验证

PRAGMA disable_verification;

启用强制并行查询处理

PRAGMA verify_parallelism;

禁用强制并行查询处理

PRAGMA disable_verify_parallelism;

块大小 (Block Sizes)

在将数据库持久化到磁盘时,DuckDB 会写入一个专用文件,其中包含保存数据的块列表。对于仅包含很少数据的文件(例如小表),256 kB 的默认块大小可能并不理想。因此,DuckDB 的存储格式支持不同的块大小。

对于可能的块大小值有一些约束。

  • 必须是 2 的幂。
  • 必须大于或等于 16384 (16 kB)。
  • 必须小于或等于 262144 (256 kB)。

您可以像这样为实例创建的所有新 DuckDB 文件设置默认块大小

SET default_block_size = '16384';

也可以按文件设置块大小,详情请参阅 ATTACH

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南