- Installation
- Documentation
- Getting Started
- Connect
- Data Import and Export
- Overview
- Data Sources
- CSV Files
- JSON Files
- Overview
- Creating JSON
- Loading JSON
- Writing JSON
- JSON Type
- JSON Functions
- Format Settings
- Installing and Loading
- SQL to / from JSON
- Caveats
- Multiple Files
- Parquet Files
- Partitioning
- Appender
- INSERT Statements
- Lakehouse Formats
- Client APIs
- Overview
- ADBC
- C
- Overview
- Startup
- Configuration
- Query
- Data Chunks
- Vectors
- Values
- Types
- Prepared Statements
- Appender
- Table Functions
- Replacement Scans
- API Reference
- C++
- CLI
- Overview
- Arguments
- Dot Commands
- Output Formats
- Editing
- Friendly CLI
- Safe Mode
- Autocomplete
- Syntax Highlighting
- Known Issues
- Go
- Java (JDBC)
- Overview
- Connect
- Import Data
- Run Queries
- Handle Results
- Write User Defined Functions
- Profile and Monitor
- Deploy as Native Image
- Troubleshoot
- Node.js (Neo)
- ODBC
- Python
- Overview
- Data Ingestion
- Conversion between DuckDB and Python
- DB API
- Relational API
- Function API
- Types API
- Expression API
- Spark API
- API Reference
- Known Python Issues
- R
- Rust
- Overview
- Connect
- Import Data
- Run Queries
- Handle Results
- Write User Defined Functions
- Profile and Monitor
- Troubleshoot
- Wasm
- Tertiary Clients
- SQL
- Introduction
- Statements
- Overview
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH and DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- EXPORT and IMPORT DATABASE
- INSERT
- LOAD / INSTALL
- MERGE INTO
- PIVOT
- Profiling
- SELECT
- SET / RESET
- SET VARIABLE
- SHOW and SHOW DATABASES
- SUMMARIZE
- Transaction Management
- UNPIVOT
- UPDATE
- USE
- VACUUM
- Query Syntax
- SELECT
- FROM and JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT and OFFSET
- SAMPLE
- Unnesting
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- Set Operations
- Prepared Statements
- Data Types
- Overview
- Array
- Bitstring
- Blob
- Boolean
- Date
- Enum
- Geometry
- Interval
- List
- Literal Types
- Map
- NULL Values
- Numeric
- Struct
- Text
- Time
- Timestamp
- Time Zones
- Union
- Typecasting
- Variant
- Expressions
- Overview
- CASE Expression
- Casting
- Collations
- Comparisons
- IN Operator
- Logical Operators
- Star Expression
- Subqueries
- TRY
- Functions
- Overview
- Aggregate Functions
- Array Functions
- Bitstring Functions
- Blob Functions
- Date Format Functions
- Date Functions
- Date Part Functions
- Enum Functions
- Geometry Functions
- Interval Functions
- Lambda Functions
- List Functions
- Map Functions
- Nested Functions
- Numeric Functions
- Pattern Matching
- Regular Expressions
- Struct Functions
- Text Functions
- Time Functions
- Timestamp Functions
- Timestamp with Time Zone Functions
- Union Functions
- Utility Functions
- Window Functions
- Constraints
- Indexes
- Meta Queries
- DuckDB's SQL Dialect
- Overview
- Indexing
- Friendly SQL
- Keywords and Identifiers
- Order Preservation
- PostgreSQL Compatibility
- SQL Quirks
- PEG Parser
- Samples
- Configuration
- Extensions
- Overview
- Installing Extensions
- Advanced Installation Methods
- Distributing Extensions
- Versioning of Extensions
- Troubleshooting of Extensions
- Core Extensions
- Overview
- AutoComplete
- Avro
- AWS
- Azure
- Delta
- DuckLake
- Encodings
- Excel
- Full Text Search
- httpfs (HTTP and S3)
- Iceberg
- ICU
- inet
- jemalloc
- Lance
- MotherDuck
- MySQL
- ODBC
- Quack
- PostgreSQL
- Spatial
- SQLite
- TPC-DS
- TPC-H
- UI
- Unity Catalog
- Vortex
- VSS
- Quack Remote Protocol
- Guides
- Overview
- Data Viewers
- Database Integration
- File Formats
- Overview
- CSV Import
- CSV Export
- Directly Reading Files
- Directly Reading DuckDB Databases
- Excel Import
- Excel Export
- JSON Import
- JSON Export
- Parquet Import
- Parquet Export
- Querying Parquet Files
- File Access with the file: Protocol
- Meta Queries
- Describe Table
- EXPLAIN: Inspect Query Plans
- EXPLAIN ANALYZE: Profile Queries
- List Tables
- Summarize
- DuckDB Environment
- Network and Cloud Storage
- Overview
- HTTP Parquet Import
- S3 Parquet Import
- S3 Parquet Export
- S3 Iceberg Import
- S3 Express One
- GCS Import
- Cloudflare R2 Import
- DuckDB over HTTPS / S3
- Fastly Object Storage Import
- SeaweedFS Import
- Tigris Import
- ODBC
- Performance
- Overview
- Environment
- Import
- Schema
- Indexing
- Join Operations
- File Formats
- How to Tune Workloads
- My Workload Is Slow
- Out-of-Memory Issues
- Benchmarks
- Working with Huge Databases
- Python
- Installation
- Executing SQL
- Jupyter Notebooks
- marimo Notebooks
- SQL on Pandas
- Import from Pandas
- Export to Pandas
- Import from Numpy
- Export to Numpy
- SQL on Arrow
- Import from Arrow
- Export to Arrow
- Relational API on Pandas
- Multiple Python Threads
- Integration with Ibis
- Integration with Polars
- Integration with PyTorch
- Using fsspec Filesystems
- SQL Editors
- SQL Features
- AsOf Join
- Full-Text Search
- Graph Queries
- query and query_table Functions
- Merge Statement for SCD Type 2
- Timestamp Issues
- Snippets
- Creating Synthetic Data
- Dutch Railway Datasets
- Sharing Macros
- Analyzing a Git Repository
- Importing Duckbox Tables
- Copying an In-Memory Database to a File
- Troubleshooting
- Glossary of Terms
- Browsing Offline
- Operations Manual
- Overview
- DuckDB's Footprint
- Installing DuckDB
- Logging
- User Agents
- Securing DuckDB
- Non-Deterministic Behavior
- Limits
- DuckDB Docker Container
- Development
- DuckDB Repositories
- Release Cycle
- Metrics
- Profiling
- Building DuckDB
- Overview
- Build Configuration
- Building Extensions
- Android
- Linux
- macOS
- Raspberry Pi
- Windows
- Python
- R
- Troubleshooting
- Unofficial and Unsupported Platforms
- Benchmark Suite
- Testing
- Internals
- Sitemap
- Live Demo
Profiling is essential to help understand why certain queries exhibit specific performance characteristics.
DuckDB contains several built-in features to enable query profiling, which this page covers.
For a high-level example of using EXPLAIN, see the “Inspect Query Plans” page.
Statements
The EXPLAIN Statement
The first step to profiling a query can include examining the query plan.
The EXPLAIN statement shows the query plan and describes what is going on under the hood.
The EXPLAIN ANALYZE Statement
The query plan helps developers understand the performance characteristics of the query.
However, it is often also necessary to examine the performance numbers of individual operators and the cardinalities that pass through them.
The EXPLAIN ANALYZE statement enables obtaining these, as it pretty-prints the query plan and also executes the query.
Thus, it provides the actual run-time performance numbers.
The FORMAT Option
The EXPLAIN [ANALYZE] statement allows exporting to several formats:
text– default ASCII-art style outputgraphviz– produces a DOT output, which can be rendered with Graphvizhtml– produces an HTML output, which can be rendered with treeflexjson– produces a JSON outputmermaid– produces a Mermaid flowchart
To specify a format, use the FORMAT tag:
EXPLAIN (FORMAT html) SELECT 42 AS x;
Pragmas
DuckDB supports several pragmas for turning profiling on and off and controlling the level of detail in the profiling output.
The following pragmas are available and can be set using either PRAGMA or SET.
They can also be reset using RESET, followed by the setting name.
For more information, see the “Profiling” section of the pragmas page.
| Setting | Description | Default | Options |
|---|---|---|---|
enable_profiling, enable_profile |
Turn on profiling | query_tree |
query_tree, json, query_tree_optimizer, no_output |
profiling_coverage |
Set the operators to profile | SELECT |
SELECT, ALL |
profiling_output |
Set a profiling output file | Console | A filepath |
profiling_mode |
Toggle additional optimizer and planner metrics | standard |
standard, detailed, all |
configure_profiling |
Enable or disable specific metrics | All metrics except those activated by detailed profiling | A JSON object that matches the following: {"METRIC_NAME": "boolean", ...}. (List of all available metrics) |
disable_profiling, disable_profile |
Turn off profiling |
Table Functions
These table functions were introduced in DuckDB v1.5.0.
DuckDB provides table functions to enable and disable profiling, consolidating multiple settings into a single call.
enable_profiling()
The enable_profiling() function configures profiling with the specified options.
CALL enable_profiling(
format := 'json',
save_location := '/path/to/output.json',
coverage := 'select',
mode := 'standard',
metrics := ['QUERY_NAME', 'LATENCY', 'OPERATOR_TIMING']
);
| Parameter | Type | Description |
|---|---|---|
metrics |
LIST, STRUCT, or JSON |
Specifies which metrics to enable |
mode |
VARCHAR |
Profiling level: 'standard' or 'detailed' |
save_location |
VARCHAR |
File path for profiling output |
coverage |
VARCHAR |
Query coverage: 'select' or 'all' |
format |
VARCHAR |
Output format: 'query_tree', 'json', 'query_tree_optimizer', 'no_output' |
All parameters are optional and named. You can also pass metrics as an unnamed parameter:
CALL enable_profiling(['LATENCY', 'RESULT_SET_SIZE']);
disable_profiling()
The disable_profiling() function turns off profiling.
CALL disable_profiling();
Metrics
DuckDB supports a wide range of metrics that can be enabled or disabled independently. To learn more and to see the full list of available metrics, refer to the metrics documentation.
Detailed Profiling
When the profiling_mode is set to detailed, an extra set of metrics are enabled, which are only available in the QUERY_ROOT node.
These include all the metrics in the Phase timing metric group.
It is possible to toggle each of these additional metrics individually.
Query Graphs
It is also possible to render the profiling output as a query graph.
The query graph visually represents the query plan, showing the operators and their relationships.
The query plan must be output in the json format and stored in a file.
After writing a profiling output to its designated file, the Python script can render it as a query graph.
The script requires the duckdb Python module to be installed.
It generates an HTML file and opens it in your web browser.
python -m duckdb.query_graph /path/to/file.json
Notation in Query Plans
In query plans, the hash join operators adhere to the following convention: the probe side of the join is the left operand, while the build side is the right operand.
Join operators in the query plan show the join type used:
- Inner joins are denoted as
INNER. - Left outer joins and right outer joins are denoted as
LEFTandRIGHT, respectively. - Full outer joins are denoted as
FULL.
Tip To visualize query plans, consider using the DuckDB execution plan visualizer developed by the Database Systems Research Group at the University of Tübingen.