{"id":593,"date":"2011-03-16T14:28:00","date_gmt":"2011-03-16T14:28:00","guid":{"rendered":"\/blogs\/paul\/post\/What-do-you-look-for-when-analyzing-query-plans.aspx"},"modified":"2020-12-31T13:27:36","modified_gmt":"2020-12-31T21:27:36","slug":"query-plan-analysis-first-steps","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/","title":{"rendered":"Query plan analysis first steps"},"content":{"rendered":"<p>\n<font face=\"verdana,geneva\" size=\"2\">About a month ago I kicked off a survey asking what you look for when first analyzing a plan for a poorly performing query. You can see the original survey <\/font><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/survey-whats-your-plan-for-a-plan\/\"><font face=\"verdana,geneva\" size=\"2\">here<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Here are the survey results: <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">&nbsp;<img decoding=\"async\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg\" alt=\"\" \/> <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">The &quot;Other&quot; values are as follows: <\/font>\n<\/p>\n<ul>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">13 x &quot;Most expensive as percentage of total cost of batch&quot; <\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">7 x &quot;It depends on what&nbsp;I am trying to fix\/improve&quot; <\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">4 x &quot;Fat arrows&quot; <\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">3 x &quot;Operator cost&quot; <\/font>\n\t<\/div>\n<\/li>\n<\/ul>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">First of all &#8211; what would my answer be? I tend to look for scans and the most expensive operators, plus big fat arrows that stand out. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">There&#39;s a clear winner here in opinion amongst my readers &#8211; by far the most common first consideration when analyzing a query plan is to look for scans &#8211; I&#39;m not surprised by that. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">In this editorial I&#39;m not going to write about how to go about analyzing query plans &#8211; there&#39;s so much to cover that I&#39;d end up writing a book-length blog post. Instead I&#39;d like to point you at a bunch of resources that will help you with query tuning, including a few books. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">I use SQL Sentry&#39;s fabulous <\/font><a href=\"http:\/\/www.sqlsentry.com\/products\/plan-explorer\/sql-server-query-view\"><font face=\"verdana,geneva\" size=\"2\">free Plan Explorer tool<\/font><\/a><font face=\"verdana,geneva\" size=\"2\"> to do this as I can switch back\/forth between showing costs by CPU, by IO or combined. I can also see cumulative costs for a branch of the query plan, rather than having to look through a bunch of operators for expensive ones &#8211; this is invaluable to me day-to-day when working on client systems. It has a host of other features that SSMS does not have and I know lots of people who use it &#8211; why wouldn&#39;t you? <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">If you&#39;ve never look at a query plan before, I strongly recommend Grant Fritchey&#39;s <\/font><a href=\"http:\/\/www.sqlservercentral.com\/articles\/books\/65831\/?utm_content=Grant080623\"><font face=\"verdana,geneva\" size=\"2\">free e-book Dissecting SQL Server Execution Plans<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">. I&#39;d also recommend Grant&#39;s regular book <\/font><a href=\"https:\/\/www.amazon.com\/Server-Performance-Tuning-Distilled-Experts\/dp\/1430219025\/\"><font face=\"verdana,geneva\" size=\"2\">SQL Server 2008 Performance Tuning Distilled<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">As far as the choices I gave in the survey, each of them can be a major problem but aren&#39;t necessarily a problem at all. It&#39;s like the misconception that if you have wait stats, then you must have a performance problem. See my <\/font><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wait-statistics-or-please-tell-me-where-it-hurts\/\"><font face=\"verdana,geneva\" size=\"2\">long blog post on wait stats<\/font><\/a><font face=\"verdana,geneva\" size=\"2\"> for more info. <\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Here is some specific info that will help you understand the ramifications of each problem in a plan that I listed in the survey: <\/font>\n<\/p>\n<ul>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">Different row counts or executions between the estimated and actual plans usually indicates that either statistics are out of date leading to a bad plan, or maybe a plan was cached for a stored proc based on atypical parameters. Checkout the following links: <\/font>\n\t<\/div>\n<ul>\n<li>\n<div>\n\t\t<a href=\"http:\/\/blogs.msdn.com\/b\/conor_cunningham_msft\/archive\/2009\/06\/03\/conor-vs-dynamic-sql-vs-procedures-vs-plan-quality-for-parameterized-queries.aspx\"><font face=\"verdana,geneva\" size=\"2\">Conor vs. Dynamic SQL vs. Procedures vs. Plan Quality for Parameterized Queries<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">&nbsp;(Conor Cunningham) <\/font>\n\t\t<\/div>\n<\/li>\n<li>\n<div>\n\t\t<a href=\"http:\/\/blogs.msdn.com\/b\/conor_cunningham_msft\/archive\/2010\/08\/11\/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx\"><font face=\"verdana,geneva\" size=\"2\">Conor vs. Misbehaving Parameterized Queries + OPTIMIZE FOR hints<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">&nbsp;(Conor Cunningham) <\/font>\n\t\t<\/div>\n<\/li>\n<li>\n<div>\n\t\t<a href=\"http:\/\/sqlinthewild.co.za\/index.php\/2009\/09\/22\/estimated-rows-actual-rows-and-execution-count\/\"><font face=\"verdana,geneva\" size=\"2\">Estimated rows, actual rows and execution count<\/font><\/a><font face=\"verdana,geneva\" size=\"2\"> (Gail Shaw) <\/font>\n\t\t<\/div>\n<\/li>\n<li>\n<div>\n\t\t<a href=\"http:\/\/www.sqlskills.com\/blogs\/kimberly\/plan-cache-and-optimizing-for-adhoc-workloads\/\"><font face=\"verdana,geneva\" size=\"2\">Plan cache and optimizing for adhoc workloads<\/font><\/a><font face=\"verdana,geneva\" size=\"2\"> (Kimberly) <\/font>\n\t\t<\/div>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">Sorts can sometimes be caused by unneeded ORDER BY statement or by missing nonclustered indexes. A good, quick overview of sorts is in <\/font><a href=\"https:\/\/www.simple-talk.com\/sql\/learn-sql-server\/showplan-operator-of-the-week---sort\/\"><font face=\"verdana,geneva\" size=\"2\">Showplan Operator of the Week &#8211; SORT<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">&nbsp;(Fabiano Amorim) <\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">Joins are very often misunderstood and there are a whole host of reasons why one join may be chosen over another. Best thing to do here is point you at Craig Freedman&#39;s excellent series that I link to <\/font><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/two-great-blog-series-on-joins-and-query-plan-operators\/\"><font face=\"verdana,geneva\" size=\"2\">here<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">. <\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">There are all kinds of reasons why scans appear in query plans, not all bad at all. One of the bad reasons is that there are insufficient nonclustered indexes which mean the table has to be scanned to retrieve the data &#8211; see the books and search on Google\/Bing for an enormous amount written about this. Another reason is T-SQL code written so that an index *cannot* be used because an expression does not isolate the table column correctly, forcing a scan. I blogged about this <\/font><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/adventures-in-query-tuning-non-seekable-where-clause-expressions\/\"><font face=\"verdana,geneva\" size=\"2\">here<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">. <\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">Yet another reason why scans occurs&nbsp;is code written\/schema designed&nbsp;so that an operation called an implicit conversion occurs, where the table column must be converted to a different data type before a comparison can take place &#8211; forcing a scan, as each value has to be converted to the comparison type.&nbsp;Jonathan blogged about this <\/font><a href=\"http:\/\/sqlblog.com\/blogs\/jonathan_kehayias\/archive\/2010\/01\/08\/finding-implicit-column-conversions-in-the-plan-cache.aspx\"><font face=\"verdana,geneva\" size=\"2\">here<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">. <\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">Key\/RID lookups are where the query plan uses a nonclustered index to find a value, but the nonclustered index is not covering, so the other result set columns must be retrieved from the table row. When a Key Lookup occurs, the retrieval is from a clustered index and when&nbsp;a RID Lookup occurs the retrieval is from a heap. Both of these are undesirable because of the extra processing required. The fix for this is simply to ensure the correct indexes exist to support the queries, and that the queries are pulling in the correct columns &#8211; many times I&#39;ve seen client code that pulls in columns that aren&#39;t necessary.<\/font>\n\t<\/div>\n<\/li>\n<li>\n<div>\n\t<font face=\"verdana,geneva\" size=\"2\">The most expensive operators in a plan are usually a good place to look to see where gains can be made by changing code, statistics, or indexing. I blogged a short post on using SET STATISTICS to watch IO and CPU costs <\/font><a href=\"http:\/\/sqlmag.com\/blogs\/SQLServerQuestionsAnswered\/SQLServerQuestionsAnswered\/tabid\/1977\/entryid\/76115\/Determine-the-Performance-Effect-of-Query-Plan-Changes\"><font face=\"verdana,geneva\" size=\"2\">here<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">. <\/font>\n\t<\/div>\n<\/li>\n<li><font face=\"verdana,geneva\" size=\"2\">Parallelism is again often misunderstood and not necessarily a bad thing. For a large report query in a data warehouse, parallelism is good. For frequent queries in a busy OLTP system, parallelism can be a problem. The best presentation I&#39;ve seen by far on parallelism is by Craig Freedman &#8211; check it out <\/font><a href=\"http:\/\/blogs.msdn.com\/b\/craigfr\/archive\/2007\/04\/17\/parallel-query-execution-presentation.aspx\"><font face=\"verdana,geneva\" size=\"2\">here<\/font><\/a><font face=\"verdana,geneva\" size=\"2\">.<\/font><\/li>\n<\/ul>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">And that&#39;s what&nbsp;I have for you on query plans &#8211; lots of information for you to go exploring and learning. Analyzing a query plan is a skill that all DBAs and Developers should have IMHO and all the information is out there for you to try it out on your systems.<\/font>\n<\/p>\n<p>\n<font face=\"verdana,geneva\" size=\"2\">Enjoy!<\/font><\/p>\n","protected":false},"excerpt":{"rendered":"<p>About a month ago I kicked off a survey asking what you look for when first analyzing a plan for a poorly performing query. You can see the original survey here. Here are the survey results: &nbsp; The &quot;Other&quot; values are as follows: 13 x &quot;Most expensive as percentage of total cost of batch&quot; 7 [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66,73,91],"tags":[],"class_list":["post-593","post","type-post","status-publish","format-standard","hentry","category-performance-tuning","category-query-tuning","category-surveys"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Query plan analysis first steps - 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\/query-plan-analysis-first-steps\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Query plan analysis first steps - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"About a month ago I kicked off a survey asking what you look for when first analyzing a plan for a poorly performing query. You can see the original survey here. Here are the survey results: &nbsp; The &quot;Other&quot; values are as follows: 13 x &quot;Most expensive as percentage of total cost of batch&quot; 7 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2011-03-16T14:28:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-12-31T21:27:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg\" \/>\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=\"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\/paul\/query-plan-analysis-first-steps\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/\",\"name\":\"Query plan analysis first steps - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg\",\"datePublished\":\"2011-03-16T14:28:00+00:00\",\"dateModified\":\"2020-12-31T21:27:36+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#primaryimage\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg\",\"contentUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Query plan analysis first steps\"}]},{\"@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":"Query plan analysis first steps - 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\/query-plan-analysis-first-steps\/","og_locale":"en_US","og_type":"article","og_title":"Query plan analysis first steps - Paul S. Randal","og_description":"About a month ago I kicked off a survey asking what you look for when first analyzing a plan for a poorly performing query. You can see the original survey here. Here are the survey results: &nbsp; The &quot;Other&quot; values are as follows: 13 x &quot;Most expensive as percentage of total cost of batch&quot; 7 [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/","og_site_name":"Paul S. Randal","article_published_time":"2011-03-16T14:28:00+00:00","article_modified_time":"2020-12-31T21:27:36+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg","type":"","width":"","height":""}],"author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/","name":"Query plan analysis first steps - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg","datePublished":"2011-03-16T14:28:00+00:00","dateModified":"2020-12-31T21:27:36+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#primaryimage","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg","contentUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2011\/3\/planforplan.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/query-plan-analysis-first-steps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"Query plan analysis first steps"}]},{"@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\/593","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=593"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/593\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}