{"id":392,"date":"2008-05-12T21:50:56","date_gmt":"2008-05-12T21:50:56","guid":{"rendered":"\/blogs\/conor\/post\/Contradictions-within-Contradictions.aspx"},"modified":"2008-05-12T21:50:56","modified_gmt":"2008-05-12T21:50:56","slug":"contradictions-within-contradictions","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/","title":{"rendered":"Contradictions within Contradictions"},"content":{"rendered":"<p>I had a question from a reader about contradiction detection.<\/p>\n<p>The basic idea is to determine that this kind of query:<\/p>\n<p>SELECT * FROM TABLE WHERE col1 &gt; 5 and col1 &lt; 0;<\/p>\n<p>&#8230;is utterly meaningless and requires no work to be done.&nbsp; It will always return zero rows.&nbsp; In fact, in many cases the SQL Server QP will detect cases like this and actually remove the table from the query completely.&nbsp; In its place, you have this magical &#8220;constant scan&#8221; operator, which is really just an in-memory row generator.&nbsp; So, you can read from it instead of from a table.<\/p>\n<p>This optimization is done in many places in the SQL Server QP, and it is great because it requires no I\/O, no locks, and less CPU than actually reading from a table.<\/p>\n<p>The question I had from a user had to do with cases when this optimization does NOT happen.<\/p>\n<p>Since the reader sent me a perfect example, I&#8217;ll just copy it up here (note &#8211; I am happy to credit readers if they would like credit, but I don&#8217;t post their name unless they want me to do so).<\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: green;\">&#8211;drop table #tmp<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">create<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">table<\/span> #tmp<span style=\"color: blue;\"> <\/span><span style=\"color: gray;\">(<\/span>id <span style=\"color: blue;\">Int<\/span> <span style=\"color: blue;\">Identity<\/span><span style=\"color: gray;\">(<\/span>1<span style=\"color: gray;\">,<\/span>1<span style=\"color: gray;\">)<\/span> <span style=\"color: blue;\">Primary<\/span> <span style=\"color: blue;\">key<\/span><span style=\"color: gray;\">,<\/span> name <span style=\"color: blue;\">VarChar<\/span><span style=\"color: gray;\">(<\/span>250<span style=\"color: gray;\">))<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">go<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">insert<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">into<\/span> #tmp<span style=\"color: gray;\">(<\/span>name<span style=\"color: gray;\">)<\/span> <span style=\"color: blue;\">values<\/span><span style=\"color: gray;\">(<\/span><span style=\"color: fuchsia;\">NEWID<\/span><span style=\"color: gray;\">())<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">insert<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">into<\/span> #tmp<span style=\"color: gray;\">(<\/span>name<span style=\"color: gray;\">)<\/span> <span style=\"color: blue;\">values<\/span><span style=\"color: gray;\">(<\/span><span style=\"color: fuchsia;\">NEWID<\/span><span style=\"color: gray;\">())<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">go<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">set<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">statistics<\/span> <span style=\"color: blue;\">profile<\/span> <span style=\"color: blue;\">on<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">go<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: green;\">&#8212; Execution plan create a Constant Scan<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">select<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: gray;\">*<\/span> <span style=\"color: blue;\">from<\/span> #tmp<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">where<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> id <span style=\"color: gray;\">=<\/span> 1 <span style=\"color: gray;\">and<\/span> id <span style=\"color: gray;\">=<\/span> 5<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">go<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">set<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">statistics<\/span> <span style=\"color: blue;\">profile<\/span> <span style=\"color: blue;\">off<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\"><o:p>&nbsp;<\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">GO<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\"><o:p>&nbsp;<\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\">select * from #tmp&nbsp; where id = 1 and id = 5<br \/>&nbsp; |&#8211;Constant Scan<br \/><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\"><o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\"><o:p><br \/><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: green;\">&#8211;drop table tmp<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">create<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">table<\/span> tmp<span style=\"color: blue;\"> <\/span><span style=\"color: gray;\">(<\/span>id <span style=\"color: blue;\">Int<\/span> <span style=\"color: blue;\">Identity<\/span><span style=\"color: gray;\">(<\/span>1<span style=\"color: gray;\">,<\/span>1<span style=\"color: gray;\">)<\/span> <span style=\"color: blue;\">Primary<\/span> <span style=\"color: blue;\">key<\/span><span style=\"color: gray;\">,<\/span> name <span style=\"color: blue;\">VarChar<\/span><span style=\"color: gray;\">(<\/span>250<span style=\"color: gray;\">))<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">go<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">insert<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">into<\/span> tmp<span style=\"color: gray;\">(<\/span>name<span style=\"color: gray;\">)<\/span> <span style=\"color: blue;\">values<\/span><span style=\"color: gray;\">(<\/span><span style=\"color: fuchsia;\">NEWID<\/span><span style=\"color: gray;\">())<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">insert<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">into<\/span> tmp<span style=\"color: gray;\">(<\/span>name<span style=\"color: gray;\">)<\/span> <span style=\"color: blue;\">values<\/span><span style=\"color: gray;\">(<\/span><span style=\"color: fuchsia;\">NEWID<\/span><span style=\"color: gray;\">())<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: gray;\"><o:p>&nbsp;<\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">go<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">set<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: blue;\">statistics<\/span> <span style=\"color: blue;\">profile<\/span> <span style=\"color: blue;\">on<o:p><\/o:p><\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: green;\">&#8212; Why execution plan does not create a<br \/>\nConstant Scan for this case?<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">select<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> <span style=\"color: gray;\">*<\/span> <span style=\"color: blue;\">from<\/span> tmp<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\">where<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\"> id <span style=\"color: gray;\">=<\/span> 1 <span style=\"color: gray;\">and<\/span> id <span style=\"color: gray;\">=<\/span> 5<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\" style=\"\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\" lang=\"PT-BR\">go<o:p><\/o:p><\/span><\/p>\n<p class=\"MsoNormal\"><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;; color: blue;\" lang=\"PT-BR\">set<\/span><span style=\"font-size: 10pt; font-family: &quot;Courier New&quot;;\" lang=\"PT-BR\"> <span style=\"color: blue;\">statistics<\/span> <span style=\"color: blue;\">profile<\/span> <span style=\"color: blue;\">off<\/span><\/span><span style=\"\" lang=\"PT-BR\"><o:p><\/o:p><\/span><\/p>\n<p>SELECT * FROM [tmp] WHERE [id]=@1 AND [id]=@2<br \/>&nbsp; |&#8211;Clustered Index Seek(OBJECT:([t1].[dbo].[tmp].[PK__tmp__3213E83F15502E78]), SEEK:([t1].[dbo].[tmp].[id]=CONVERT_IMPLICIT(int,[@1],0)),&nbsp; WHERE:([t1].[dbo].[tmp].[id]=CONVERT_IMPLICIT(int,[@2],0)) ORDERED FORWARD)<\/p>\n<p><\/p>\n<p>So this is interesting &#8211; in one case the constant scan is done, while in the other case it is not&#8230;. hrm.&nbsp; what&#8217;s up with that?<\/p>\n<p>Well, some of you are familiar with autoparameterization &#8211; a feature that can take unparameterized queries, try to make them parameterized, and then avoid compilation for multiple similar simple queries.&nbsp; Autoparameterization is tied to the &#8220;trivial plan&#8221; feature, meaning that the optimizer feels that there isn&#8217;t really a plan choice and thus going through the complete cost-based optimization process is unnecessary.<\/p>\n<p>The difference you see is based on autoparameterization and whether it happens or not.&nbsp; Now, the autoparameterization rules are fairly arcane at this point &#8211; they&#8217;ve been around, in some form, for various releases dating back to SQL 7.0.&nbsp; TempDB has a different set of rules about whether a query should be autoparameterized since these tables are globally shared.&nbsp; So, in the #tmp case the table isn&#8217;t being autoparameterized, the rest of the logic to simplify the query is run, and this rule detects the contradiction.<\/p>\n<p>In the latter case, the query IS auto-parameterized.&nbsp; The optimizer doesn&#8217;t see two parameters as always being a contradiction (you could pass the same value for both parameters), and then the query is not simplified.<\/p>\n<p>For what it is worth, a somewhat internal knowledge of what causes a plan to be considered trivial or not can influence whether you see one plan or the other.&nbsp; For example, query hints make a plan not trivial (why hint if there is no plan choice?), and as such you could do something like this:<\/p>\n<p>select * from tmp<br \/>where id = 1 and id = 5 option (maxdop 1)<\/p>\n<p>This will get you the constant scan in all databases.&nbsp; Adding enough rows to get the cost above the threshold for parallelism (in a parallel-enabled machine + SKU of SQL) would also do it.&nbsp; <\/p>\n<p>Remember, trivial plan was developed before contradiction detection, so this should be viewed in that context.&nbsp; It&#8217;s a bit odd, but the ecosystem developed this way and you should be aware of that when developing SQL Server apps.<\/p>\n<p>I enjoy the questions &#8211; keep them coming!<\/p>\n<p>Thanks,<br \/>Conor<\/p>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I had a question from a reader about contradiction detection. The basic idea is to determine that this kind of query: SELECT * FROM TABLE WHERE col1 &gt; 5 and col1 &lt; 0; &#8230;is utterly meaningless and requires no work to be done.&nbsp; It will always return zero rows.&nbsp; In fact, in many cases the [&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-392","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>Contradictions within Contradictions - 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\/contradictions-within-contradictions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Contradictions within Contradictions - Conor Cunningham\" \/>\n<meta property=\"og:description\" content=\"I had a question from a reader about contradiction detection. The basic idea is to determine that this kind of query: SELECT * FROM TABLE WHERE col1 &gt; 5 and col1 &lt; 0; &#8230;is utterly meaningless and requires no work to be done.&nbsp; It will always return zero rows.&nbsp; In fact, in many cases the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/\" \/>\n<meta property=\"og:site_name\" content=\"Conor Cunningham\" \/>\n<meta property=\"article:published_time\" content=\"2008-05-12T21:50:56+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\/contradictions-within-contradictions\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/\",\"name\":\"Contradictions within Contradictions - Conor Cunningham\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/#website\"},\"datePublished\":\"2008-05-12T21:50:56+00:00\",\"dateModified\":\"2008-05-12T21:50:56+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/f9106e03423de6b5157295891b8c3ae3\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/conor\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Contradictions within Contradictions\"}]},{\"@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":"Contradictions within Contradictions - 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\/contradictions-within-contradictions\/","og_locale":"en_US","og_type":"article","og_title":"Contradictions within Contradictions - Conor Cunningham","og_description":"I had a question from a reader about contradiction detection. The basic idea is to determine that this kind of query: SELECT * FROM TABLE WHERE col1 &gt; 5 and col1 &lt; 0; &#8230;is utterly meaningless and requires no work to be done.&nbsp; It will always return zero rows.&nbsp; In fact, in many cases the [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/","og_site_name":"Conor Cunningham","article_published_time":"2008-05-12T21:50:56+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\/contradictions-within-contradictions\/","url":"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/","name":"Contradictions within Contradictions - Conor Cunningham","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/#website"},"datePublished":"2008-05-12T21:50:56+00:00","dateModified":"2008-05-12T21:50:56+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/#\/schema\/person\/f9106e03423de6b5157295891b8c3ae3"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/conor\/contradictions-within-contradictions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/conor\/"},{"@type":"ListItem","position":2,"name":"Contradictions within Contradictions"}]},{"@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\/392","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=392"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/posts\/392\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/media?parent=392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/categories?post=392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/conor\/wp-json\/wp\/v2\/tags?post=392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}