Skip to main content

Pragmas

The PRAGMA statement is a SQL extension adopted by SereneDB from SQLite. PRAGMA statements can be issued in a similar manner to regular SQL statements. PRAGMA commands may alter the internal state of the database engine, and can influence the subsequent execution or behavior of the engine.

PRAGMA statements that assign a value to an option can also be issued using the SET statement and the value of an option can be retrieved using SELECT current_setting(option_name).

For SereneDB's built in configuration options, see the Configuration Reference.

This page contains the supported PRAGMA settings.

Metadata

Schema Information

List all databases:

Query
PRAGMA database_list;

List all tables:

Query
PRAGMA show_tables;

List all tables, with extra information, similarly to DESCRIBE:

Query
PRAGMA show_tables_expanded;

To list all functions:

Query
PRAGMA functions;

For queries targeting non-existing schemas, SereneDB generates “did you mean...” style error messages. When there are thousands of attached databases, these errors can take a long time to generate. To limit the number of schemas SereneDB looks through, use the catalog_error_max_schemas option:

Query
SET catalog_error_max_schemas = 10;

Table Information

Get info for a specific table:

Query
PRAGMA table_info('table_name');
CALL pragma_table_info('table_name');
Result
 cid | name | type    | notnull | dflt_value | pk-----+------+---------+---------+------------+----   0 | id   | INTEGER | f       | NULL       | f   1 | name | VARCHAR | f       | NULL       | f
 cid | name | type    | notnull | dflt_value | pk-----+------+---------+---------+------------+----   0 | id   | INTEGER | f       | NULL       | f   1 | name | VARCHAR | f       | NULL       | f

table_info returns information about the columns of the table with name table_name. The exact format of the table returned is given below:

Query
cid INTEGER,        -- cid of the columnname VARCHAR,       -- name of the columntype VARCHAR,       -- type of the columnnotnull BOOLEAN,    -- if the column is marked as NOT NULLdflt_value VARCHAR, -- default value of the column, or NULL if not specifiedpk BOOLEAN          -- part of the primary key or not

Database Size

Get the file and memory size of each database:

Query
PRAGMA database_size;
CALL pragma_database_size();

database_size returns information about the file and memory size of each database. The column types of the returned results are given below:

Query
database_name VARCHAR, -- database namedatabase_size VARCHAR, -- total block count times the block sizeblock_size BIGINT,     -- database block sizetotal_blocks BIGINT,   -- total blocks in the databaseused_blocks BIGINT,    -- used blocks in the databasefree_blocks BIGINT,    -- free blocks in the databasewal_size VARCHAR,      -- write ahead log sizememory_usage VARCHAR,  -- memory used by the database buffer managermemory_limit VARCHAR   -- maximum memory allowed for the database

Storage Information

To get storage information:

Query
PRAGMA storage_info('table_name');
CALL pragma_storage_info('table_name');
Result
row_group_id	column_name	column_id	column_path	segment_id	segment_type	start	count	compression	stats	has_updates	persistent	block_id	block_offset	additional_block_ids
row_group_id	column_name	column_id	column_path	segment_id	segment_type	start	count	compression	stats	has_updates	persistent	block_id	block_offset	additional_block_ids

This call returns the following information for the given table:

NameTypeDescription
row_group_idBIGINT
column_nameVARCHAR
column_idBIGINT
column_pathVARCHAR
segment_idBIGINT
segment_typeVARCHAR
startBIGINTThe start row id of this chunk
countBIGINTThe amount of entries in this storage chunk
compressionVARCHARCompression type used for this column
statsVARCHAR
has_updatesBOOLEAN
persistentBOOLEANfalse if temporary table
block_idBIGINTEmpty unless persistent
block_offsetBIGINTEmpty unless persistent

Show Databases

The following statement is equivalent to the SHOW DATABASES statement:

Query
PRAGMA show_databases;

Resource Management

Memory Limit

Set the memory limit for the buffer manager:

Query
SET memory_limit = '1GB';

Threads

Set the amount of threads for parallel query execution:

Query
SET threads = 4;

Collations

List all available collations:

Query
PRAGMA collations;

Set the default collation to one of the available ones:

Query
SET default_collation = 'nocase';

Default Ordering for NULLs

