{
  "slug": "zfs-deduplication-table",
  "term": "ZFS deduplication table",
  "aliases": [
    "DDT",
    "ZFS dedup table"
  ],
  "definition": "A ZFS deduplication table maps block signatures and properties to stored block locations and reference counts so compatible writes can share existing data.",
  "note": "OpenZFS keeps pool-level tables by checksum type, keyed by checksum and block properties. This metadata is not a recovery copy. [ddt-code]\n\nIn the OpenZFS v2.3 pool properties, dedup_table_size counts on-disk table bytes, whereas dedupcached reports the table content resident in ARC. dedup_table_quota limits on-disk growth with approximate enforcement; it is not a RAM cap. Lowering it does not prune existing entries. [pool-properties]\n\nIn OpenZFS 2.3.4, over-quota lookups can update existing entries. New-entry writes fall back to non-deduplicated storage, subject to allocation and I/O success. [ddt-code]\n\nSetting dedup=off changes subsequent writes, not previously shared blocks or their tracking. [dedup-guide]\n\nPruning is a separate operation: ddtprune removes eligible older single-reference entries, not the corresponding payload blocks. [ddt-prune] [zio-free]\n\nWith fast_dedup, in-memory log entries have a separate zfs_dedup_log_mem_max budget, initialized from 1% of total RAM by default. This is not a bound on all deduplication memory. [dedup-tuning] [ddt-log]\n\nIn OpenZFS 2.3.4, the lookup key includes logical size, physical size, compression and the encryption-use flag alongside the checksum. Matching checksum bytes alone do not establish an interchangeable block representation. [ddt-code]\n\nIn v2.3, dedup=verify adds a byte-for-byte check with SHA-256. A read failure can also trigger fallback; ordinary storage after verification is not proof of a hash collision. This write-path check is not a pool-wide scrub. [dedup-properties] [ddt-verify]\n\nIn OpenZFS v2.3, Direct I/O writes bypass deduplication even with dedup=on. Requesting O_DIRECT does not prove that path: direct=disabled and unaligned write portions use buffered I/O. [direct-properties]",
  "status": "shipping",
  "advantages": [],
  "limitations": [],
  "related": [
    "deduplication",
    "zfs",
    "checksum"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "citations": [
    {
      "id": "dedup-tuning",
      "title": "OpenZFS v2.3: zfs(4), dedup log memory, flushing and import-time trade-offs",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/4/zfs.4.html#zfs_dedup_log_mem_max",
      "accessed": "2026-11-12"
    },
    {
      "id": "ddt-log",
      "title": "OpenZFS 2.3.4: dedup log memory initialization",
      "url": "https://github.com/openzfs/zfs/blob/34f96a15c73eab27dd6ad17bb5f1263bf26e37d7/module/zfs/ddt_log.c#L43-L82",
      "accessed": "2026-11-12"
    },
    {
      "id": "pool-properties",
      "title": "OpenZFS v2.3: zpoolprops(7), DDT size, cache residency and quota",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/7/zpoolprops.7.html",
      "accessed": "2026-11-12"
    },
    {
      "id": "ddt-code",
      "title": "OpenZFS 2.3.4: deduplication table entries and quota fallback",
      "url": "https://github.com/openzfs/zfs/blob/34f96a15c73eab27dd6ad17bb5f1263bf26e37d7/module/zfs/ddt.c",
      "accessed": "2026-11-12"
    },
    {
      "id": "dedup-guide",
      "title": "OpenZFS: Deduplication, changing the property and existing blocks",
      "url": "https://openzfs.github.io/openzfs-docs/Basic%20Concepts/Data%20Storage/Deduplication.html",
      "accessed": "2026-11-12"
    },
    {
      "id": "ddt-prune",
      "title": "OpenZFS v2.3: zpool-ddtprune(8), single-reference entry pruning",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/8/zpool-ddtprune.8.html",
      "accessed": "2026-11-12"
    },
    {
      "id": "zio-free",
      "title": "OpenZFS 2.3.4: zio_ddt_free handles previously pruned entries",
      "url": "https://github.com/openzfs/zfs/blob/34f96a15c73eab27dd6ad17bb5f1263bf26e37d7/module/zfs/zio.c#L3996-L4027",
      "accessed": "2026-11-12"
    },
    {
      "id": "dedup-properties",
      "title": "OpenZFS v2.3: zfsprops(7), dedup verification and checksum selection",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/7/zfsprops.7.html#dedup",
      "accessed": "2026-11-12"
    },
    {
      "id": "ddt-verify",
      "title": "OpenZFS 2.3.4: zio_ddt_collision and write fallback",
      "url": "https://github.com/openzfs/zfs/blob/34f96a15c73eab27dd6ad17bb5f1263bf26e37d7/module/zfs/zio.c#L3511-L3764",
      "accessed": "2026-11-12"
    },
    {
      "id": "direct-properties",
      "title": "OpenZFS v2.3: Direct I/O write paths and deduplication",
      "url": "https://openzfs.github.io/openzfs-docs/man/v2.3/7/zfsprops.7.html#direct",
      "accessed": "2026-11-13"
    }
  ],
  "updated": "2026-11-13",
  "provenance": [
    "Source review of OpenZFS v2.3 manuals and the 2.3.4 implementation at commit 34f96a15c73eab27dd6ad17bb5f1263bf26e37d7; not a claim about every ZFS version.",
    "No pool experiment, memory-sizing measurement or performance benchmark was performed."
  ]
}
