{"id":410,"date":"2008-03-02T15:05:32","date_gmt":"2008-03-02T15:05:32","guid":{"rendered":"\/blogs\/conor\/post\/SQL-2008-CTP6-Filtered-Indexes-in-Action-disjunction-of-ranges-and-index-choice.aspx"},"modified":"2008-03-02T15:05:32","modified_gmt":"2008-03-02T15:05:32","slug":"sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/","title":{"rendered":"SQL 2008 CTP6 Filtered Indexes in Action &#8211; disjunction of ranges and index choice"},"content":{"rendered":"<p>After fighting off a cold all week, I&#8217;ve had some more time to go play with CTP6 on my secondary machine.<\/p>\n<p>Today we&#8217;ll do some experiments to see how the Optimizer picks plans for filtered indexes.&nbsp; This will help you figure out how to build your database schemas and queries to take advantage of this new kind of index.<\/p>\n<p>I was involved in the inception of the idea to build filtered indexes into SQL Server, but I didn&#8217;t have anything to do with the implementation.&nbsp; So, what I&#8217;ll cover today is just me playing with a feature to see what it can do.&nbsp; <\/p>\n<p>I thought that it would be good to play with disjoint ranges and see whether they can be &#8220;covered&#8221; by a filtered index.&nbsp; In my last blog post, I covered how a basic, single range case *is* covered by a filtered index when the predicates match up correctly.&nbsp; In this post, I&#8217;ll try multiple ranges to see what happens.<\/p>\n<p>Same database setup as before (just a table with wide rows and enough rows to make index choice obvious to the optimizer):<\/p>\n<pre><span style=\"color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;\"><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">use<\/span> t1<br><br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">create<\/span> <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">database<\/span> t1<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">use<\/span> t1<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">drop<\/span> <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">table<\/span> t1<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">create<\/span> <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">table<\/span> t1(col1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">int<\/span>, col2 <span style=\"color: Fuchsia; background-color: transparent; font-family: Courier New; font-size: 11px;\">nchar<\/span>(2000), col3 time)<br><br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">create<\/span> <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">index<\/span> i1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">on<\/span> t1(col1) <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">where<\/span> col1 &gt; 5 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">and<\/span> col1 &lt; 20<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\"><\/span><br><br><br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">create<\/span> <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">index<\/span> i1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">on<\/span> t1(col1) <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">where<\/span> col1 &gt; 5 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">and<\/span> col1 &lt; 20<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">declare<\/span> @p <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">int<\/span> <br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">set<\/span> @p =0<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">while<\/span> @p &lt; 20000<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">begin<\/span><br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">insert<\/span> <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">into<\/span> t1(col1) <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">values<\/span> (<span style=\"color: Fuchsia; background-color: transparent; font-family: Courier New; font-size: 11px;\">rand<\/span>()*10000)<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">set<\/span> @p=@p+1<br><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">end<br><\/span><\/span><span style=\"color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;\"><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">create<\/span> <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">index<\/span> i2 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">on<\/span> t1(col1) <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">where<\/span> col1 &gt; 25 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">and<\/span> col1 &lt; 40<\/span><br><br><br>OK I added a second index over a different range in the same column.  This is not a case that the <br>SQL Server 2005 optimizer had to handle.<br><br>query 1: a query with a disjunction (OR) of ranges (BETWEEN\/AND).<br><pre><span style=\"color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;\"><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">select<\/span> col1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">from<\/span> t1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">where<\/span> (col1 &gt; 5 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">and<\/span> col1 &lt; 20) <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">or<\/span> (col1 &gt; 25 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">and<\/span> col1 &lt; 40)<\/span><\/pre>\n<p>  |--Table Scan(OBJECT:([t1].[dbo].[t1]), WHERE:([t1].[dbo].[t1].[col1]&gt;(5) AND [t1].[dbo].[t1].[col1]&lt;(20) OR [t1].[dbo].[t1].[col1]&gt;(25) AND [t1].[dbo].[t1].[col1]&lt;(40)))<\/p>\n<p>Hrm.  Well, there doesn't seem to be code in CTP that does index unions for cases like this, unfortunately.<br \/>Hinting isn't an option either because the index hint code returns an error if the hinted index does not<br \/>completely cover the index.  On my machine, I get:<\/p>\n<p>(43 row(s) affected)<\/p>\n<p> SQL Server Execution Times:<br \/>   CPU time = 47 ms,  elapsed time = 2661 ms.<\/p>\n<p>That elapsed time is mostly reading pages off my IDE drive.  To be clear, this is the _cold cache_ time, <br \/>which means that I ran \"DBCC dropcleanbuffers\" before my run.  This throws out all of the buffer pool <br \/>pages and forces a read from disk.  One assumption in the costing model for the SQL Server QP is that the<br \/>pages are _not_ in memory already (and there are cases where this becomes interesting).  For this example,<br \/>it just means that we have a big table scan with lots of IOs to do (and is therefore slow).<\/p>\n<p>Second example: IN lists<\/p>\n<pre><span style=\"color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;\"><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">select<\/span> col1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">from<\/span> t1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">where<\/span> col1 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">in<\/span> (6, 7, 8, 26)<\/span><\/pre>\n<p>  |--Table Scan(OBJECT:([t1].[dbo].[t1]), WHERE:([t1].[dbo].[t1].[col1]=(6) OR [t1].[dbo].[t1].[col1]=(7) OR [t1].[dbo].[t1].[col1]=(8) OR [t1].[dbo].[t1].[col1]=(26)))<\/p>\n<p>Well, this is consistent.&nbsp; IN is generally just a list of ORs as far as the QP is concerned.&nbsp; Runtime for this query should be very similar to what we saw in our last example:<\/p>\n<p>(7 row(s) affected)<\/p>\n<p>&nbsp;SQL Server Execution Times:<br \/>&nbsp;&nbsp; CPU time = 63 ms,&nbsp; elapsed time = 2708 ms.<\/p>\n<p>OK, so what&#8217;s an enterprising SQL developer to do?&nbsp; Well, you can rewrite the query as a UNION ALL as long as you know that the ranges are disjoint and cover the predicate properly.<\/p>\n<pre><span style=\"color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;\"><span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">select<\/span> col1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">from<\/span> t1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">with<\/span> (<span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">index<\/span>=i1) <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">where<\/span> (col1 &gt; 5 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">and<\/span> col1 &lt; 20) \r\n<span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">union<\/span> <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">all<\/span> \r\n<span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">select<\/span> col1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">from<\/span> t1 <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">with<\/span> (<span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">index<\/span>=i2) <span style=\"color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;\">where<\/span> (col1 &gt; 25 <span style=\"color: Silver; background-color: transparent; font-family: Courier New; font-size: 11px;\">and<\/span> col1 &lt; 40)\r\n<\/span><\/pre>\n<p>SQL Server parse and compile time: <br \/>&nbsp;&nbsp; CPU time = 0 ms, elapsed time = 0 ms.<\/p>\n<p>(43 row(s) affected)<\/p>\n<p>&nbsp;SQL Server Execution Times:<br \/>&nbsp;&nbsp; CPU time = 0 ms,&nbsp; elapsed time = 0 ms.<\/p>\n<p>That&#8217;s a lot nicer.<\/p>\n<p>I have no idea if this is something that they intend to add for this release of the product.&nbsp; I&#8217;m not really even sure how common this is.&nbsp; How often do you want to apply a disjunction of ranges to multiple partial indexes where you don&#8217;t want to create an index over the whole table?&nbsp; No clue.&nbsp; If you have such an example, I&#8217;d love to hear about it &#8211; drop me a line at conor@sqlskills.com<\/p>\n<p>In the meantime, this is just a post on something interesting I learned while playing with the new CTP6 for SQL Server 2008 that I thought you might like to know.<\/p>\n<p>Happy Querying!<\/p>\n<p>Conor Cunningham<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After fighting off a cold all week, I&#8217;ve had some more time to go play with CTP6 on my secondary machine. Today we&#8217;ll do some experiments to see how the Optimizer picks plans for filtered indexes.&nbsp; This will help you figure out how to build your database schemas and queries to take advantage of this [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-410","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SQL 2008 CTP6 Filtered Indexes in Action - disjunction of ranges and index choice - Conor Cunningham<\/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\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL 2008 CTP6 Filtered Indexes in Action - disjunction of ranges and index choice - Conor Cunningham\" \/>\n<meta property=\"og:description\" content=\"After fighting off a cold all week, I&#8217;ve had some more time to go play with CTP6 on my secondary machine. Today we&#8217;ll do some experiments to see how the Optimizer picks plans for filtered indexes.&nbsp; This will help you figure out how to build your database schemas and queries to take advantage of this [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/\" \/>\n<meta property=\"og:site_name\" content=\"Conor Cunningham\" \/>\n<meta property=\"article:published_time\" content=\"2008-03-02T15:05:32+00:00\" \/>\n<meta name=\"author\" content=\"Conor Cunningham\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Conor Cunningham\" \/>\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\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/\",\"name\":\"SQL 2008 CTP6 Filtered Indexes in Action - disjunction of ranges and index choice - Conor Cunningham\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/#website\"},\"datePublished\":\"2008-03-02T15:05:32+00:00\",\"dateModified\":\"2008-03-02T15:05:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/f9106e03423de6b5157295891b8c3ae3\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL 2008 CTP6 Filtered Indexes in Action &#8211; disjunction of ranges and index choice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/\",\"name\":\"Conor Cunningham\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/f9106e03423de6b5157295891b8c3ae3\",\"name\":\"Conor Cunningham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d9c37eff231ec89c1b244347d966860875eea8b55b366911d2694e8cd9913e57?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d9c37eff231ec89c1b244347d966860875eea8b55b366911d2694e8cd9913e57?s=96&d=mm&r=g\",\"caption\":\"Conor Cunningham\"},\"url\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/author\/conor\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SQL 2008 CTP6 Filtered Indexes in Action - disjunction of ranges and index choice - Conor Cunningham","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\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/","og_locale":"en_US","og_type":"article","og_title":"SQL 2008 CTP6 Filtered Indexes in Action - disjunction of ranges and index choice - Conor Cunningham","og_description":"After fighting off a cold all week, I&#8217;ve had some more time to go play with CTP6 on my secondary machine. Today we&#8217;ll do some experiments to see how the Optimizer picks plans for filtered indexes.&nbsp; This will help you figure out how to build your database schemas and queries to take advantage of this [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/","og_site_name":"Conor Cunningham","article_published_time":"2008-03-02T15:05:32+00:00","author":"Conor Cunningham","twitter_misc":{"Written by":"Conor Cunningham","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/","url":"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/","name":"SQL 2008 CTP6 Filtered Indexes in Action - disjunction of ranges and index choice - Conor Cunningham","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/#website"},"datePublished":"2008-03-02T15:05:32+00:00","dateModified":"2008-03-02T15:05:32+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/f9106e03423de6b5157295891b8c3ae3"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/sql-2008-ctp6-filtered-indexes-in-action-disjunction-of-ranges-and-index-choice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/conor\/"},{"@type":"ListItem","position":2,"name":"SQL 2008 CTP6 Filtered Indexes in Action &#8211; disjunction of ranges and index choice"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/conor\/","name":"Conor Cunningham","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/conor\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/f9106e03423de6b5157295891b8c3ae3","name":"Conor Cunningham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d9c37eff231ec89c1b244347d966860875eea8b55b366911d2694e8cd9913e57?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d9c37eff231ec89c1b244347d966860875eea8b55b366911d2694e8cd9913e57?s=96&d=mm&r=g","caption":"Conor Cunningham"},"url":"https:\/\/www.sqlskills.com\/blogs\/conor\/author\/conor\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/posts\/410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/comments?post=410"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/posts\/410\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/media?parent=410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/categories?post=410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/tags?post=410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}