{"id":850,"date":"2013-01-10T15:16:09","date_gmt":"2013-01-10T23:16:09","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/joe\/?p=850"},"modified":"2013-12-29T19:18:14","modified_gmt":"2013-12-30T03:18:14","slug":"detecting-selectivity-guesses","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/","title":{"rendered":"Detecting Selectivity Guesses"},"content":{"rendered":"<p>I\u2019ve been mulling over a potential Microsoft Connect item regarding selectivity guess warnings, but I\u2019m uncertain if it would have enough demand to drive product team attention.\u00a0 Selectivity guesses, which I talked a little about in the \u201c<a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/selectivity-guesses-in-absence-of-statistics\/\" target=\"_blank\">Selectivity Guesses in absence of Statistics<\/a>\u201d post, are sometimes referred to as \u201cmagic numbers\u201d, \u201cheuristics\u201d or just plain old QO guesses.<\/p>\n<p>When a guess occurs, I think it would be interesting\\helpful to know when it happens, especially considering the impact on query plan quality.\u00a0 And while I\u2019ve seen a high number of SQL Server instances over the last 16 years, I couldn\u2019t tell you how many had bad plans due to selectivity guesses.\u00a0 Assuming that there are supporting statistics \u2013 one would hope that selectivity guesses at the leaf-level of a plan should be infrequent.\u00a0 And yet I feel it would be nice to confirm this through an exposed mechanism when it happens at the non-leaf levels.\u00a0 For example \u2013 just knowing when the Query Optimizer says \u201c I don\u2019t know what estimate to use for this Filter, so I\u2019ll use a selectivity guess and put a warning in the plan.\u201d<\/p>\n<p>In theory, one could comb a plan\u2019s XML and pull out the estimates vs. cardinality of the child operator (or if the leaf-level, the table cardinality).\u00a0 Then those numbers could be evaluated for potential matches on known patterns.<\/p>\n<p><em>And before we begin, I just want to confirm that this is not to be considered an actual real-world solution<\/em>.\u00a0 I\u2019ll explain why later \u2013 but in the meantime just view these demo queries as a rough draft thrown together for use in exploring a proof-of-concept.<\/p>\n<p>Let\u2019s say you have a table that is missing statistics entirely \u2013 and auto-creation of statistics are disabled.\u00a0 This is an upstream issue that we know has a fix \u2013 but in this scenario, it has not been addressed. Now let\u2019s take a sprawling query example that hits a few different patterns that would generate known selectivity guesses in absence of statistics:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nSELECT  &#x5B;charge_no],\r\n        &#x5B;member_no],\r\n        &#x5B;provider_no],\r\n        &#x5B;category_no],\r\n        SUM(&#x5B;charge_amt]) AS &#x5B;total_charge_amt]\r\nFROM    (SELECT &#x5B;charge_no],\r\n                &#x5B;member_no],\r\n                &#x5B;provider_no],\r\n                &#x5B;category_no],\r\n                &#x5B;charge_dt],\r\n                &#x5B;charge_amt],\r\n                &#x5B;statement_no],\r\n                &#x5B;charge_code]\r\n         FROM   dbo.&#x5B;charge_guess]\r\n         WHERE  &#x5B;provider_no] = 500\r\n         UNION\r\n         SELECT &#x5B;charge_no],\r\n                &#x5B;member_no],\r\n                &#x5B;provider_no],\r\n                &#x5B;category_no],\r\n                &#x5B;charge_dt],\r\n                &#x5B;charge_amt],\r\n                &#x5B;statement_no],\r\n                &#x5B;charge_code]\r\n         FROM   dbo.&#x5B;charge_guess]\r\n         WHERE  &#x5B;statement_no] BETWEEN 500 AND 1000\r\n         UNION\r\n         SELECT &#x5B;charge_no],\r\n                &#x5B;member_no],\r\n                &#x5B;provider_no],\r\n                &#x5B;category_no],\r\n                &#x5B;charge_dt],\r\n                &#x5B;charge_amt],\r\n                &#x5B;statement_no],\r\n                &#x5B;charge_code]\r\n         FROM   dbo.&#x5B;charge_guess]\r\n         WHERE  &#x5B;charge_amt] &lt; 100000\r\n         UNION\r\n         SELECT &#x5B;charge_no],\r\n                &#x5B;member_no],\r\n                &#x5B;provider_no],\r\n                &#x5B;category_no],\r\n                &#x5B;charge_dt],\r\n                &#x5B;charge_amt],\r\n                &#x5B;statement_no],\r\n                &#x5B;charge_code]\r\n         FROM   dbo.&#x5B;charge_guess]\r\n         WHERE  &#x5B;category_no] LIKE 10) AS t\r\nGROUP BY &#x5B;charge_no],\r\n        &#x5B;member_no],\r\n        &#x5B;provider_no],\r\n        &#x5B;category_no]\r\nHAVING  SUM(&#x5B;charge_amt]) &gt; 3999.99;\r\nGO\r\n\r\n<\/pre>\n<p>Now that this is in cache, let me extract the different operators and associated attributes into a temporary table:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nWITH XMLNAMESPACES\r\n    (DEFAULT 'http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/showplan')\r\n SELECT s.&#x5B;value]('@NodeId', 'int') AS &#x5B;NodeId],\r\n\t\ts.&#x5B;value]('@PhysicalOp', 'nvarchar(128)') AS &#x5B;PhysicalOp],\r\n\t\ts.&#x5B;value]('@EstimateRows', 'real') AS &#x5B;EstimateRows],\r\n\t\ts.&#x5B;value]('@TableCardinality', 'real') AS &#x5B;TableCardinality],\r\n\t\tc.&#x5B;plan_handle],\r\n\t\tq.&#x5B;query_plan],\r\n\t\tt.text\r\n INTO #ProcessResults\r\n FROM sys.dm_exec_cached_plans AS &#x5B;c]\r\n CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS &#x5B;q]\r\n CROSS APPLY query_plan.nodes('\/\/RelOp') AS batch(s)\r\n CROSS APPLY sys.&#x5B;dm_exec_sql_text](c.plan_handle) AS &#x5B;t]\r\n WHERE t.text\tLIKE '%provider_no%'\r\n OPTION(MAXDOP 1, RECOMPILE);\r\n GO\r\n<\/pre>\n<p>Next \u2013 let me look at a few common selectivity guess percentages:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n-- Common guesses - not all inclusive!\r\nSELECT  plan_handle,\r\n\t\tNodeId,\r\n\t\tPhysicalOp,\r\n\t\tEstimateRows AS EstimateRows,\r\n\t\tCOALESCE(TableCardinality,\r\n\t\t         LAG(EstimateRows, 1,0) OVER (ORDER BY NodeId DESC))\r\n\t\t\tAS Cardinality,\r\n\t\tCASE\r\n\t\t\tCAST(EstimateRows \/ COALESCE(TableCardinality,\r\n\t\t         LAG(EstimateRows, 1,0) OVER (ORDER BY YEAR(NodeId)))\r\n\t\t\t\t AS numeric (24,4))\r\n\t\t\tWHEN 0.0316 THEN 'Potential Selectivity Guess'\r\n\t\t\tWHEN 0.09 THEN 'Potential Selectivity Guess'\r\n\t\t\tWHEN 0.30 THEN 'Potential Selectivity Guess'\r\n\t\t\tWHEN 0.10 THEN 'Potential Selectivity Guess'\r\n\t\t\tELSE '-'\r\n\t\tEND AS 'Potential Selectivity Guess?'\r\nFROM &#x5B;#ProcessResults] AS pr\r\nORDER BY NodeId DESC;\r\n<\/pre>\n<p>Looking at the results, I can see a few patterns for applicable operators that may be doing selectivity guesses:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/01\/image.png\"><img fetchpriority=\"high\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;\" title=\"image\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/01\/image_thumb.png\" width=\"591\" height=\"445\" border=\"0\" \/><\/a><\/p>\n<p>So the demo query found where the guesses were originating at the leaf level for table scans due to four different expression patterns \u2013 and also caught a potential selectivity guess for the Filter operator further down towards the root of the plan.<\/p>\n<p>This solution is imperfect though:<\/p>\n<ul>\n<li>I\u2019m just pulling a few different <em>known<\/em> selectivity guess percentages.\u00a0 I don\u2019t know all the scenarios and I\u2019m definitely missing some of them.\u00a0 Not to mention the fact that some of the potential predicates would involve more sophisticated evaluation in order to detect potential selectivity guesses.<\/li>\n<li>Each Table Scan also had a \u201cColumns With No Statistics\u201d warning (at Node 20, 16, 13, and 10).\u00a0 I would argue that this would be a good red flag in and of itself.<\/li>\n<\/ul>\n<p>So why even raise this discussion in the first place?<\/p>\n<ul>\n<li>While the \u201cColumns With No Statistics\u201d warning surfaces for my table access, it didn\u2019t surface for the Filter operator (Node 1).<\/li>\n<li>There are scenarios in the intermediate levels of a plan where I would love to know when the query optimizer has resorted to pure guesses.<\/li>\n<\/ul>\n<p>Again, I\u2019m not entirely sure a Connect item would be anything but a symbolic act \u2013 and perhaps justly so \u2013 but I\u2019m curious to hear from those of you who have confirmed selectivity guess issues for their plans \u2013 and most particularly for scenarios where there aren\u2019t other symptoms (for example, no associated warnings that might tip you off to an upstream issue).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I\u2019ve been mulling over a potential Microsoft Connect item regarding selectivity guess warnings, but I\u2019m uncertain if it would have enough demand to drive product team attention.\u00a0 Selectivity guesses, which I talked a little about in the \u201cSelectivity Guesses in absence of Statistics\u201d post, are sometimes referred to as \u201cmagic numbers\u201d, \u201cheuristics\u201d or just plain [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42,28],"tags":[],"class_list":["post-850","post","type-post","status-publish","format-standard","hentry","category-cardinality-estimation","category-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Detecting Selectivity Guesses - Joe Sack<\/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\/joe\/detecting-selectivity-guesses\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Detecting Selectivity Guesses - Joe Sack\" \/>\n<meta property=\"og:description\" content=\"I\u2019ve been mulling over a potential Microsoft Connect item regarding selectivity guess warnings, but I\u2019m uncertain if it would have enough demand to drive product team attention.\u00a0 Selectivity guesses, which I talked a little about in the \u201cSelectivity Guesses in absence of Statistics\u201d post, are sometimes referred to as \u201cmagic numbers\u201d, \u201cheuristics\u201d or just plain [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/\" \/>\n<meta property=\"og:site_name\" content=\"Joe Sack\" \/>\n<meta property=\"article:published_time\" content=\"2013-01-10T23:16:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-12-30T03:18:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/01\/image_thumb.png\" \/>\n<meta name=\"author\" content=\"Joseph Sack\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joseph Sack\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/\",\"name\":\"Detecting Selectivity Guesses - Joe Sack\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#website\"},\"datePublished\":\"2013-01-10T23:16:09+00:00\",\"dateModified\":\"2013-12-30T03:18:14+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cardinality Estimation\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/cardinality-estimation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Detecting Selectivity Guesses\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/\",\"name\":\"Joe Sack\",\"description\":\"SQL Server Performance Tuning, High Availability and Disaster Recovery Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648\",\"name\":\"Joseph Sack\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g\",\"caption\":\"Joseph Sack\"},\"description\":\"Joe Sack is a Principal Consultant with SQLskills. He has worked as a SQL Server professional since 1997 and has supported and developed for SQL Server environments in financial services, IT consulting, manufacturing, retail and the real estate industry. Prior to joining SQLskills he worked at Microsoft as a Premier Field Engineer supporting very large enterprise customer environments. He was responsible for providing deep SQL Server advisory services, training, troubleshooting and ongoing solutions guidance. His areas of expertise include performance tuning, scalability, T-SQL development and high-availability. In 2006 Joe earned the \u201cMicrosoft Certified Master: SQL Server 2005\u201d certification and in 2008 he earned the \u201cMicrosoft Certified Master: SQL Server 2008\u201d certification. In 2009 he took over responsibility for the entire SQL Server Microsoft Certified Master program and held that post until 2011. He was given the SQL Server MVP award in 2013.\",\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/joe\",\"https:\/\/twitter.com\/https:\/\/twitter.com\/josephsack\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/author\/joe\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Detecting Selectivity Guesses - Joe Sack","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\/joe\/detecting-selectivity-guesses\/","og_locale":"en_US","og_type":"article","og_title":"Detecting Selectivity Guesses - Joe Sack","og_description":"I\u2019ve been mulling over a potential Microsoft Connect item regarding selectivity guess warnings, but I\u2019m uncertain if it would have enough demand to drive product team attention.\u00a0 Selectivity guesses, which I talked a little about in the \u201cSelectivity Guesses in absence of Statistics\u201d post, are sometimes referred to as \u201cmagic numbers\u201d, \u201cheuristics\u201d or just plain [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/","og_site_name":"Joe Sack","article_published_time":"2013-01-10T23:16:09+00:00","article_modified_time":"2013-12-30T03:18:14+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/01\/image_thumb.png"}],"author":"Joseph Sack","twitter_misc":{"Written by":"Joseph Sack","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/","url":"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/","name":"Detecting Selectivity Guesses - Joe Sack","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#website"},"datePublished":"2013-01-10T23:16:09+00:00","dateModified":"2013-12-30T03:18:14+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/detecting-selectivity-guesses\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/"},{"@type":"ListItem","position":2,"name":"Cardinality Estimation","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/cardinality-estimation\/"},{"@type":"ListItem","position":3,"name":"Detecting Selectivity Guesses"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/joe\/","name":"Joe Sack","description":"SQL Server Performance Tuning, High Availability and Disaster Recovery Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/joe\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648","name":"Joseph Sack","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a4b39a7719a6bfff1add3ec00527810734579ee114d6d983e8e68f937b77be96?s=96&d=mm&r=g","caption":"Joseph Sack"},"description":"Joe Sack is a Principal Consultant with SQLskills. He has worked as a SQL Server professional since 1997 and has supported and developed for SQL Server environments in financial services, IT consulting, manufacturing, retail and the real estate industry. Prior to joining SQLskills he worked at Microsoft as a Premier Field Engineer supporting very large enterprise customer environments. He was responsible for providing deep SQL Server advisory services, training, troubleshooting and ongoing solutions guidance. His areas of expertise include performance tuning, scalability, T-SQL development and high-availability. In 2006 Joe earned the \u201cMicrosoft Certified Master: SQL Server 2005\u201d certification and in 2008 he earned the \u201cMicrosoft Certified Master: SQL Server 2008\u201d certification. In 2009 he took over responsibility for the entire SQL Server Microsoft Certified Master program and held that post until 2011. He was given the SQL Server MVP award in 2013.","sameAs":["http:\/\/3.209.169.194\/blogs\/joe","https:\/\/twitter.com\/https:\/\/twitter.com\/josephsack"],"url":"https:\/\/www.sqlskills.com\/blogs\/joe\/author\/joe\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts\/850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/comments?post=850"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts\/850\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/media?parent=850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/categories?post=850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/tags?post=850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}