{"id":481,"date":"2012-08-13T11:45:22","date_gmt":"2012-08-13T11:45:22","guid":{"rendered":"\/blogs\/joe\/post\/Capturing-Transient-Query-Plan-Changes.aspx"},"modified":"2013-01-02T20:31:49","modified_gmt":"2013-01-03T04:31:49","slug":"capturing-transient-query-plan-changes","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/","title":{"rendered":"Capturing Transient Query Plan Changes"},"content":{"rendered":"<p>I had a recent consulting engagement where a query had unpredictable performance on an isolated test environment.&#160; I had two initial questions:<\/p>\n<p>&#8211; What were the wait stats associated with the unpredictable query?<\/p>\n<p>&#8211; What did the query execution plan look like in the \u201cgood\u201d versus \u201cbad\u201d condition?<\/p>\n<p>To address the query wait stats question, I set up an Extended Events session to track the query\u2019s accumulated wait stats for each execution.&#160; The performance issue would only happen a couple of times today, so I scheduled a job to loop the execution &#8211; without disconnecting, and keeping the session ID being referenced in the Extended Events session.&#160; I set up a separate table to track each test run (begin\/end time).&#160; This way the long periods could be associated back to the Extended Events session.<\/p>\n<p>We caught a few instances of the long running query, and the associated wait stats were primarily related to PAGEIOLATCH_SH.&#160; That opened up other considerations which I don\u2019t cover in this post, but I was still interested in seeing the execution plan for the long-running time periods versus the \u201csteady\u201d state.<\/p>\n<p>For example, let\u2019s say you have the following query:<\/p>\n<pre class=\"csharpcode\"><span class=\"kwrd\">EXEC<\/span> sp_executesql    \r\n    N<span class=\"str\">'SELECT     p.ProductLine,\r\n               SUM(f.SalesAmount) TotalSalesAmount\r\n    FROM [dbo].[FactInternetSales] f\r\n    INNER JOIN [dbo].[DimProduct] p ON\r\n         f.ProductKey = p.ProductKey\r\n    GROUP BY p.ProductLine\r\n    ORDER BY p.ProductLine'<\/span>;\r\nGO<\/pre>\n<p><style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>This particular query leverages parallelism and a columnstore index in my database.&#160; I can search for the query hash and query plan hash as follows (after executing on my test system):<\/p>\n<pre class=\"csharpcode\"><span class=\"kwrd\">SELECT<\/span> <span class=\"kwrd\">TOP<\/span> 1 last_execution_time, query_hash, query_plan_hash, p.query_plan\r\n<span class=\"kwrd\">FROM<\/span> sys.dm_exec_query_stats <span class=\"kwrd\">AS<\/span> qs\r\n<span class=\"kwrd\">CROSS<\/span> APPLY sys.dm_exec_sql_text (qs.plan_handle) <span class=\"kwrd\">AS<\/span> t\r\n<span class=\"kwrd\">CROSS<\/span> APPLY sys.dm_exec_query_plan (qs.plan_handle) <span class=\"kwrd\">AS<\/span> p\r\n<span class=\"kwrd\">WHERE<\/span> t.text <span class=\"kwrd\">LIKE<\/span> <span class=\"str\">'%SUM(f.SalesAmount)%'<\/span>\r\n<span class=\"kwrd\">ORDER<\/span> <span class=\"kwrd\">BY<\/span> last_execution_time <span class=\"kwrd\">DESC<\/span>;\r\nGO<\/pre>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>I order it by last execution because I want the most recent execution version (and you have to be careful when grabbing the query_hash to make sure the text match in your WHERE clause isn\u2019t capturing another query).&#160; Obviously easier to do on an isolated test system \u2013 but not impossible in production if you pay attention to execution count statistics.&#160; The following shows example results from the previous query:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/7930be84\/snaghtml506cb63.png\"><img decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"SNAGHTML506cb63\" border=\"0\" alt=\"SNAGHTML506cb63\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/0696d18b\/snaghtml506cb63_thumb.png\" width=\"731\" height=\"43\" \/><\/a><\/p>\n<p>I was interested in the query_hash and also the query_plan \u2013 which for this example, is the parallel plan:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/5f5c8855\/image.png\"><img fetchpriority=\"high\" decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/1f266edb\/image_thumb.png\" width=\"732\" height=\"140\" \/><\/a><\/p>\n<p>Now what if I re-execute my query \u2013 but with parallelism disabled at the server scope?&#160; No query change \u2013 but now the plan must change since it can\u2019t run in batch execution mode.&#160; Will tracking it based on my query_hash still work?&#160; <\/p>\n<pre class=\"csharpcode\"><span class=\"kwrd\">SELECT<\/span> query_plan_hash, p.query_plan\r\n<span class=\"kwrd\">FROM<\/span> sys.dm_exec_query_stats <span class=\"kwrd\">AS<\/span> qs\r\n<span class=\"kwrd\">CROSS<\/span> APPLY sys.dm_exec_query_plan (qs.plan_handle) <span class=\"kwrd\">AS<\/span> p\r\n<span class=\"kwrd\">WHERE<\/span> qs.query_hash = 0x3759AECF09255926\r\nGO<\/pre>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<p>In this case, I haven\u2019t changed my query, but the plan changed, and so my query_hash allowed me to see the new serial query plan:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/451c1f31\/image.png\"><img decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/3d247ccf\/image_thumb.png\" width=\"615\" height=\"55\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/2adbb60d\/image.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/6eafea64\/image_thumb.png\" width=\"617\" height=\"168\" \/><\/a><\/p>\n<p>In the particular consulting scenario I mentioned at the beginning of this post, I wrote the most recent query plan to a separate table for each test run so that when the long performance happened on the test environment, we could go back and compare the different plans based on the same query hash value.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I had a recent consulting engagement where a query had unpredictable performance on an isolated test environment.&#160; I had two initial questions: &#8211; What were the wait stats associated with the unpredictable query? &#8211; What did the query execution plan look like in the \u201cgood\u201d versus \u201cbad\u201d condition? To address the query wait stats question, [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-481","post","type-post","status-publish","format-standard","hentry","category-execution-plan"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Capturing Transient Query Plan Changes - 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\/capturing-transient-query-plan-changes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Capturing Transient Query Plan Changes - Joe Sack\" \/>\n<meta property=\"og:description\" content=\"I had a recent consulting engagement where a query had unpredictable performance on an isolated test environment.&#160; I had two initial questions: &#8211; What were the wait stats associated with the unpredictable query? &#8211; What did the query execution plan look like in the \u201cgood\u201d versus \u201cbad\u201d condition? To address the query wait stats question, [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/\" \/>\n<meta property=\"og:site_name\" content=\"Joe Sack\" \/>\n<meta property=\"article:published_time\" content=\"2012-08-13T11:45:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-01-03T04:31:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/0696d18b\/snaghtml506cb63_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=\"3 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\/capturing-transient-query-plan-changes\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/\",\"name\":\"Capturing Transient Query Plan Changes - Joe Sack\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#website\"},\"datePublished\":\"2012-08-13T11:45:22+00:00\",\"dateModified\":\"2013-01-03T04:31:49+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Execution Plan\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/execution-plan\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Capturing Transient Query Plan Changes\"}]},{\"@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":"Capturing Transient Query Plan Changes - 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\/capturing-transient-query-plan-changes\/","og_locale":"en_US","og_type":"article","og_title":"Capturing Transient Query Plan Changes - Joe Sack","og_description":"I had a recent consulting engagement where a query had unpredictable performance on an isolated test environment.&#160; I had two initial questions: &#8211; What were the wait stats associated with the unpredictable query? &#8211; What did the query execution plan look like in the \u201cgood\u201d versus \u201cbad\u201d condition? To address the query wait stats question, [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/","og_site_name":"Joe Sack","article_published_time":"2012-08-13T11:45:22+00:00","article_modified_time":"2013-01-03T04:31:49+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/f393e3ed75c3\/0696d18b\/snaghtml506cb63_thumb.png"}],"author":"Joseph Sack","twitter_misc":{"Written by":"Joseph Sack","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/","url":"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/","name":"Capturing Transient Query Plan Changes - Joe Sack","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#website"},"datePublished":"2012-08-13T11:45:22+00:00","dateModified":"2013-01-03T04:31:49+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/capturing-transient-query-plan-changes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/"},{"@type":"ListItem","position":2,"name":"Execution Plan","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/execution-plan\/"},{"@type":"ListItem","position":3,"name":"Capturing Transient Query Plan Changes"}]},{"@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\/481","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=481"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts\/481\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/media?parent=481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/categories?post=481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/tags?post=481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}