{"id":43477,"date":"2026-03-13T08:16:59","date_gmt":"2026-03-13T07:16:59","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=43477"},"modified":"2026-03-13T08:17:02","modified_gmt":"2026-03-13T07:17:02","slug":"postgresql-19-pg_plan_advice","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/","title":{"rendered":"PostgreSQL 19: pg_plan_advice"},"content":{"rendered":"\n<p>In our <a href=\"https:\/\/www.dbi-services.com\/courses\/postgresql-performance-tuning\/\" target=\"_blank\" rel=\"noreferrer noopener\">performance tuning workshop<\/a>, especially when attendees have an Oracle background, one question for sure pops up every time: How can I use optimizer hints in PostgreSQL. Up until today there are three answers to this:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You simply can&#8217;t, there are no hints<\/li>\n\n\n\n<li>You might consider using the <a href=\"https:\/\/github.com\/ossc-db\/pg_hint_plan\" target=\"_blank\" rel=\"noreferrer noopener\">pg_hint_plan<\/a> extension<\/li>\n\n\n\n<li>Not really hints, but you can tell the optimizer to <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-query.html\" target=\"_blank\" rel=\"noreferrer noopener\">make certain operations more expensive<\/a>, so other operations might be chosen<\/li>\n<\/ul>\n\n\n\n<p>Well, now we need to update the workshop material because this was <a href=\"https:\/\/git.postgresql.org\/gitweb\/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc\" target=\"_blank\" rel=\"noreferrer noopener\">committed<\/a> for PostgreSQL 19 yesterday. The feature is not called &#8220;hints&#8221; but it does exactly that: Tell the optimizer what to do because you (might) know it better and you want a specific plan for a given query. Just be aware that this comes with the same issues as listed <a href=\"https:\/\/wiki.postgresql.org\/wiki\/OptimizerHintsDiscussion\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<p>The new feature comes as an extension so you need to enable it before you can use it. There are three ways to do this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [2,8,15,17]; title: ; notranslate\" title=\"\">\n-- current session\npostgres=# load &#039;pg_plan_advice&#039;;\nLOAD\n\n-- for all new sessions\npostgres=# alter system set session_preload_libraries = &#039;pg_plan_advice&#039;;\nALTER SYSTEM\npostgres=# select pg_reload_conf();\n pg_reload_conf \n----------------\n t\n(1 row)\n\n-- instance wide\npostgres=# alter system set shared_preload_libraries = &#039;pg_plan_advice&#039;;\nALTER SYSTEM\npostgres=# select pg_reload_conf();\n pg_reload_conf \n----------------\n t\n(1 row)\n<\/pre><\/div>\n\n\n<p>To see this in action, let&#8217;s create a small demo setup:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3,5,7,9]; title: ; notranslate\" title=\"\">\npostgres=# create table t1 ( a int primary key, b text );\nCREATE TABLE\npostgres=# create table t2 ( a int, b int references t1(a), v text );\nCREATE TABLE\npostgres=# insert into t1 select i, md5(i::text) from generate_series(1,1000000) i;\nINSERT 0 1000000\npostgres=# insert into t2 select i, i, md5(i::text) from generate_series(1,1000000) i;\nINSERT 0 1000000\npostgres=# insert into t2 select i, 1, md5(i::text) from generate_series(1000000,2000000) i;\nINSERT 0 1000001\n<\/pre><\/div>\n\n\n<p>A simple parent child relation having a single match from one to one million and one million and one matches for the value one of the parent table.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.postgresql.org\/docs\/devel\/using-explain.html\">EXPLAIN<\/a> comes with a new option to generate the so called advice string for a given query, e.g.:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,15,16,17,18,19,20]; title: ; notranslate\" title=\"\">\npostgres=# explain (plan_advice) select * from t1 join t2 on t1.a = t2.b;\n                                        QUERY PLAN                                        \n------------------------------------------------------------------------------------------\n Nested Loop  (cost=0.43..111805.81 rows=2000001 width=78)\n   -&gt;  Seq Scan on t2  (cost=0.00..48038.01 rows=2000001 width=41)\n   -&gt;  Memoize  (cost=0.43..0.47 rows=1 width=37)\n         Cache Key: t2.b\n         Cache Mode: logical\n         Estimates: capacity=29629 distinct keys=29629 lookups=2000001 hit percent=98.52%\n         -&gt;  Index Scan using t1_pkey on t1  (cost=0.42..0.46 rows=1 width=37)\n               Index Cond: (a = t2.b)\n JIT:\n   Functions: 8\n   Options: Inlining false, Optimization false, Expressions true, Deforming true\n Generated Plan Advice:\n   JOIN_ORDER(t2 t1)\n   NESTED_LOOP_MEMOIZE(t1)\n   SEQ_SCAN(t2)\n   INDEX_SCAN(t1 public.t1_pkey)\n   NO_GATHER(t1 t2)\n(17 rows)\n<\/pre><\/div>\n\n\n<p>What you see here are advice tags, and the full list of those tags is documented in <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/pgplanadvice.html#PGPLANADVICE-TAGS\" target=\"_blank\" rel=\"noreferrer noopener\">documentation<\/a> of the extension. First we have the join order, then nested loop memoize, a sequential scan on t2 and an index scan on the primary key of the parent table and finally an instruction that neither t1 nor t2 should appear under a gather node.<\/p>\n\n\n\n<p>This can be given as an advice to the optimizer\/planner:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,2,16,17,18,19,20,21,22,23,24,25,26,27,28]; title: ; notranslate\" title=\"\">\npostgres=# SET pg_plan_advice.advice = &#039;JOIN_ORDER(t2 t1) NESTED_LOOP_MEMOIZE(t1) SEQ_SCAN(t2) INDEX_SCAN(t1 public.t1_pkey) NO_GATHER(t1 t2)&#039;;\nSET\npostgres=# explain (plan_advice) select * from t1 join t2 on t1.a = t2.b;\n                                        QUERY PLAN                                        \n------------------------------------------------------------------------------------------\n Nested Loop  (cost=0.43..111805.81 rows=2000001 width=78)\n   -&gt;  Seq Scan on t2  (cost=0.00..48038.01 rows=2000001 width=41)\n   -&gt;  Memoize  (cost=0.43..0.47 rows=1 width=37)\n         Cache Key: t2.b\n         Cache Mode: logical\n         Estimates: capacity=29629 distinct keys=29629 lookups=2000001 hit percent=98.52%\n         -&gt;  Index Scan using t1_pkey on t1  (cost=0.42..0.46 rows=1 width=37)\n               Index Cond: (a = t2.b)\n JIT:\n   Functions: 8\n   Options: Inlining false, Optimization false, Expressions true, Deforming true\n Supplied Plan Advice:\n   SEQ_SCAN(t2) \/* matched *\/\n   INDEX_SCAN(t1 public.t1_pkey) \/* matched *\/\n   JOIN_ORDER(t2 t1) \/* matched *\/\n   NESTED_LOOP_MEMOIZE(t1) \/* matched *\/\n   NO_GATHER(t1) \/* matched *\/\n   NO_GATHER(t2) \/* matched *\/\n Generated Plan Advice:\n   JOIN_ORDER(t2 t1)\n   NESTED_LOOP_MEMOIZE(t1)\n   SEQ_SCAN(t2)\n   INDEX_SCAN(t1 public.t1_pkey)\n   NO_GATHER(t1 t2)\n(24 rows)\n<\/pre><\/div>\n\n\n<p>Running the next explain with that advice will show you what you&#8217;ve advised the planner to do and what was actually done. In this case all the advises matched and you get the same plan as before.<\/p>\n\n\n\n<p>Once you play e.g. with the join order, the plan will change because you told the planner to do so:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3,16,17,18,19,20,21,22,23]; title: ; notranslate\" title=\"\">\npostgres=# SET pg_plan_advice.advice = &#039;JOIN_ORDER(t1 t2)&#039;;\nSET\npostgres=# explain (plan_advice) select * from t1 join t2 on t1.a = t2.b;\n                                    QUERY PLAN                                     \n-----------------------------------------------------------------------------------\n Merge Join  (cost=323875.24..390697.00 rows=2000001 width=78)\n   Merge Cond: (t1.a = t2.b)\n   -&gt;  Index Scan using t1_pkey on t1  (cost=0.42..34317.43 rows=1000000 width=37)\n   -&gt;  Materialize  (cost=318880.31..328880.31 rows=2000001 width=41)\n         -&gt;  Sort  (cost=318880.31..323880.31 rows=2000001 width=41)\n               Sort Key: t2.b\n               -&gt;  Seq Scan on t2  (cost=0.00..48038.01 rows=2000001 width=41)\n JIT:\n   Functions: 7\n   Options: Inlining false, Optimization false, Expressions true, Deforming true\n Supplied Plan Advice:\n   JOIN_ORDER(t1 t2) \/* matched *\/\n Generated Plan Advice:\n   JOIN_ORDER(t1 t2)\n   MERGE_JOIN_MATERIALIZE(t2)\n   SEQ_SCAN(t2)\n   INDEX_SCAN(t1 public.t1_pkey)\n   NO_GATHER(t1 t2)\n(18 rows)\n<\/pre><\/div>\n\n\n<p>Really nice, now there is an official way to influence the planner using advises but please be aware of the current <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/pgplanadvice.html#PGPLANADVICE-LIMITATIONS\" target=\"_blank\" rel=\"noreferrer noopener\">limitations<\/a>. Needless to say, that you should use this with caution, because you can easily make things slower by advising what is not optimal for a query.<\/p>\n\n\n\n<p>Thanks to all involved with this, this is really a great improvement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In our performance tuning workshop, especially when attendees have an Oracle background, one question for sure pops up every time: How can I use optimizer hints in PostgreSQL. Up until today there are three answers to this: Well, now we need to update the workshop material because this was committed for PostgreSQL 19 yesterday. The [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,198],"tags":[77],"type_dbi":[],"class_list":["post-43477","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL 19: pg_plan_advice - 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-19-pg_plan_advice\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL 19: pg_plan_advice\" \/>\n<meta property=\"og:description\" content=\"In our performance tuning workshop, especially when attendees have an Oracle background, one question for sure pops up every time: How can I use optimizer hints in PostgreSQL. Up until today there are three answers to this: Well, now we need to update the workshop material because this was committed for PostgreSQL 19 yesterday. The [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-13T07:16:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-13T07:17:02+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=\"2 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-19-pg_plan_advice\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL 19: pg_plan_advice\",\"datePublished\":\"2026-03-13T07:16:59+00:00\",\"dateModified\":\"2026-03-13T07:17:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/\"},\"wordCount\":418,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/\",\"name\":\"PostgreSQL 19: pg_plan_advice - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2026-03-13T07:16:59+00:00\",\"dateModified\":\"2026-03-13T07:17:02+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL 19: pg_plan_advice\"}]},{\"@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 19: pg_plan_advice - 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-19-pg_plan_advice\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL 19: pg_plan_advice","og_description":"In our performance tuning workshop, especially when attendees have an Oracle background, one question for sure pops up every time: How can I use optimizer hints in PostgreSQL. Up until today there are three answers to this: Well, now we need to update the workshop material because this was committed for PostgreSQL 19 yesterday. The [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/","og_site_name":"dbi Blog","article_published_time":"2026-03-13T07:16:59+00:00","article_modified_time":"2026-03-13T07:17:02+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL 19: pg_plan_advice","datePublished":"2026-03-13T07:16:59+00:00","dateModified":"2026-03-13T07:17:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/"},"wordCount":418,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring","Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/","name":"PostgreSQL 19: pg_plan_advice - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-03-13T07:16:59+00:00","dateModified":"2026-03-13T07:17:02+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-19-pg_plan_advice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL 19: pg_plan_advice"}]},{"@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\/43477","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=43477"}],"version-history":[{"count":7,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/43477\/revisions"}],"predecessor-version":[{"id":43484,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/43477\/revisions\/43484"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=43477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=43477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=43477"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=43477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}