{"id":6296,"date":"2015-11-15T21:20:34","date_gmt":"2015-11-15T20:20:34","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/"},"modified":"2015-11-15T21:20:34","modified_gmt":"2015-11-15T20:20:34","slug":"in-memory-synchronous-population-with-hidden-parameters","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/","title":{"rendered":"In-Memory synchronous population with hidden parameters"},"content":{"rendered":"<h2>By Franck Pachot<\/h2>\n<p>.<br \/>\nBy default, In-Memory Column Store population is done in background, asynchronously. There are two hidden parameters that can change this behavior, let&#8217;s see how it works.<br \/>\n<!--more--><br \/>\nNote that this is only good for research, those parameters are undocumented which means that they may not behave as you think they would.<br \/>\nIn a demo about in-Memory (<a href=\"http:\/\/dbi-services.com\/blog\/oracle-in-memory-column-store-for-business-intelligence-at-swissbiday\/\" target=\"_blank\" rel=\"noopener noreferrer\">slides<\/a>,<a href=\"http:\/\/screencast-o-matic.com\/watch\/co1Q1kfDXB\" target=\"_blank\" rel=\"noopener noreferrer\">video<\/a>) I show that In-Memory is triggered by instance startup or query on tables, and is done asynchronously by the background processes (IMCO and Wnnn). The demo warns about the intermediate state where the execution plan is optimized for In-Memory (Full Table Scan) but rows are read from buffer cache.<\/p>\n<p>Let&#8217;s take a simple example and see different ways to populate.<\/p>\n<h3>default population<\/h3>\n<p>I&#8217;ve a table DEMO with default priority which is on-demand: population is triggered by first access to the table.<br \/>\nThen I&#8217;m doing that first access with a simple &#8216;count(*)&#8217;and then measure the direct path reads done by my session and by the In-Memory worker processes (Wnnn)<\/p>\n<pre><code>\nSQL&gt; select segment_name,populate_status from v$im_segments;\nno rows selected\n&nbsp;\nSQL&gt; select count(*) from DEMO;\n&nbsp;\n  COUNT(*)\n----------\n   4000000\n&nbsp;\nSQL&gt; select segment_name,populate_status from v$im_segments;\nno rows selected\n&nbsp;\nSQL&gt; select program,e.event,e.total_waits,e.time_waited_micro\/1e6 seconds,e.wait_class from v$session_event e join v$session using(sid)\n  2  where (program like '%(W%' or sid=sys_context('userenv','sid')) and e.wait_class='User I\/O' order by total_waits;\n&nbsp;\nPROGRAM             EVENT                          TOTAL_WAITS    SECONDS WAIT_CLASS\n------------------- ------------------------------ ----------- ---------- ----------------------------------------------------------------\noracle@Exdb3 (W000) Disk file operations I\/O                 1    .002772 User I\/O\nsqlplus@Exdb3 (TNS  db file scattered read                   2    .001731 User I\/O\noracle@Exdb3 (W001) Disk file operations I\/O                 3    .004728 User I\/O\nsqlplus@Exdb3 (TNS  Disk file operations I\/O                 3    .000533 User I\/O\noracle@Exdb3 (W001) db file sequential read                  6    .024402 User I\/O\noracle@Exdb3 (W000) direct path read                        25    .140749 User I\/O\noracle@Exdb3 (W001) direct path read                       116    .887163 User I\/O\nsqlplus@Exdb3 (TNS  db file sequential read                170    .186352 User I\/O\nsqlplus@Exdb3 (TNS  direct path read                       493   1.849471 User I\/O\n<\/code><\/pre>\n<p>The population was triggered. The query on V$IM_SEGMENT run immediately after show no population yet. And the following query on session waits show 493 direct path reads by my session &#8211; for the count(*) &#8211; and few direct path reads from IM workers because most of the IMCU were not populated yet.<\/p>\n<h3>_inmemory_populate_wait<\/h3>\n<p>We can choose synchronous population with the &#8220;_inmemory_populate_wait&#8221;. When set to true (default is false) our foreground session will wait for the table to be populated in memory. Let&#8217;s test it.<\/p>\n<pre><code>\nSQL&gt; alter session set \"_inmemory_populate_wait\"=true;\nSession altered.\n&nbsp;\nSQL&gt; select count(*) from DEMO;\n&nbsp;\n  COUNT(*)\n----------\n   4000000\n&nbsp;\nSQL&gt; select segment_name,populate_status from v$im_segments;\n&nbsp;\nSEGMENT_NAME POPULATE_STATUS\n------------ ----------------\nDEMO         COMPLETED\n&nbsp;\nSQL&gt; select program,e.event,e.total_waits,e.time_waited_micro\/1e6 seconds,e.wait_class from v$session_event e join v$session using(sid)\n  2  where (program like '%(W%' or sid=sys_context('userenv','sid')) and e.wait_class='User I\/O' order by total_waits;\n&nbsp;\nPROGRAM             EVENT                          TOTAL_WAITS    SECONDS WAIT_CLASS\n------------------- ------------------------------ ----------- ---------- ----------------------------------------------------------------\noracle@Exdb3 (W001) Disk file operations I\/O                 1    .007857 User I\/O\noracle@Exdb3 (W000) Disk file operations I\/O                 2    .001091 User I\/O\nsqlplus@Exdb3 (TNS  db file scattered read                   2    .001382 User I\/O\nsqlplus@Exdb3 (TNS  Disk file operations I\/O                 4    .000555 User I\/O\noracle@Exdb3 (W000) db file sequential read                  5    .002017 User I\/O\nsqlplus@Exdb3 (TNS  db file sequential read                173    .072744 User I\/O\noracle@Exdb3 (W001) direct path read                       336   1.962332 User I\/O\noracle@Exdb3 (W000) direct path read                       473   2.048195 User I\/O\nsqlplus@Exdb3 (TNS  direct path read                       490   1.994116 User I\/O\n<\/code><\/pre>\n<p>Here, population status was &#8216;COMPLETED&#8217; immediately after my count(*) query. This is exactly what the &#8220;_inmemory_populate_wait&#8221; is for.<br \/>\nWe see the direct-path reads done my the IM worker processes. But the count(*) did the same direct-path reads as before, which means that the execution of the query did not use the IMCS at that time. We wait for population before completing the user call, but we don&#8217;t wait for it to execute the query.<\/p>\n<p>As a proof of that, here is the autotrace stat from this count(*):<\/p>\n<pre><code>\nExecution Plan\n----------------------------------------------------------\nPlan hash value: 2180342005\n----------------------------------------------------------------------------\n| Id  | Operation                   | Name | Rows  | Cost (%CPU)| Time     |\n----------------------------------------------------------------------------\n|   0 | SELECT STATEMENT            |      |     1 |   727   (1)| 00:00:01 |\n|   1 |  SORT AGGREGATE             |      |     1 |            |          |\n|   2 |   TABLE ACCESS INMEMORY FULL| DEMO |  4000K|   727   (1)| 00:00:01 |\n----------------------------------------------------------------------------\nStatistics\n----------------------------------------------------------\n        168  recursive calls\n          0  db block gets\n      62421  consistent gets\n      62274  physical reads\n        284  redo size\n        542  bytes sent via SQL*Net to client\n        552  bytes received via SQL*Net from client\n          2  SQL*Net roundtrips to\/from client\n         18  sorts (memory)\n          0  sorts (disk)\n          1  rows processed\n<\/code><\/pre>\n<p>and here is one when running it a second time:<\/p>\n<pre><code>\nStatistics\n----------------------------------------------------------\n          0  recursive calls\n          0  db block gets\n          3  consistent gets\n          0  physical reads\n          0  redo size\n        542  bytes sent via SQL*Net to client\n        552  bytes received via SQL*Net from client\n          2  SQL*Net roundtrips to\/from client\n          0  sorts (memory)\n          0  sorts (disk)\n          1  rows processed\n<\/code><\/pre>\n<p>The first execution read from the row store, triggers IMCS population, waits for the population, and the second run ca read from the IMCS.<\/p>\n<h3>_inmemory_populate_fg<\/h3>\n<p>There is another parameter that can make population synchronous because population is then done in the foreground process.<br \/>\nThis cannot be set at session level, and it needs an instance restart:<\/p>\n<pre><code>\nSQL&gt; connect \/ as sysdba\nConnected.\nSQL&gt; alter system set \"_inmemory_populate_fg\"=true scope=spfile;\nSystem altered.\n&nbsp;\nSQL&gt; startup force\n...\n<\/code><\/pre>\n<p>Then I do the same as before:<\/p>\n<pre><code>\nSQL&gt; select count(*) from DEMO;\n&nbsp;\n  COUNT(*)\n----------\n   4000000\n&nbsp;\nSQL&gt; select segment_name,populate_status from v$im_segments;\n&nbsp;\nSEGMENT_NAME POPULATE_STATUS\n------------ ----------------\nDEMO         COMPLETED\n&nbsp;\nSQL&gt; select program,e.event,e.total_waits,e.time_waited_micro\/1e6 seconds,e.wait_class from v$session_event e join v$session using(sid)\n  2  where (program like '%(W%' or sid=sys_context('userenv','sid')) and e.wait_class='User I\/O' order by total_waits;\n&nbsp;\nPROGRAM             EVENT                          TOTAL_WAITS    SECONDS WAIT_CLASS\n------------------- ------------------------------ ----------- ---------- ----------------------------------------------------------------\nsqlplus@Exdb3 (TNS  db file scattered read                   2    .001608 User I\/O\noracle@Exdb3 (W001) Disk file operations I\/O                 3    .000506 User I\/O\nsqlplus@Exdb3 (TNS  Disk file operations I\/O                 5    .000749 User I\/O\noracle@Exdb3 (W001) db file sequential read                 70    .027488 User I\/O\nsqlplus@Exdb3 (TNS  db file sequential read                178    .084757 User I\/O\nsqlplus@Exdb3 (TNS  direct path read                      1215    3.32137 User I\/O\n<\/code><\/pre>\n<p>Same amount of direct path reads here, but all done by my foreground session.<br \/>\nOnce again, the population is obviously done after the execution.<\/p>\n<h3>So what?<\/h3>\n<p>The asynchronous population is an implementation choice, but code is there for foreground one.<\/p>\n<p>There is something that I don&#8217;t understand however. When waiting for population, it would be better to populate first, and then use the populated IMCS to execute the query. It seems that it&#8217;s the opposite here, which means that the table is read two times in this case.<br \/>\nOf course there are cases where this implementation is better, so that we can fetch first rows without waiting for whole population.<\/p>\n<p>Anyway, I use &#8220;_inmemory_populate_wait&#8221; in my tests or demos when I want the IMCS to be populated. Easier to set this parameter than looping on a select on V$IM_SEGMENTS to see population status being COMPLETED.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>By Franck Pachot . By default, In-Memory Column Store population is done in background, asynchronously. There are two hidden parameters that can change this behavior, let&#8217;s see how it works.<\/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":[229,59],"tags":[222,707],"type_dbi":[],"class_list":["post-6296","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-oracle","tag-in-memory","tag-oracle-12"],"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>In-Memory synchronous population with hidden parameters - 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\/in-memory-synchronous-population-with-hidden-parameters\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"In-Memory synchronous population with hidden parameters\" \/>\n<meta property=\"og:description\" content=\"By Franck Pachot . By default, In-Memory Column Store population is done in background, asynchronously. There are two hidden parameters that can change this behavior, let&#8217;s see how it works.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-11-15T20:20:34+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=\"6 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\/in-memory-synchronous-population-with-hidden-parameters\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/\"},\"author\":{\"name\":\"Oracle Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"headline\":\"In-Memory synchronous population with hidden parameters\",\"datePublished\":\"2015-11-15T20:20:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/\"},\"wordCount\":585,\"commentCount\":0,\"keywords\":[\"In-memory\",\"Oracle 12\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/\",\"name\":\"In-Memory synchronous population with hidden parameters - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2015-11-15T20:20:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"In-Memory synchronous population with hidden parameters\"}]},{\"@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":"In-Memory synchronous population with hidden parameters - 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\/in-memory-synchronous-population-with-hidden-parameters\/","og_locale":"en_US","og_type":"article","og_title":"In-Memory synchronous population with hidden parameters","og_description":"By Franck Pachot . By default, In-Memory Column Store population is done in background, asynchronously. There are two hidden parameters that can change this behavior, let&#8217;s see how it works.","og_url":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/","og_site_name":"dbi Blog","article_published_time":"2015-11-15T20:20:34+00:00","author":"Oracle Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Oracle Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/"},"author":{"name":"Oracle Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"headline":"In-Memory synchronous population with hidden parameters","datePublished":"2015-11-15T20:20:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/"},"wordCount":585,"commentCount":0,"keywords":["In-memory","Oracle 12"],"articleSection":["Database Administration &amp; Monitoring","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/","url":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/","name":"In-Memory synchronous population with hidden parameters - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2015-11-15T20:20:34+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/66ab87129f2d357f09971bc7936a77ee"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/in-memory-synchronous-population-with-hidden-parameters\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"In-Memory synchronous population with hidden parameters"}]},{"@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\/6296","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=6296"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/6296\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=6296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=6296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=6296"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=6296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}