{"id":10450,"date":"2017-08-26T14:33:39","date_gmt":"2017-08-26T12:33:39","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/"},"modified":"2017-08-26T14:33:39","modified_gmt":"2017-08-26T12:33:39","slug":"postgres-vs-oracle-access-paths-xi","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/","title":{"rendered":"Postgres vs. Oracle access paths XI &#8211; Sample Scan"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nI was going to end this series with the <a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-x\/\" target=\"_blank\" rel=\"noopener noreferrer\">previous post<\/a> because the last access path available in Postgres is a bit special: a Seq Scan that returns only a sample of the rows, at random. However, it is the occasion to come back to the difference between random and sequential reads.<br \/>\n<!--more--><\/p>\n<p>I&#8217;m still working on the same table as in the previous posts, with 10000 rows in 1429 pages. 5% of rows is 500 rows and 5% of blocks is about 72 pages.<\/p>\n<h3>Rows<\/h3>\n<p>Sometimes, you can answer your business question on a sample of rows, when you need an approximate result, trend or pattern Let&#8217;s say that you want to sum() on only 5 percent of rows:<\/p>\n<pre><code>explain (analyze,verbose,costs,buffers) select  sum(a) from demo1 tablesample bernoulli(5) ;\n                                                      QUERY PLAN\n----------------------------------------------------------------------------------------------------------------------\n Aggregate  (cost=1435.25..1435.26 rows=1 width=8) (actual time=1.940..1.940 rows=1 loops=1)\n   Output: sum(a)\n   Buffers: shared hit=1429\n   -&gt;  Sample Scan on public.demo1  (cost=0.00..1434.00 rows=500 width=4) (actual time=0.007..1.890 rows=509 loops=1)\n         Output: n, a, x\n         Sampling: bernoulli ('5'::real)\n         Buffers: shared hit=1429\n Planning time: 0.373 ms\n Execution time: 1.956 ms<\/code><\/pre>\n<p>This row sampling reads all rows and picks a sample of them at random. Unfortunately, it reads all blocks because you cannot get a good sample if you don&#8217;t know how many rows you have in each block. Working on a sample can make sense if you want to apply complex operations on the result. Here the cost in the database is similar to a Seq Scan: 1429 blocks read at seq_page_cost=1, but the sum() applied on 500 rows (cpu_operator_cost=0.0025) and 500 tuples from the scan and 1 tuple for the result, with cpu_tuple_cost=0.01<\/p>\n<p>From execution statistics, you can see that the result is exactly what we asked: 500 rows returned.<\/p>\n<p>Oracle has a different syntax and different algorithm:<\/p>\n<pre><code>PLAN_TABLE_OUTPUT\n------------------------------------------------------------------------------------------------------------------------------------------------------\nSQL_ID  1tsadjdd9ddam, child number 0\n-------------------------------------\nselect \/*+  *\/  sum(a) from demo1 sample(5)\n-----------------------------------------------------------------------------------------------------\n| Id  | Operation            | Name  | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |\n-----------------------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT     |       |      1 |        |   397 (100)|      1 |00:00:00.01 |     581 |\n|   1 |  SORT AGGREGATE      |       |      1 |      1 |            |      1 |00:00:00.01 |     581 |\n|   2 |   TABLE ACCESS SAMPLE| DEMO1 |      1 |    500 |   397   (0)|    478 |00:00:00.01 |     581 |\n-----------------------------------------------------------------------------------------------------\nColumn Projection Information (identified by operation id):\n-----------------------------------------------------------\n   1 - (#keys=0) SUM(\"A\")[22]\n   2 - (rowset=256) \"A\"[NUMBER,22]<\/code><\/pre>\n<p>Here we have not read all the blocks. Only 40% of them. This is faster than the Postgres approach, but the drawback is that the result is not exact: 478 rows were returned here.<\/p>\n<h3>Blocks<\/h3>\n<p>When we can afford an approximate sampling, we can sample on blocks rather than on rows:<\/p>\n<pre><code>explain (analyze,verbose,costs,buffers) select  sum(a) from demo1 tablesample system(5) ;\n                                                     QUERY PLAN\n---------------------------------------------------------------------------------------------------------------------\n Aggregate  (cost=290.25..290.26 rows=1 width=8) (actual time=0.479..0.480 rows=1 loops=1)\n   Output: sum(a)\n   Buffers: shared hit=73\n   -&gt;  Sample Scan on public.demo1  (cost=0.00..289.00 rows=500 width=4) (actual time=0.016..0.377 rows=511 loops=1)\n         Output: n, a, x\n         Sampling: system ('5'::real)\n         Buffers: shared hit=73\n Planning time: 0.698 ms\n Execution time: 0.509 ms<\/code><\/pre>\n<p>The number of rows is still good here, but the result may depend on the blocks sampled. Only 73 blocks were read, which is exactly 5% and of course, the rows may be distributed differently within the blocks. However, the advantage is that it is faster as it reads less blocks. But those blocks being picked at random, they are by definition random reads: 71 pages read at random_page_cost=0:4 and, as in the previous case, 501 cpu_tuple_cost and 500 cpu_operator_cost<\/p>\n<p>With block sampling, Oracle reads a smaller number of blocks than with row sampling, but still more than 5%, and the number of rows is not exact: 798 rows here:<\/p>\n<pre><code>PLAN_TABLE_OUTPUT\n------------------------------------------------------------------------------------------------------------------------------------------------------\nSQL_ID  fqgbwqfavgdrn, child number 0\n-------------------------------------\nselect \/*+  *\/  sum(a) from demo1 sample block(5)\n-----------------------------------------------------------------------------------------------------\n| Id  | Operation            | Name  | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |\n-----------------------------------------------------------------------------------------------------\n|   0 | SELECT STATEMENT     |       |      1 |        |    22 (100)|      1 |00:00:00.01 |     134 |\n|   1 |  SORT AGGREGATE      |       |      1 |      1 |            |      1 |00:00:00.01 |     134 |\n|   2 |   TABLE ACCESS SAMPLE| DEMO1 |      1 |    500 |    22   (0)|    798 |00:00:00.01 |     134 |\n-----------------------------------------------------------------------------------------------------\nColumn Projection Information (identified by operation id):\n-----------------------------------------------------------\n   1 - (#keys=0) SUM(\"A\")[22]\n   2 - (rowset=256) \"A\"[NUMBER,22]\n<\/code><\/pre>\n<p>Again, as for the previous access paths: same concepts and different implementation between Postgres and Oracle. Everything looks similar and easily portable from a far overview, but going into details you see all those little differences which make it no so easy to be database agnostic or easily portable.<\/p>\n<h3>Summary<\/h3>\n<p>This is the end of this series comparing Postgres access path with Oracle ones. The goal is not to tell you that one is better than the other. They have a different approach, different targets, different price, different history and probably future. But understanding how they work and how they estimate the cost is a good way to learn. I&#8217;m myself learning a lot about Postgres while writing those posts, matching things I discover on Postgres with those I know for a while in Oracle.<\/p>\n<p>Here is the list of posts on Access Path:<\/p>\n<ol>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-0\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths \u2013 intro<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-i\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths I \u2013 Seq Scan<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-ii\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths II \u2013 Index Only Scan<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-iii\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths III &#8211; Partial Index<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-iv\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths IV \u2013 Order By and Index<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-v\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths V \u2013 FIRST ROWS and MIN\/MAX<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-vi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths VI \u2013 Index Scan<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-vii\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths VII \u2013 Bitmap Index Scan<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-viii\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths VIII \u2013 Index Scan and Filter<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-ix\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths IX \u2013 Tid Scan<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-x\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths X \u2013 Update<\/a><\/li>\n<li><a href=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres vs. Oracle access paths XI \u2013 Sample Scan<\/a><\/li>\n<\/ol>\n<p>I think my next series will be on Join methods.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . I was going to end this series with the previous post because the last access path available in Postgres is a bit special: a Seq Scan that returns only a sample of the rows, at random. However, it is the occasion to come back to the difference between random and sequential [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[59,83],"tags":[348,96,77],"type_dbi":[],"class_list":["post-10450","post","type-post","status-publish","format-standard","hentry","category-oracle","category-postgresql","tag-execution-plan","tag-oracle","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>Postgres vs. Oracle access paths XI - Sample Scan - 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\/postgres-vs-oracle-access-paths-xi\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Postgres vs. Oracle access paths XI - Sample Scan\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . I was going to end this series with the previous post because the last access path available in Postgres is a bit special: a Seq Scan that returns only a sample of the rows, at random. However, it is the occasion to come back to the difference between random and sequential [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-26T12:33:39+00:00\" \/>\n<meta name=\"author\" content=\"Oracle 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=\"Oracle Team\" \/>\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\/postgres-vs-oracle-access-paths-xi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"Postgres vs. Oracle access paths XI &#8211; Sample Scan\",\"datePublished\":\"2017-08-26T12:33:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/\"},\"wordCount\":663,\"commentCount\":0,\"keywords\":[\"Execution plan\",\"Oracle\",\"PostgreSQL\"],\"articleSection\":[\"Oracle\",\"PostgreSQL\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/\",\"name\":\"Postgres vs. Oracle access paths XI - Sample Scan - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2017-08-26T12:33:39+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Postgres vs. Oracle access paths XI &#8211; Sample Scan\"}]},{\"@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\/66ab87129f2d357f09971bc7936a77ee\",\"name\":\"Oracle Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g\",\"caption\":\"Oracle Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Postgres vs. Oracle access paths XI - Sample Scan - 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\/postgres-vs-oracle-access-paths-xi\/","og_locale":"en_US","og_type":"article","og_title":"Postgres vs. Oracle access paths XI - Sample Scan","og_description":"By Franck Pachot . I was going to end this series with the previous post because the last access path available in Postgres is a bit special: a Seq Scan that returns only a sample of the rows, at random. However, it is the occasion to come back to the difference between random and sequential [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/","og_site_name":"dbi Blog","article_published_time":"2017-08-26T12:33:39+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"Postgres vs. Oracle access paths XI &#8211; Sample Scan","datePublished":"2017-08-26T12:33:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/"},"wordCount":663,"commentCount":0,"keywords":["Execution plan","Oracle","PostgreSQL"],"articleSection":["Oracle","PostgreSQL"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/","url":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/","name":"Postgres vs. Oracle access paths XI - Sample Scan - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2017-08-26T12:33:39+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgres-vs-oracle-access-paths-xi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Postgres vs. Oracle access paths XI &#8211; Sample Scan"}]},{"@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\/66ab87129f2d357f09971bc7936a77ee","name":"Oracle Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f711f7cd2c9b09bf2627133755b569fb5be0694810cfd33033bdd095fedba86d?s=96&d=mm&r=g","caption":"Oracle Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/oracle-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/10450","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\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=10450"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/10450\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=10450"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=10450"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=10450"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=10450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}