| Input and output |
| Read CSV or Parquet | ✓StrongReads both directly, on all cores. | ✕CannotReads JSON only. Something else has to convert the files first. |
| Write Parquet | ✓StrongWrites Parquet, CSV and JSON. | ✕CannotWrites JSON or plain text only. |
| Records with different shapes in one file | ~LimitedWants one shape per table. Very mixed records end up in a generic JSON column. | ✓StrongEach record can have its own shape. |
| Scale and speed |
| Use all CPU cores | ✓StrongRuns in parallel by default. | ✕CannotOne core per process. Splitting the file only helps for per-record steps. |
| Data bigger than memory | ✓StrongSpills to disk above its memory limit, if there's free disk. | ✕CannotCan't spill. A step that must remember every key fails when memory runs out. |
| Millions of rows in seconds | ✓Strong1M trades in 3 to 11 seconds. | ~Limited1M trades took 5 min 14 s. |
| Low memory use | ~Limited2.6 to 3.6 GB at 1M by default, 0.75 to 1.4 GB with the lean settings. | ✓StrongStreams records: 632 MB at 1M, far less for simple filters. |
| Data spread over several machines | ✕CannotOne machine only. | ✕CannotOne machine only. |
| Links between rows |
| Join two large tables | ✓StrongBuilt-in joins that can spill to disk. | ~LimitedOne side has to be loaded into memory as a lookup table. |
| A row pointing to a later row | ✓StrongRow order doesn't matter in SQL. | ~LimitedNeeds an extra full pass, because a stream can't look ahead. |
| Sort or group everything | ✓StrongAny size, spilling to disk if needed. | ~Limitedsort_by and group_by need everything in memory. Running totals are fine. |
| Chains of parents | ✓StrongRecursive SQL follows chains of any length. | ✓StrongRecursive functions follow chains of any length. |
| Loops in the links | ~LimitedA recursive query can run forever unless it's written to avoid loops. | ~LimitedYou have to track visited ids yourself. |
| Output shape |
| Nesting of unknown depth | ~LimitedNo type can contain itself, so that part has to be built as JSON. | ✓StrongBuilds nested objects of any depth naturally. |
| Correctness |
| Exact money amounts | ✓StrongHas an exact DECIMAL type. | ✕CannotNumbers are 64-bit floats, so sums can round. |
| Strict date and type checks | ✓Strongtry_strptime and try_cast reject bad values. | ~Limitedstrptime accepts 2025-02-30 and rolls it over to 2 March, so it needs an extra check. |
| Running it |
| Same speed however the code is written | ✓StrongA query planner picks the join order. | ~LimitedNo planner. Rewriting the same logic changed speed up to 11×. |
| An endless stream of events | ~LimitedWorks on data that already exists, so new data goes in small batches. | ✓StrongReads line by line for as long as input arrives. |
| Several programs writing at once | ~LimitedMany readers, but only one process can write a database file. | –Not applicableNot a data store. Each run writes its own files. |
| A quick command in the terminal | ✓StrongThe duckdb command line runs SQL on files directly. | ✓StrongSmall, fast to start and made for shell pipelines. |