{"id":16012,"date":"2021-03-22T12:13:00","date_gmt":"2021-03-22T11:13:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/"},"modified":"2021-03-22T12:13:00","modified_gmt":"2021-03-22T11:13:00","slug":"postgresql-14-lz4-compression-for-toast","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/","title":{"rendered":"PostgreSQL 14: LZ4 compression for TOAST"},"content":{"rendered":"<p>In PostgreSQL a row or tuple can not span multiple pages (a page is typically 8kB), but of course you can store larger rows and PostgreSQL brakes and compresses these rows into smaller chunks by using a technique called <a href=\"https:\/\/www.postgresql.org\/docs\/current\/storage-toast.html\" target=\"_blank\" rel=\"noopener\">TOAST<\/a>. Once your table contains a toast-able data type a so-called toast table is created automatically. Up to PostgreSQL 13 you had no choice how the data is compressed, but a recent <a href=\"https:\/\/git.postgresql.org\/gitweb\/?p=postgresql.git;a=commit;h=bbe0a81db69bd10bd166907c3701492a29aca294\" target=\"_blank\" rel=\"noopener\">commit<\/a> brings the option to use <a href=\"https:\/\/en.wikipedia.org\/wiki\/LZ4_(compression_algorithm)\" target=\"_blank\" rel=\"noopener\">LZ4<\/a> as compression method for TOAST. As you can read in the Wikipedia article, LZ4 is all about compression and decompression speed, so let&#8217;s have a look.<\/p>\n<p><!--more--><\/p>\n<p>If you want to make use of this new feature, you need to compile PostgreSQL with support for it:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/postgresql\/ [pgdev] .\/configure --help | grep LZ4\n  --with-lz4              build with LZ4 support\n  LZ4_CFLAGS  C compiler flags for LZ4, overriding pkg-config\n  LZ4_LIBS    linker flags for LZ4, overriding pkg-config\n<\/pre>\n<p>For that to work, the operating system needs to have the corresponding libraries installed. For Debian this is:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/postgresql\/ [pgdev] apt search liblz4-dev\nSorting... Done\nFull Text Search... Done\nliblz4-dev\/stable,now 1.8.3-1 amd64 [installed]\n  Fast LZ compression algorithm library - development files\n<\/pre>\n<p>Having that ready and PostgreSQL compiled and installed, lets create two tables: One with the default compression and one with the new LZ4 compression:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create table t1 ( a text );\nCREATE TABLE\npostgres=# create table t2 ( a text compression LZ4 );\nCREATE TABLE\npostgres=# d+ t1\n                                          Table \"public.t1\"\n Column | Type | Collation | Nullable | Default | Storage  | Compression | Stats target | Description \n--------+------+-----------+----------+---------+----------+-------------+--------------+-------------\n a      | text |           |          |         | extended | pglz        |              | \nAccess method: heap\n\npostgres=# d+ t2\n                                          Table \"public.t2\"\n Column | Type | Collation | Nullable | Default | Storage  | Compression | Stats target | Description \n--------+------+-----------+----------+---------+----------+-------------+--------------+-------------\n a      | text |           |          |         | extended | lz4         |              | \nAccess method: heap\n<\/pre>\n<p>Both tables automatically got a toast table attached:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select reltoastrelid from pg_class where relname in ('t1','t2');\n reltoastrelid \n---------------\n         16387\n         16392\n(2 rows)\n\npostgres=# select oid,relname from pg_class where oid in (16387,16392 );\n  oid  |    relname     \n-------+----------------\n 16387 | pg_toast_16384\n 16392 | pg_toast_16389\n(2 rows)\n\npostgres=# d+ pg_toast.pg_toast_16384\nTOAST table \"pg_toast.pg_toast_16384\"\n   Column   |  Type   | Storage \n------------+---------+---------\n chunk_id   | oid     | plain\n chunk_seq  | integer | plain\n chunk_data | bytea   | plain\nOwning table: \"public.t1\"\nIndexes:\n    \"pg_toast_16384_index\" PRIMARY KEY, btree (chunk_id, chunk_seq)\nAccess method: heap\n\npostgres=# d+ pg_toast.pg_toast_16389\nTOAST table \"pg_toast.pg_toast_16389\"\n   Column   |  Type   | Storage \n------------+---------+---------\n chunk_id   | oid     | plain\n chunk_seq  | integer | plain\n chunk_data | bytea   | plain\nOwning table: \"public.t2\"\nIndexes:\n    \"pg_toast_16389_index\" PRIMARY KEY, btree (chunk_id, chunk_seq)\nAccess method: heap\n<\/pre>\n<p>Let&#8217;s check if there is a difference if we populate those tables with some dummy data:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# timing on\nTiming is on.\npostgres=# insert into t1(a) select lpad('a',1000000,'a') from generate_series(1,1000);\nINSERT 0 1000\nTime: 4643.583 ms (00:04.644)\npostgres=# insert into t2(a) select lpad('a',1000000,'a') from generate_series(1,1000);\nINSERT 0 1000\nTime: 314.107 ms\npostgres=# truncate table t1,t2;\nTRUNCATE TABLE\nTime: 4143.579 ms (00:04.144)\npostgres=# insert into t1(a) select lpad('a',1000000,'a') from generate_series(1,1000);\nINSERT 0 1000\nTime: 4759.809 ms (00:04.760)\npostgres=# insert into t2(a) select lpad('a',1000000,'a') from generate_series(1,1000);\nINSERT 0 1000\nTime: 1011.221 ms (00:01.011)\npostgres=# truncate table t1,t2;\nTRUNCATE TABLE\nTime: 41.449 ms\npostgres=# insert into t1(a) select lpad('a',1000000,'a') from generate_series(1,1000);\nINSERT 0 1000\nTime: 4507.416 ms (00:04.507)\npostgres=# insert into t2(a) select lpad('a',1000000,'a') from generate_series(1,1000);\nINSERT 0 1000\nTime: 299.458 ms\n<\/pre>\n<p>This is a huge difference, and I&#8217;ve repeated that test several times and got almost the same numbers. That&#8217;s really a great improvement regarding speed. But what about the size on disk?<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select relname,reltoastrelid from pg_class where relname in ('t1','t2');\n relname | reltoastrelid \n---------+---------------\n t1      |         16387\n t2      |         16392\n(2 rows)\n\nTime: 3.091 ms\npostgres=# select oid,relname from pg_class where oid in (16387,16392);\n  oid  |    relname     \n-------+----------------\n 16387 | pg_toast_16384\n 16392 | pg_toast_16389\n(2 rows)\n\nTime: 0.836 ms\npostgres=# select pg_size_pretty(pg_relation_size('pg_toast.pg_toast_16384'));\n pg_size_pretty \n----------------\n 12 MB\n(1 row)\n\nTime: 0.506 ms\npostgres=# select pg_size_pretty(pg_relation_size('pg_toast.pg_toast_16389'));\n pg_size_pretty \n----------------\n 4000 kB\n(1 row)\n\nTime: 0.743 ms\n<\/pre>\n<p>Quite impressive. In addition to the speed, we also get a great reduction on disk. Because compression is better with LZ4, we see fewer rows in the toast table for t2:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select count(*) from pg_toast.pg_toast_16384;\n count \n-------\n  6000\n(1 row)\n\nTime: 5.807 ms\npostgres=# select count(*) from pg_toast.pg_toast_16389;\n count \n-------\n  2000\n(1 row)\n<\/pre>\n<p>Of course the string I used here is not very representative, but this new feature really looks promising. There is also a new parameter if you want to change to this behavior globally;<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# show default_toast_compression ;\n default_toast_compression \n---------------------------\n pglz\n(1 row)\npostgres=# alter system set default_toast_compression = 'lz4';\nALTER SYSTEM\npostgres=# select pg_reload_conf();\n pg_reload_conf \n----------------\n t\n(1 row)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>In PostgreSQL a row or tuple can not span multiple pages (a page is typically 8kB), but of course you can store larger rows and PostgreSQL brakes and compresses these rows into smaller chunks by using a technique called TOAST. Once your table contains a toast-able data type a so-called toast table is created automatically. [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-16012","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL 14: LZ4 compression for TOAST - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL 14: LZ4 compression for TOAST\" \/>\n<meta property=\"og:description\" content=\"In PostgreSQL a row or tuple can not span multiple pages (a page is typically 8kB), but of course you can store larger rows and PostgreSQL brakes and compresses these rows into smaller chunks by using a technique called TOAST. Once your table contains a toast-able data type a so-called toast table is created automatically. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-22T11:13:00+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL 14: LZ4 compression for TOAST\",\"datePublished\":\"2021-03-22T11:13:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/\"},\"wordCount\":293,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/\",\"name\":\"PostgreSQL 14: LZ4 compression for TOAST - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2021-03-22T11:13:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-14-lz4-compression-for-toast\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL 14: LZ4 compression for TOAST\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\\\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/westermanndanie\"],\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/daniel-westermann\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL 14: LZ4 compression for TOAST - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL 14: LZ4 compression for TOAST","og_description":"In PostgreSQL a row or tuple can not span multiple pages (a page is typically 8kB), but of course you can store larger rows and PostgreSQL brakes and compresses these rows into smaller chunks by using a technique called TOAST. Once your table contains a toast-able data type a so-called toast table is created automatically. [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/","og_site_name":"dbi Blog","article_published_time":"2021-03-22T11:13:00+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL 14: LZ4 compression for TOAST","datePublished":"2021-03-22T11:13:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/"},"wordCount":293,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/","name":"PostgreSQL 14: LZ4 compression for TOAST - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2021-03-22T11:13:00+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-14-lz4-compression-for-toast\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL 14: LZ4 compression for TOAST"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/16012","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=16012"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/16012\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=16012"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=16012"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=16012"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=16012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}