<?xml version="1.0" encoding="UTF-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Database Systems</title><link>/</link><description>Recent news on Database Systems</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Thu, 01 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>_Recursive CTEs and DuckDB in Education_ (Torsten on the _Disseminate_ Podcast)</title><link>/news/2025-10-16-disseminate/</link><pubDate>Thu, 16 Oct 2025 00:00:00 UTC</pubDate><guid>/news/2025-10-16-disseminate/</guid><description>&lt;p>Jack Waudby invited Torsten to ramble about &lt;a href="https://duckdb.org/library/torsten-grust/">Recursive CTEs and
DuckDB in Education&lt;/a> in
the &lt;em>DuckDB in Research&lt;/em> series of the &lt;a href="https://www.youtube.com/channel/UCCpkF2IfrPtR222zeGXZZMQ/about">&lt;em>Disseminate&lt;/em> Podcast&lt;/a>.
We cover &lt;a href="/publications/2025/using-key/">&lt;code>USING KEY&lt;/code>&lt;/a> and also touch on &lt;a href="/publications/2025/with-trampoline/">&lt;code>WITH TRAMPOLINE&lt;/code>&lt;/a>.
If you&amp;rsquo;ve got a spare 60 minutes during your commute, you are invited to tune in.&lt;/p></description></item><item><title>The _DuckDB Explain Visualizer_ is now available!</title><link>/news/duckdb-explain-visualizer/</link><pubDate>Wed, 26 Feb 2025 00:00:00 UTC</pubDate><guid>/news/duckdb-explain-visualizer/</guid><description>&lt;p>We are happy to announce the release of the &lt;em>DuckDB Explain Visualizer&lt;/em>!
It is a web-based tool that allows you to visualize the query plans of DuckDB.
The DuckDB Explain Visualizer is available here: &lt;a href="https://db.cs.uni-tuebingen.de/explain">https://db.cs.uni-tuebingen.de/explain&lt;/a>.&lt;/p>
&lt;h2 id="what-is-the-duckdb-explain-visualizer">What is the DuckDB Explain Visualizer?&lt;/h2>
&lt;p>If you spend any significant amount of time looking at DuckDB query plans,
sooner or later you will realize that the textual representation of the query plan
has its limitations. It can be hard to read and understand, especially for complex plans.
And worse, if the plan is too large, it can be cut off, making it impossible to
understand the full plan. Also, there are no visual cues to help you understand the plan,
find bottlenecks, or identify optimization opportunities.&lt;/p>
&lt;p>Luckily, the DuckDB team has added an alternative way to represent query plans:
As a &lt;code>JSON&lt;/code> object, which can be visualized in a more user-friendly way.
This is similar to the &lt;code>EXPLAIN (FORMAT JSON)&lt;/code> feature in PostgreSQL.
We leverage the &lt;code>JSON&lt;/code> representation to render the query plan in a much more
visually appealing fashion, interactive, and with additional information (&lt;em>e.g.&lt;/em>
slowest operator or the number of rows processed by each operator).&lt;/p>
&lt;p>One of the main features of the DuckDB Explain Visualizer is the ability to
share query plans with others. Once you have uploaded a query plan, you can
share the link, and others can view the query plan without having to upload it again.
We believe this feature will be especially useful for teaching, debugging, and
collaboration in general.&lt;/p>
&lt;figure>&lt;img src="/staticfiles/news/2025-03-01-duckdb-explain-visualizer/duckdb-explain-visualizer-screenshot.png"
alt="DuckDB Explain Visualizer">&lt;figcaption>
&lt;p>DuckDB Explain Visualizer&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="how-to-use-the-duckdb-explain-visualizer">How to use the DuckDB Explain Visualizer?&lt;/h3>
&lt;p>To use the DuckDB Explain Visualizer, you need to have a DuckDB query plan in JSON format.
You can obtain this by running a query prefixed with &lt;code>EXPLAIN (FORMAT JSON)&lt;/code>.
Then, you can paste the JSON output into the DuckDB Explain Visualizer to visualize the query plan.
You can also use the &lt;code>ANALYZE&lt;/code> option to include runtime statistics in the query plan.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="k">EXPLAIN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">ANALYZE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">FORMAT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">JSON&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">RECURSIVE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">UNION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">t&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Alternatively, you can use &lt;code>PRAGMA&lt;/code> commands to enable profiling and save
the output to a file. This is useful for long-running queries or queries that
you want to analyze later. The output file can then be uploaded to the DuckDB
Explain Visualizer. The following commands enable profiling and save the output
to a file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="n">PRAGMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">enable_profiling&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;json&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">PRAGMA&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">profiling_output&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;/path/to/file.json&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">-- (optional)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">your&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">here&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="how-did-we-build-the-duckdb-explain-visualizer">How did we build the DuckDB Explain Visualizer?&lt;/h2>
&lt;p>The basis for the DuckDB Explain Visualizer is the excellent
&lt;a href="https://github.com/AlexTatiyants/pev">PostgreSQL Explain Visualizer&lt;/a> (PEV)
by Alex Tatiyants. This tool has been re-implemented a few years ago as
&lt;a href="https://explain.dalibo.com/">PostgreSQL Explain Visualizer 2&lt;/a> (PEV2).
Both PEV and PEV2 are web-based tools that allows users to
visualize query execution plans of PostgreSQL. Exactly what we want—and need—for DuckDB!
The source code of the DuckDB Explain Visualizer is available on
&lt;a href="https://github.com/DBatUTuebingen/duckdb-explain-visualizer">GitHub&lt;/a>.&lt;/p>
&lt;h2 id="credits">Credits&lt;/h2>
&lt;p>During &lt;em>Matthis Noël&amp;rsquo;s&lt;/em> bachelor thesis, he adapted PEV2 to work with DuckDB&amp;rsquo;s
execution plans. This involved understanding the structure of DuckDB&amp;rsquo;s execution
plans and adapting the visualization tool to work with them.&lt;/p></description></item><item><title>_Trampoline-Style Queries for SQL_ will be at CIDR 2025</title><link>/news/2024-12-04-cidr2025/</link><pubDate>Wed, 04 Dec 2024 00:00:00 UTC</pubDate><guid>/news/2024-12-04-cidr2025/</guid><description>&lt;p>We love the single-track system-focused CIDR series of conferences
and we are happy to be able join the community again for
&lt;a href="https://www.cidrdb.org/cidr2025/index.html">CIDR 2025&lt;/a>,
once more located in Amsterdam (NL), January 19-22, 2025.
Together with our colleagues Thomas Neumann and Altan Birler
of TU Munich, we discuss a new foundation for iterative
queries: we step away from fixpoints and instead bank
on &lt;a href="/publications/2025/with-trampoline/">&lt;em>Trampoline-Style queries for SQL&lt;/em>&lt;/a>,
a concept inspired by the programming languages and compilers domain. &lt;code>WITH TRAMPOLINE&lt;/code>
has already been prototypically implemented in Thomas&amp;rsquo; &lt;a href="https://umbra-db.com">Umbra
RDBMS&lt;/a>. Trampolines are versatile—they also serve as the
backbone for our work in the
&lt;a href="/research/current-projects/plsql/">compilation of imperative-style programs to SQL&lt;/a>.&lt;/p></description></item><item><title>_A Fix for the Fixation on Fixpoints_ accepted at CIDR 2023</title><link>/news/2022-11-18-cidr2023/</link><pubDate>Mon, 28 Nov 2022 00:00:00 UTC</pubDate><guid>/news/2022-11-18-cidr2023/</guid><description>&lt;p>Tübingen returns to &lt;a href="https://www.cidrdb.org/cidr2023/index.html">CIDR&lt;/a>,
this time for the 2023 edition to be held in Amsterdam (NL), January
8–11, 2023. We will report on our &lt;a href="/publications/2023/a-fix-for-the-fixation-on-fixpoints/">recent explorations into alternative
forms of iteration in SQL&lt;/a>—generalizing recursive common table
expressions—that are easier to write and read as well as more efficient
to evaluate than &lt;code>WITH RECURSIVE&lt;/code> (which has been established more than
20 years ago but since then has been largely left untouched).&lt;/p></description></item></channel></rss>