Set the default ordering for NULLs to be either NULLS_FIRST, NULLS_LAST, NULLS_FIRST_ON_ASC_LAST_ON_DESC or NULLS_LAST_ON_ASC_FIRST_ON_DESC:

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

Set the default result set ordering direction to ASCENDING or DESCENDING:

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

Ordering by Non-Integer Literals

By default, ordering by non-integer literals is not allowed:

Query
SELECT 42 ORDER BY 'hello world';
Result
db error: ERROR: ORDER BY non-integer literal has no effect.* SET order_by_non_integer_literal=true to allow this behavior.

To allow this behavior, use the order_by_non_integer_literal option:

Query
SET order_by_non_integer_literal = true;

Information on SereneDB

Version

Show SereneDB version:

Query
PRAGMA version;
Result
 library_version | source_id  | codename-----------------+------------+--------------------- v1.6.0-dev7012  | 5212023fb8 | Development Version

Platform

platform returns an identifier for the platform the current SereneDB executable has been compiled for, e.g., osx_arm64. The format of this identifier matches the platform name:

Query
PRAGMA platform;
CALL pragma_platform();
Result
 platform---------- (varies)
 platform---------- (varies)

User Agent

The following statement returns the user agent information, e.g., duckdb/v0.0.1(linux_arm64) cpp:

Query
PRAGMA user_agent;
Result
 user_agent---------------------------------------- duckdb/v1.6.0-dev7012(linux_amd64) cpp

Metadata Information

The following statement returns information on the metadata store (block_id, total_blocks, free_blocks, and free_list):

Query
PRAGMA metadata_info;
Result
 block_id | total_blocks | free_blocks | free_list----------+--------------+-------------+-----------        0 |           64 |           2 |         1

Progress Bar

Show progress bar when running queries:

Query
PRAGMA enable_progress_bar;
Result
Success

Or:

Query
PRAGMA enable_print_progress_bar;
Result
Success

Don't show a progress bar for running queries:

Query
PRAGMA disable_progress_bar;
Result
Success

Or:

Query
PRAGMA disable_print_progress_bar;
Result
Success

EXPLAIN Output

The output of EXPLAIN can be configured to show only the physical plan.

The default configuration of EXPLAIN:

Query
SET explain_output = 'physical_only';

To only show the optimized query plan:

Query
SET explain_output = 'optimized_only';

To show all query plans:

Query
SET explain_output = 'all';

Profiling

Enable Profiling

The following query enables profiling with the default format, query_tree. Independent of the format, enable_profiling is mandatory to enable profiling.

Query
PRAGMA enable_profiling;
PRAGMA enable_profile;
Result
Success
Success

Profiling Coverage

By default, the profiling coverage is set to SELECT. SELECT runs the profiler for each operator in the physical plan of a SELECT statement.

Query
SET profiling_coverage = 'SELECT';

By default, the profiler does not emit profiling information for other statement types (INSERT INTO, ATTACH, etc.). To run the profiler for all statement types, change this setting to ALL.

Query
SET profiling_coverage = 'ALL';

Profiling Format

The format of enable_profiling can be specified as query_tree, json, query_tree_optimizer, or no_output. Each format prints its output to the configured output, except no_output.

The default format is query_tree. It prints the physical query plan and the metrics of each operator in the tree.

Query
SET enable_profiling = 'query_tree';

Alternatively, json returns the physical query plan as JSON:

Query
SET enable_profiling = 'json';

To return the physical query plan, including optimizer and planner metrics:

Query
SET enable_profiling = 'query_tree_optimizer';

Database drivers and other applications can also access profiling information through API calls, in which case users can disable any other output. Even though the parameter reads no_output, it is essential to note that this only affects printing to the configurable output. When accessing profiling information through API calls, it is still crucial to enable profiling:

Query
SET enable_profiling = 'no_output';

Profiling Output

By default, SereneDB prints profiling information to the standard output. However, if you prefer to write the profiling information to a file, you can use PRAGMA profiling_output to specify a filepath.

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

Profiling Mode

By default, a limited amount of profiling information is provided (standard).

Query
SET profiling_mode = 'standard';

For more details, use the detailed profiling mode by setting profiling_mode to detailed. The output of this mode includes profiling of the planner and optimizer stages.

Query
SET profiling_mode = 'detailed';

