{"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":28,"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 v28.8 (Yoast SEO v28.8) - 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=\"Open source Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Open source Team\" \/>\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\":\"Open source Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/4bae5e5dd8c7d48edbd948772b49b202\"},\"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\\\/4bae5e5dd8c7d48edbd948772b49b202\"},\"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\\\/4bae5e5dd8c7d48edbd948772b49b202\",\"name\":\"Open source Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"caption\":\"Open source Team\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/open-source-team\\\/\"}]}<\/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":"Open source Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Open source Team","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":"Open source Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/4bae5e5dd8c7d48edbd948772b49b202"},"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\/4bae5e5dd8c7d48edbd948772b49b202"},"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\/4bae5e5dd8c7d48edbd948772b49b202","name":"Open source Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","caption":"Open source Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/open-source-team\/"}]}},"_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\/28"}],"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}]}}