{"id":9924,"date":"2017-04-04T06:23:30","date_gmt":"2017-04-04T04:23:30","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/"},"modified":"2017-04-04T06:23:30","modified_gmt":"2017-04-04T04:23:30","slug":"can-i-do-it-with-postgresql-14-optimizer-hints","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/","title":{"rendered":"Can I do it with PostgreSQL? \u2013 14 &#8211; optimizer hints"},"content":{"rendered":"<p>This is a question that comes up quite often: How can I use optimizer hints in PostgreSQL <a href=\"http:\/\/docs.oracle.com\/database\/122\/TGSQL\/influencing-the-optimizer.htm#TGSQL260\" target=\"_blank\" rel=\"noopener\">as I can do it in Oracle<\/a>? Well, you cant, and the reasons are this:<br \/>\n<a href=\"https:\/\/wiki.postgresql.org\/wiki\/OptimizerHintsDiscussion\" target=\"_blank\" rel=\"noopener\"><\/p>\n<ul>\n<li>Poor application code maintainability: hints in queries require massive refactoring.<\/li>\n<li>Interference with upgrades: today&#8217;s helpful hints become anti-performance after an upgrade.<\/li>\n<li>Encouraging bad DBA habits slap a hint on instead of figuring out the real issue.<\/li>\n<li>Does not scale with data size: the hint that&#8217;s right when a table is small is likely to be wrong when it gets larger.<\/li>\n<li>Failure to actually improve query performance: most of the time, the optimizer is actually right.<\/li>\n<li>Interfering with improving the query planner: people who use hints seldom report the query problem to the project.<\/li>\n<\/ul>\n<p><\/a><br \/>\nBut this does not mean that you cant influence the optimizer (or &#8220;planner&#8221; in PostgreSQL wording), it is just not working in the same way. Lets have a look.<\/p>\n<p><!--more--><\/p>\n<p>On of the reasons that the planner does not choose an index over a sequential scan is that the parameter <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE\" target=\"_blank\" rel=\"noopener\">effective_cache_size<\/a> is not set properly. To understand what it does you have to know that PostgreSQL works together with the operating system file cache\/disk cache very well. It is not required, as you do it in Oracle, to give most of the available memory of the server to the database. Usually you start with 25% of the total available memory and give that to PostgreSQL by setting the parameter <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/runtime-config-resource.html\" target=\"_blank\" rel=\"noopener\">shared_buffers<\/a> to that value. When pages fall out of that region it is still likely that they are available in the disk cache and can be retrieved from there without going down to disk. And this is what effective_cache_size is about: Setting this parameter does not consume more memory but is telling PostgreSQL how big the total cache of the system really is, so shared_buffers plus disk cache. This gets taken into consideration by the planner. A good starting point is 50 to 75% of the available memory. Lets do a quick test to show how this behaves. Lets generate some data:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# ! cat a.sql\ndrop table if exists t1;\ncreate table t1 ( a int );\nwith generator as \n ( select a.*\n     from generate_series ( 1, 5000000 ) a\n    order by random()\n )\ninsert into t1 ( a ) \n     select a\n       from generator;\ncreate index i1 on t1(a);\nanalyze verbose t1;\nselect * from pg_size_pretty ( pg_relation_size ('t1' ));\nselect * from pg_size_pretty ( pg_total_relation_size('t1'));\npostgres=# i a.sql\nDROP TABLE\nCREATE TABLE\nINSERT 0 5000000\nCREATE INDEX\npsql:a.sql:12: INFO:  analyzing \"public.t1\"\npsql:a.sql:12: INFO:  \"t1\": scanned 22124 of 22124 pages, containing 5000000 live rows and 0 dead rows; 30000 rows in sample, 5000000 estimated total rows\nANALYZE\n pg_size_pretty \n----------------\n 173 MB\n(1 row)\n pg_size_pretty \n----------------\n 280 MB\n(1 row)\npostgres=# show shared_buffers ;\n shared_buffers \n----------------\n 128MB\n(1 row)\n<\/pre>\n<p>The table without the index is big enough to not fit into shared_buffers (173MB) and even bigger of course including the index (280MB). When we set effective_cache_size to a very low value we get costs of 40.55 for the statement below (almost no disk cache):<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# SET effective_cache_size TO '1 MB';\nSET\npostgres=# explain SELECT * FROM t1 ORDER BY  a limit 10;\n                                     QUERY PLAN                                      \n-------------------------------------------------------------------------------------\n Limit  (cost=0.43..40.55 rows=10 width=4)\n   -&gt;  Index Only Scan using i1 on t1  (cost=0.43..20057243.41 rows=5000000 width=4)\n(2 rows)\n<\/pre>\n<p>Setting this to a more realistic value decreases the costs because it is expected to find the index in the disk cache:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# SET effective_cache_size TO '5 GB';\nSET\npostgres=# explain SELECT * FROM t1 ORDER BY  a limit 10;\n                                    QUERY PLAN                                     \n-----------------------------------------------------------------------------------\n Limit  (cost=0.43..0.87 rows=10 width=4)\n   -&gt;  Index Only Scan using i1 on t1  (cost=0.43..218347.46 rows=5000000 width=4)\n(2 rows)\n<\/pre>\n<p>This is the first &#8220;hint&#8221; you can set to influence the optimizer\/planner. But there are many others. What PostgreSQL allows you to do is to enable or disable features of the planner:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# select name from pg_settings where name like 'enable%';\n         name         \n----------------------\n enable_bitmapscan\n enable_hashagg\n enable_hashjoin\n enable_indexonlyscan\n enable_indexscan\n enable_material\n enable_mergejoin\n enable_nestloop\n enable_seqscan\n enable_sort\n enable_tidscan\n<\/pre>\n<p>Using the same data from above we could disable the index only scan:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\npostgres=# set enable_indexonlyscan=false;\nSET\npostgres=# explain (analyze,buffers) SELECT * FROM t1 ORDER BY  a limit 10;\n                                                       QUERY PLAN                                                        \n-------------------------------------------------------------------------------------------------------------------------\n Limit  (cost=0.43..0.87 rows=10 width=4) (actual time=0.019..0.058 rows=10 loops=1)\n   Buffers: shared hit=13\n   -&gt;  Index Scan using i1 on t1  (cost=0.43..218347.46 rows=5000000 width=4) (actual time=0.017..0.036 rows=10 loops=1)\n         Buffers: shared hit=13\n Planning time: 0.057 ms\n Execution time: 0.084 ms\n(6 rows)\n\npostgres=# set enable_indexonlyscan=true;\nSET\npostgres=# explain (analyze,buffers) SELECT * FROM t1 ORDER BY  a limit 10;\n                                                          QUERY PLAN                                                          \n------------------------------------------------------------------------------------------------------------------------------\n Limit  (cost=0.43..0.87 rows=10 width=4) (actual time=0.025..0.072 rows=10 loops=1)\n   Buffers: shared hit=13\n   -&gt;  Index Only Scan using i1 on t1  (cost=0.43..218347.46 rows=5000000 width=4) (actual time=0.023..0.048 rows=10 loops=1)\n         Heap Fetches: 10\n         Buffers: shared hit=13\n Planning time: 0.068 ms\n Execution time: 0.105 ms\n(7 rows)\n<\/pre>\n<p>But the documentation clearly states: <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/runtime-config-query.html\" target=\"_blank\" rel=\"noopener\">&#8220;If the default plan chosen by the optimizer for a particular query is not optimal, a <b>temporary solution<\/b> is to use one of these configuration parameters to force the optimizer to choose a different plan&#8221;.<\/a> For testing and troubleshooting this can be handy.<\/p>\n<p>Another way to influence the optimizer\/planner is to set the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/runtime-config-query.html#RUNTIME-CONFIG-QUERY-CONSTANTS\" target=\"_blank\" rel=\"noopener\">planner cost constants<\/a>:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">\n postgres=# select name from pg_settings where name like '%cost%' and name not like '%vacuum%';\n         name         \n----------------------\n cpu_index_tuple_cost\n cpu_operator_cost\n cpu_tuple_cost\n parallel_setup_cost\n parallel_tuple_cost\n random_page_cost\n seq_page_cost\"\n(7 rows)\n<\/pre>\n<p>What they mean is pretty well documented and how you need to set them (if you need to change them at all) depends on your hardware and application. There are others as well, such as the *collapse_limit* parameters and the parameters for the <a href=\"https:\/\/www.postgresql.org\/docs\/9.6\/static\/runtime-config-query.html#RUNTIME-CONFIG-QUERY-GEQO\" target=\"_blank\" rel=\"noopener\">Genetic Query Optimizer<\/a>. <\/p>\n<p>Conclusion: There are several ways you can influence the optimizer\/planner in PostgreSQL it is just not by using hints.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a question that comes up quite often: How can I use optimizer hints in PostgreSQL as I can do it in Oracle? Well, you cant, and the reasons are this: Poor application code maintainability: hints in queries require massive refactoring. Interference with upgrades: today&#8217;s helpful hints become anti-performance after an upgrade. Encouraging bad [&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":[349,77],"type_dbi":[],"class_list":["post-9924","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-optimizer","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>Can I do it with PostgreSQL? \u2013 14 - optimizer hints - 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\/can-i-do-it-with-postgresql-14-optimizer-hints\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Can I do it with PostgreSQL? \u2013 14 - optimizer hints\" \/>\n<meta property=\"og:description\" content=\"This is a question that comes up quite often: How can I use optimizer hints in PostgreSQL as I can do it in Oracle? Well, you cant, and the reasons are this: Poor application code maintainability: hints in queries require massive refactoring. Interference with upgrades: today&#8217;s helpful hints become anti-performance after an upgrade. Encouraging bad [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-04T04:23:30+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=\"5 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\/can-i-do-it-with-postgresql-14-optimizer-hints\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"Can I do it with PostgreSQL? \u2013 14 &#8211; optimizer hints\",\"datePublished\":\"2017-04-04T04:23:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/\"},\"wordCount\":604,\"commentCount\":0,\"keywords\":[\"Optimizer\",\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/\",\"name\":\"Can I do it with PostgreSQL? \u2013 14 - optimizer hints - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2017-04-04T04:23:30+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Can I do it with PostgreSQL? \u2013 14 &#8211; optimizer hints\"}]},{\"@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":"Can I do it with PostgreSQL? \u2013 14 - optimizer hints - 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\/can-i-do-it-with-postgresql-14-optimizer-hints\/","og_locale":"en_US","og_type":"article","og_title":"Can I do it with PostgreSQL? \u2013 14 - optimizer hints","og_description":"This is a question that comes up quite often: How can I use optimizer hints in PostgreSQL as I can do it in Oracle? Well, you cant, and the reasons are this: Poor application code maintainability: hints in queries require massive refactoring. Interference with upgrades: today&#8217;s helpful hints become anti-performance after an upgrade. Encouraging bad [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/","og_site_name":"dbi Blog","article_published_time":"2017-04-04T04:23:30+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"Can I do it with PostgreSQL? \u2013 14 &#8211; optimizer hints","datePublished":"2017-04-04T04:23:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/"},"wordCount":604,"commentCount":0,"keywords":["Optimizer","PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/","url":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/","name":"Can I do it with PostgreSQL? \u2013 14 - optimizer hints - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2017-04-04T04:23:30+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/can-i-do-it-with-postgresql-14-optimizer-hints\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Can I do it with PostgreSQL? \u2013 14 &#8211; optimizer hints"}]},{"@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\/9924","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=9924"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9924\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=9924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=9924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=9924"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=9924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}