To access all available metrics, set the profiling_mode to all.

Query
SET profiling_mode = 'all';

Disable Profiling

To disable profiling:

Query
PRAGMA disable_profiling;
PRAGMA disable_profile;
Result
Success
Success

Query Optimization

Optimizer

To disable the query optimizer:

Query
PRAGMA disable_optimizer;
Result
Success

To enable the query optimizer:

Query
PRAGMA enable_optimizer;
Result
Success

Selectively Disabling Optimizers

The disabled_optimizers option allows selectively disabling optimization steps. For example, to disable filter_pushdown and statistics_propagation, run:

Query
SET disabled_optimizers = 'filter_pushdown,statistics_propagation';

The available optimizations can be queried using the duckdb_optimizers() table function.

To re-enable the optimizers, run:

Query
SET disabled_optimizers = '';

Logging

Set a path for query logging:

Query
SET log_query_path = '${__TEST_DIR__}/serened_log/';

Disable query logging:

Query
SET log_query_path = '';

Object Cache

Enable caching of objects for e.g., Parquet metadata:

Query
PRAGMA enable_object_cache;
Result
Success

Disable caching of objects:

Query
PRAGMA disable_object_cache;
Result
Success

Checkpointing

Compression

During checkpointing, the existing column data + any new changes get compressed. There exist a couple of pragmas to influence which compression functions are considered.

Force Compression

Prefer using this compression method over any other method if possible:

Query
PRAGMA force_compression = 'bitpacking';
Disabled Compression Methods

Avoid using any of the listed compression methods from the comma separated list:

Query
PRAGMA disabled_compression_methods = 'fsst,rle';

Force Checkpoint

When CHECKPOINT is called when no changes are made, force a checkpoint regardless:

Query
PRAGMA force_checkpoint;
Result
Success

Checkpoint on Shutdown

Run a CHECKPOINT on successful shutdown and delete the WAL, to leave only a single database file behind:

Query
PRAGMA enable_checkpoint_on_shutdown;
Result
Success

Don't run a CHECKPOINT on shutdown:

Query
PRAGMA disable_checkpoint_on_shutdown;
Result
Success

Temp Directory for Spilling Data to Disk

By default, SereneDB uses a temporary directory named ⟨database_file_name⟩.tmp to spill to disk, located in the same directory as the database file. To change this, use:

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

Returning Errors as JSON

The errors_as_json setting makes the serened shell report errors as raw JSON instead of a formatted message, which is easier to process programmatically. For certain errors it includes extra, decomposed fields:

Query
SET errors_as_json = true;

With the setting enabled, a failing query in the shell prints a JSON object such as:

{"exception_type":"Catalog","exception_message":"Table with name nonexistent_tbl does not exist!","type":"Table","name":"nonexistent_tbl","error_subtype":"MISSING_ENTRY"}

Over the PostgreSQL wire protocol, errors are always returned as standard PostgreSQL error messages, regardless of this setting.

IEEE Floating-Point Operation Semantics

SereneDB follows IEEE floating-point operation semantics. If you would like to turn this off, run:

Query
SET ieee_floating_point_ops = false;

In this case, floating point division by zero (e.g., 1.0 / 0.0, 0.0 / 0.0 and -1.0 / 0.0) will all return NULL.

Query Verification (for Development)

The following PRAGMAs are mostly used for development and internal testing.

Enable query verification:

Query
PRAGMA enable_verification;
Result
Success

Disable query verification:

Query
PRAGMA disable_verification;
Result
Success

Enable force parallel query processing:

Query
PRAGMA verify_parallelism;
Result
Success

Disable force parallel query processing:

Query
PRAGMA disable_verify_parallelism;
Result
Success

Block Sizes

When persisting a database to disk, SereneDB writes to a dedicated file containing a list of blocks holding the data. In the case of a file that only holds very little data, e.g., a small table, the default block size of 256 kB might not be ideal. Therefore, SereneDB's storage format supports different block sizes.

There are a few constraints on possible block size values.

  • Must be a power of two.
  • Must be greater or equal to 16384 (16 kB).
  • Must be lesser or equal to 262144 (256 kB).

You can set the default block size for all new SereneDB files created by an instance like so:

Query
SET default_block_size = '16384';

It is also possible to set the block size on a per-file basis, see ATTACH for details.