{"id":13328,"date":"2020-01-20T07:06:17","date_gmt":"2020-01-20T06:06:17","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/"},"modified":"2020-01-20T07:06:17","modified_gmt":"2020-01-20T06:06:17","slug":"postgresql-13-parallel-vacuum-for-indexes","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/","title":{"rendered":"PostgreSQL 13: parallel vacuum for indexes"},"content":{"rendered":"<p>Because of its implementation of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multiversion_concurrency_control\" target=\"_blank\" rel=\"noopener noreferrer\">MVCC<\/a> PostgreSQL needs a way to cleanup old\/dead rows and this is the responsibility of <a href=\"https:\/\/www.postgresql.org\/docs\/current\/routine-vacuuming.html\" target=\"_blank\" rel=\"noopener noreferrer\">vacuum<\/a>. Up to PostgreSQL 12 this is done table per table and index per index. There are a lot of parameters to fine tune <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-autovacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">auto vacuum<\/a> but none of those allowed vacuum to run in parallel against a relation. The only option you had to allow auto vacuum to do more work in parallel was to increase <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-autovacuum.html#GUC-AUTOVACUUM-MAX-WORKERS\" target=\"_blank\" rel=\"noopener noreferrer\">autovacuum_max_workers<\/a> so that more relations can be worked on at the same time. Working against multiple indexes of the same table was not possible. Once PostgreSQL 13 will be released this will change.<\/p>\n<p><!--more--><\/p>\n<p>When you have a look at the help of vacuum you will notice a new option:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [1,18]\">\npostgres=# h vacuum\nCommand:     VACUUM\nDescription: garbage-collect and optionally analyze a database\nSyntax:\nVACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]\nVACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]\n\nwhere option can be one of:\n\n    FULL [ boolean ]\n    FREEZE [ boolean ]\n    VERBOSE [ boolean ]\n    ANALYZE [ boolean ]\n    DISABLE_PAGE_SKIPPING [ boolean ]\n    SKIP_LOCKED [ boolean ]\n    INDEX_CLEANUP [ boolean ]\n    TRUNCATE [ boolean ]\n    PARALLEL integer\n\nand table_and_columns is:\n\n    table_name [ ( column_name [, ...] ) ]\n\nURL: https:\/\/www.postgresql.org\/docs\/devel\/sql-vacuum.html\n<\/pre>\n<p>By providing a positive integer to the &#8220;PARALLEL&#8221; option you tell vacuum how many background workers should be used to vacuum indexes for a given table (0 will disable parallel processing). Lets do a small test setup to demonstrate this:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# create table t1 as select i as a, i::text as b, now() as c from generate_series(1,3000000) i;\nSELECT 3000000\npostgres=# create index i1 on t1(a);\nCREATE INDEX\npostgres=# \npostgres=# create index i2 on t1(b);\nCREATE INDEX\npostgres=# create index i3 on t1(c);\nCREATE INDEX\n<\/pre>\n<p>One table, four indexes. If we go for parallel 4 we should see four background workers doing the work against the indexes:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# update t1 set a=5,b='ccc',c=now() where mod(a,5)=0;\nUPDATE 600000\npostgres=# vacuum (parallel 4) t1;\nVACUUM\n<\/pre>\n<p>As the table and the indexes are quite small we need to be fast but at least 2 parallel workers show up in the process list for the vacuum operation:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres 16688 15925 13 07:30 ?        00:01:07 postgres: postgres postgres [local] VACUUM\npostgres 19184 15925  0 07:39 ?        00:00:00 postgres: parallel worker for PID 16688   \npostgres 19185 15925  0 07:39 ?        00:00:00 postgres: parallel worker for PID 16688   \n<\/pre>\n<p>Nice. Please note that indexes are only considered for parallel vacuum when they meet the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-query.html\" target=\"_blank\" rel=\"noopener noreferrer\">min_parallel_index_scan_size<\/a> criteria. For FULL vacuum there will be no parallel processing as well.<\/p>\n<p>Btw: The current maximal value is 1024:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# vacuum (parallel -4) t1;\nERROR:  parallel vacuum degree must be between 0 and 1024\nLINE 1: vacuum (parallel -4) t1;\n<\/pre>\n<p>You can also see the parallel stuff on the verbose output:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [3]\">\npostgres=# vacuum (parallel 4, verbose true) t1;\nINFO:  vacuuming \"public.t1\"\nINFO:  launched 2 parallel vacuum workers for index vacuuming (planned: 2)\nINFO:  scanned index \"i2\" to remove 600000 row versions by parallel vacuum worker\nDETAIL:  CPU: user: 0.24 s, system: 0.06 s, elapsed: 0.89 s\nINFO:  scanned index \"i1\" to remove 600000 row versions\nDETAIL:  CPU: user: 0.17 s, system: 0.10 s, elapsed: 1.83 s\nINFO:  scanned index \"i3\" to remove 600000 row versions by parallel vacuum worker\nDETAIL:  CPU: user: 0.16 s, system: 0.14 s, elapsed: 1.69 s\nINFO:  scanned index \"i4\" to remove 600000 row versions by parallel vacuum worker\nDETAIL:  CPU: user: 0.25 s, system: 0.09 s, elapsed: 1.17 s\nINFO:  \"t1\": removed 600000 row versions in 20452 pages\nDETAIL:  CPU: user: 0.17 s, system: 0.16 s, elapsed: 1.43 s\nINFO:  index \"i1\" now contains 3000000 row versions in 14308 pages\nDETAIL:  600000 index row versions were removed.\n1852 index pages have been deleted, 640 are currently reusable.\nCPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.\nINFO:  index \"i2\" now contains 3000000 row versions in 14305 pages\nDETAIL:  600000 index row versions were removed.\n1851 index pages have been deleted, 640 are currently reusable.\nCPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.\nINFO:  index \"i3\" now contains 3000000 row versions in 14326 pages\nDETAIL:  600000 index row versions were removed.\n3941 index pages have been deleted, 1603 are currently reusable.\nCPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.\nINFO:  index \"i4\" now contains 3000000 row versions in 23391 pages\nDETAIL:  600000 index row versions were removed.\n5527 index pages have been deleted, 2246 are currently reusable.\nCPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.\nINFO:  \"t1\": found 600000 removable, 3000000 nonremovable row versions in 21835 out of 22072 pages\nDETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 499\nThere were 132 unused item identifiers.\nSkipped 0 pages due to buffer pins, 237 frozen pages.\n0 pages are entirely empty.\nCPU: user: 0.75 s, system: 0.36 s, elapsed: 5.07 s.\nINFO:  vacuuming \"pg_toast.pg_toast_16392\"\nINFO:  index \"pg_toast_16392_index\" now contains 0 row versions in 1 pages\nDETAIL:  0 index row versions were removed.\n0 index pages have been deleted, 0 are currently reusable.\nCPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.\nINFO:  \"pg_toast_16392\": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages\nDETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 499\nThere were 0 unused item identifiers.\nSkipped 0 pages due to buffer pins, 0 frozen pages.\n0 pages are entirely empty.\nCPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.\nVACUUM\n\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Because of its implementation of MVCC PostgreSQL needs a way to cleanup old\/dead rows and this is the responsibility of vacuum. Up to PostgreSQL 12 this is done table per table and index per index. There are a lot of parameters to fine tune auto vacuum but none of those allowed vacuum to run in [&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-13328","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 13: parallel vacuum for indexes - 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-13-parallel-vacuum-for-indexes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL 13: parallel vacuum for indexes\" \/>\n<meta property=\"og:description\" content=\"Because of its implementation of MVCC PostgreSQL needs a way to cleanup old\/dead rows and this is the responsibility of vacuum. Up to PostgreSQL 12 this is done table per table and index per index. There are a lot of parameters to fine tune auto vacuum but none of those allowed vacuum to run in [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-20T06:06:17+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-13-parallel-vacuum-for-indexes\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-13-parallel-vacuum-for-indexes\\\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL 13: parallel vacuum for indexes\",\"datePublished\":\"2020-01-20T06:06:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-13-parallel-vacuum-for-indexes\\\/\"},\"wordCount\":270,\"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-13-parallel-vacuum-for-indexes\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-13-parallel-vacuum-for-indexes\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-13-parallel-vacuum-for-indexes\\\/\",\"name\":\"PostgreSQL 13: parallel vacuum for indexes - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2020-01-20T06:06:17+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-13-parallel-vacuum-for-indexes\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-13-parallel-vacuum-for-indexes\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/postgresql-13-parallel-vacuum-for-indexes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL 13: parallel vacuum for indexes\"}]},{\"@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 13: parallel vacuum for indexes - 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-13-parallel-vacuum-for-indexes\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL 13: parallel vacuum for indexes","og_description":"Because of its implementation of MVCC PostgreSQL needs a way to cleanup old\/dead rows and this is the responsibility of vacuum. Up to PostgreSQL 12 this is done table per table and index per index. There are a lot of parameters to fine tune auto vacuum but none of those allowed vacuum to run in [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/","og_site_name":"dbi Blog","article_published_time":"2020-01-20T06:06:17+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-13-parallel-vacuum-for-indexes\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL 13: parallel vacuum for indexes","datePublished":"2020-01-20T06:06:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/"},"wordCount":270,"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-13-parallel-vacuum-for-indexes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/","name":"PostgreSQL 13: parallel vacuum for indexes - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2020-01-20T06:06:17+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-13-parallel-vacuum-for-indexes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL 13: parallel vacuum for indexes"}]},{"@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\/13328","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=13328"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/13328\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=13328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=13328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=13328"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=13328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}