{"id":809,"date":"2009-08-10T10:53:00","date_gmt":"2009-08-10T10:53:00","guid":{"rendered":"\/blogs\/paul\/post\/Forwarding-and-forwarded-records-and-the-back-pointer-size.aspx"},"modified":"2013-01-01T19:05:28","modified_gmt":"2013-01-02T03:05:28","slug":"forwarding-and-forwarded-records-and-the-back-pointer-size","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/","title":{"rendered":"Forwarding and forwarded records, and the back-pointer size"},"content":{"rendered":"<p>\n<font face=\"verdana,geneva\" size=\"2\">This is a question that comes up every so often, most recently this morning while teaching a private class (and Kimberly&#39;s teaching now): how large is the forwarded record back-pointer? (And I haven&#39;t posted anything geeky for a while&#8230;) <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">In a heap it is possible to get forwarding and forwarded records. They occur when a record in a heap expands such that it no longer fits on the page it currently resides on. In this case, the record is moved to a new page, and a small <em>forwarding<\/em> record is left in the original location. The forwarding record points to the new location of the record, which is known as a <em>forwarded<\/em> record. This is done as a performance optimization so that all the nonclustered indexes on the heap do not have to be altered with the new location of the heap record. <\/font>\n<\/p>\n<blockquote>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\">As an aside, when a query uses a nonclustered index to satisfy a query, but needs more columns from the table record&nbsp;to fill the result set column list, it must go to the actual data record to retrieve the extra columns. It does this by using the table record locator that is stored in the nonclustered index record. If the table is a heap, the record locator is the physical location of the data record in the heap. <\/font>\n\t<\/p>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\">If the table is a clustered index (remember that a table can be organized as a heap OR a clustered index, not both), the record locator is the set of cluster keys of the data record. Both of these record locators are guaranteed to be unique. For a heap record locator, the record lookup (commonly called a <em>bookmark lookup<\/em>) goes directly to the physical location of the record. For a clustered index record locator, the record lookup uses the cluster keys to navigate down through the clustered index to the leaf level. <\/font>\n\t<\/p>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\">If a forwarding record occurs in a heap, when the record locator points to that location, the Storage Engine gets there and says Oh, the record isn&#39;t really here &#8211; it&#39;s over <em>there!<\/em> And then it has to do another (potentially physical) I\/O to get to the page with the forwarded record on. This can result in a heap being less efficient that an equivalent clustered index. <\/font>\n\t<\/p>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\">There has been lots of discussion about whether it&#39;s better to have a heap or a clustered index &#8211; generally we recommend a clustered index, but there are special cases where a heap may be fine. This post isn&#39;t about that and I won&#39;t get drawn into a Comments argument about it. Go bug Kimberly :-) <\/font>\n\t<\/p>\n<\/blockquote>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Back to the point of the post. So the record has moved to a new location and there&#39;s a small record left in the original location which helps bookmark lookups. <\/font>\n<\/p>\n<blockquote>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\">Oh yeah, one more aside. The Storage Engine, when scanning the heap, will not process the forwarded record UNLESS it has reached it by following the forwarding record. This prevents race conditions where the record could be processed twice &#8211; if the forwarding operation occurs during a large table scan. <\/font>\n\t<\/p>\n<\/blockquote>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Ok, really back to the point of the post. What happens if the original record grows again and has to move again? Does it leave ANOTHER forwarding record when it moves to the second new location &#8211; creating a chain of forwarding records? <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">The answer is no. The *original* forwarding record is updated with the new location of the forwarded record. This can only be done if the forwarded record points *back* to the forwarding record &#8211; which it does. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">The question becomes- how big is the forwarding record back-pointer? It&#39;s not dumped out by <font face=\"courier new,courier\">DBCC PAGE<\/font> (sorry, when I rewrote <font face=\"courier new,courier\">DBCC PAGE<\/font> for SQL 2005 I forgot to put that in there). Let&#39;s work it out using a script. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">First off I&#39;m going to create a database and table to play with. <\/font>\n<\/p>\n<blockquote>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">CREATE DATABASE DBMaint2008;<br \/>\n\tGO<br \/>\n\tUSE DBMaint2008;<br \/>\n\tGO <\/font>\n\t<\/p>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">CREATE TABLE DbccPageTest (intCol1&nbsp;&nbsp;INT IDENTITY, &nbsp;intCol2&nbsp;&nbsp;INT, vcharCol&nbsp;VARCHAR (8000), &nbsp;lobCol&nbsp;&nbsp;VARCHAR (MAX));<br \/>\n\tGO <\/font>\n\t<\/p>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\"><font face=\"courier new,courier\">INSERT INTO DbccPageTest VALUES (1, REPLICATE (&#39;Row1&#39;, 600), REPLICATE (&#39;Row1Lobs&#39;, 1000));<br \/>\n\tINSERT INTO DbccPageTest VALUES (2, REPLICATE (&#39;Row2&#39;, 600), REPLICATE (&#39;Row2Lobs&#39;, 1000));<br \/>\n\tGO<\/font> <\/font>\n\t<\/p>\n<\/blockquote>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Using <font face=\"courier new,courier\">DBCC IND (&#39;DBMaint2008&#39;, &#39;DbccPageTest&#39;, -1) <\/font>, I find that the data page is page ID (1:154). If I dump out that page using <font face=\"courier new,courier\">DBCC PAGE<\/font>, I can see both of the records fully contained on the page. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Now I&#39;m going to update the second row to make it 8000+ bytes &#8211; forcing it to move to a new page. <\/font>\n<\/p>\n<blockquote>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\"><font face=\"courier new,courier\">UPDATE DbccPageTest SET vcharCol = REPLICATE (&#39;LongRow2&#39;, 1000) WHERE intCol2 = 2;<br \/>\n\tGO<\/font> <\/font>\n\t<\/p>\n<\/blockquote>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">And now looking at page (1:154) with <font face=\"courier new,courier\">DBCC PAGE<\/font> again, I can see that the second row has been replaced with: <\/font>\n<\/p>\n<blockquote>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">Slot 1 Offset 0x137a Length 9 <\/font>\n\t<\/p>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">Record Type = FORWARDING_STUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Record Attributes =<br \/>\n\tMemory Dump @0x66F4D37A <\/font>\n\t<\/p>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\"><font face=\"courier new,courier\">00000000:&nbsp;&nbsp; 049d0000 00010000 00&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&dagger;&#8230;&#8230;&#8230;<br \/>\n\tForwarding to&nbsp; =&nbsp; file 1 page 157 slot 0<\/font> <\/font>\n\t<\/p>\n<\/blockquote>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">The record has been replaced with a forwarding record &#8211; pointing to the new location of the record on page (1:157). <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Now <font face=\"courier new,courier\">DBCC PAGE<\/font> doesn&#39;t dump out the back-pointer in the forwarded record &#8211; so how can we tell how large it is? I&#39;m going to see how large the record is, and then create a clustered index on the table. This will remove the back-pointer from the record without changing anything else about the record. The difference in size will be the back-pointer size. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Doing <font face=\"courier new,courier\">DBCC PAGE<\/font> on page (1:157) I get (partial results): <\/font>\n<\/p>\n<blockquote>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">Slot 0 Offset 0x60 Length 8057 <\/font>\n\t<\/p>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\"><font face=\"courier new,courier\">Record Type = FORWARDED_RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Record Attributes =&nbsp; NULL_BITMAP VARIABLE_COLUMNS<\/font> <\/font>\n\t<\/p>\n<\/blockquote>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Now creating a clustered index and then dumping the page with the second row on it (left as an exercise for the reader :-)): <\/font>\n<\/p>\n<blockquote>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">CREATE CLUSTERED INDEX Dbcc_CL ON DbccPageTest (intCol1);<br \/>\n\tGO<\/p>\n<p>\t&lt;figure out which page to look at&gt;<\/font>\n\t<\/p>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">DBCC PAGE (&#39;DBMaint2008&#39;, 1, 169, 3);<br \/>\n\tGO<\/font>\n\t<\/p>\n<p>\n\t<font face=\"courier new,courier\" size=\"2\">&lt;partial results&gt;<br \/>\n\tSlot 0 Offset 0x60 Length 8047<\/font>\n\t<\/p>\n<p>\n\t<font face=\"verdana,geneva\" size=\"2\"><font face=\"courier new,courier\">Record Type = PRIMARY_RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Record Attributes =&nbsp; NULL_BITMAP VARIABLE_COLUMNS<\/font><br \/>\n\t<\/font>\n\t<\/p>\n<\/blockquote>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">[Edit 062210 &#8211; added a more in-depth explanation]&nbsp;<\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">The difference in&nbsp;size is 10 bytes, which is the size of the back-pointer. This isn&#39;t entirely obvious, but here&#39;s the explanation for the size change:<\/font>\n<\/p>\n<ul>\n<li><font size=\"2\">The back-pointer in the heap record is a certain size, plus two bytes for the offset in the variable-length column offset array (see <\/font><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/search-engine-qa-27-how-does-the-storage-engine-find-variable-length-columns\/\"><font face=\"verdana,geneva\" size=\"2\">Search Engine Q&amp;A #27: How does the storage engine find variable-length columns?<\/font><\/a><font size=\"2\"><font face=\"verdana,geneva\">&nbsp;for more info)<\/font> <\/font><\/li>\n<li><font size=\"2\">The clustered index doesn&#39;t have the back-pointer at all, but it&#39;s a nonunique clustered index, so does have an empty uniquifier column in every record, which takes at least two bytes for the offset in the variable-length column offset array<\/font><\/li>\n<li><font size=\"2\">Given that changing from a heap to a nonunique clustered index gives a record size change of 10 bytes, with the removal of one column and addition of another, the 10-byte difference must be the back-pointer<\/font><\/li>\n<\/ul>\n<p>\n<font size=\"2\">Note: if you create a unique clustered index above, you&#39;ll see a record size change of 12 bytes &#8211; as the uniquifier column is not generated.<\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">And it is. And here&#39;s how it breaks down:<\/font>\n<\/p>\n<ul>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">2 bytes for the special column ID (1024) at the start of the back-pointer signifying that this is a back-pointer<\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">8 bytes for the record location (2-byte file ID, 4-byte page-in-file, 2-byte slot ID)<\/font>\n\t<\/div>\n<\/li>\n<\/ul>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Hope this helps!<\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\"><\/font><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a question that comes up every so often, most recently this morning while teaching a private class (and Kimberly&#39;s teaching now): how large is the forwarded record back-pointer? (And I haven&#39;t posted anything geeky for a while&#8230;) In a heap it is possible to get forwarding and forwarded records. They occur when a [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38,48,62],"tags":[],"class_list":["post-809","post","type-post","status-publish","format-standard","hentry","category-example-scripts","category-inside-the-storage-engine","category-on-disk-structures"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Forwarding and forwarded records, and the back-pointer size - Paul S. Randal<\/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.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Forwarding and forwarded records, and the back-pointer size - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"This is a question that comes up every so often, most recently this morning while teaching a private class (and Kimberly&#039;s teaching now): how large is the forwarded record back-pointer? (And I haven&#039;t posted anything geeky for a while&#8230;) In a heap it is possible to get forwarding and forwarded records. They occur when a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2009-08-10T10:53:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-01-02T03:05:28+00:00\" \/>\n<meta name=\"author\" content=\"Paul Randal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Randal\" \/>\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\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/\",\"name\":\"Forwarding and forwarded records, and the back-pointer size - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"datePublished\":\"2009-08-10T10:53:00+00:00\",\"dateModified\":\"2013-01-02T03:05:28+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Forwarding and forwarded records, and the back-pointer size\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\",\"name\":\"Paul S. Randal\",\"description\":\"In Recovery...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\",\"name\":\"Paul Randal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"caption\":\"Paul Randal\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/paul\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Forwarding and forwarded records, and the back-pointer size - Paul S. Randal","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.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/","og_locale":"en_US","og_type":"article","og_title":"Forwarding and forwarded records, and the back-pointer size - Paul S. Randal","og_description":"This is a question that comes up every so often, most recently this morning while teaching a private class (and Kimberly&#39;s teaching now): how large is the forwarded record back-pointer? (And I haven&#39;t posted anything geeky for a while&#8230;) In a heap it is possible to get forwarding and forwarded records. They occur when a [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/","og_site_name":"Paul S. Randal","article_published_time":"2009-08-10T10:53:00+00:00","article_modified_time":"2013-01-02T03:05:28+00:00","author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/","name":"Forwarding and forwarded records, and the back-pointer size - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"datePublished":"2009-08-10T10:53:00+00:00","dateModified":"2013-01-02T03:05:28+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/forwarding-and-forwarded-records-and-the-back-pointer-size\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"Forwarding and forwarded records, and the back-pointer size"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/","name":"Paul S. Randal","description":"In Recovery...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce","name":"Paul Randal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","caption":"Paul Randal"},"sameAs":["http:\/\/3.209.169.194\/blogs\/paul"],"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/comments?post=809"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/809\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}