{"id":4165,"date":"2013-06-27T08:00:53","date_gmt":"2013-06-27T15:00:53","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/paul\/?p=4165"},"modified":"2020-05-03T17:06:06","modified_gmt":"2020-05-04T00:06:06","slug":"the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/","title":{"rendered":"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention"},"content":{"rendered":"<p>(New\u00a0for 2020: we\u2019ve published a range of SQL Server interview candidate screening assessments with our partner Kandio, so you can avoid hiring an \u2018expert\u2019 who ends up causing problems. Check them out\u00a0<a href=\"https:\/\/kand.io\/tests\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.)<\/p>\n<p><em>This month the SQLskills team is presenting a series of blog posts aimed at helping Accidental\/Junior DBAs &#8216;keep the SQL Server lights on&#8217;. It&#8217;s a little taster to let you know what we cover in our\u00a0<a href=\"https:\/\/www.sqlskills.com\/sql-server-training\/ie0\/?utm_source=accidentaldba&amp;utm_medium=blogs&amp;utm_campaign=training\">Immersion Event for The Accidental\/Junior DBA<\/a>, which we present\u00a0<a href=\"https:\/\/www.sqlskills.com\/sql-server-training\/immersion-events-schedule\/?utm_source=accidentaldba&amp;utm_medium=blogs&amp;utm_campaign=training\">several times each year<\/a>. You can find all the other posts in this series at\u00a0<a href=\"https:\/\/www.SQLskills.com\/help\/accidentaldba?utm_source=accidentaldba&amp;utm_medium=blogs&amp;utm_campaign=training\">http:\/\/www.SQLskills.com\/help\/AccidentalDBA<\/a>. Enjoy!<\/em><\/p>\n<p>One of the most common performance problems that exists in SQL Server instances across the world is known as tempdb contention. What does that mean?<\/p>\n<p>Tempdb contention refers to a bottleneck for threads trying to access allocation pages that are in-memory; it has nothing to do with I\/O.<\/p>\n<p>Consider the scenario of hundreds of concurrent queries that all create, use, and then drop small temporary tables (that by their very nature are always stored in tempdb). Each time a temp table is created, a data page must be allocated, plus an allocation metadata page to keep track of the data pages allocated to the table. This requires making a note in an allocation page (called a PFS page &#8211; see <a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/inside-the-storage-engine-gam-sgam-pfs-and-other-allocation-maps\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a> for in-depth info) that those two pages have been allocated in the database. When the temp table is dropped, those pages are deallocated, and they must be marked as such in that PFS page again. Only one thread at a time can be changing the allocation page, making it a hotspot and slowing down the overall workload.<\/p>\n<p>Back in SQL Server 2005, my dev team at Microsoft implemented a small cache of temp tables, to try to reduce this contention point, but it&#8217;s only a small cache, so it&#8217;s very common for this contention to be an issue, even today.<\/p>\n<p>What&#8217;s really interesting though, is that many people don&#8217;t realize they have this problem &#8211; even seasoned DBAs. It&#8217;s really easy to figure out whether you have this kind of problem using the\u00a0<em>sys.dm_os_waiting_tasks<\/em> DMV. If you run the query I have below, you&#8217;ll get an idea of where the various threads on your server are waiting, as <a href=\"http:\/\/www.sqlskills.com\/blogs\/erin\/the-accidental-dba-day-25-of-30-wait-statistics-analysis\/\" target=\"_blank\" rel=\"noopener noreferrer\">Erin discussed earlier this month<\/a>.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT\r\n    &#x5B;owt].&#x5B;session_id],\r\n    &#x5B;owt].&#x5B;exec_context_id],\r\n    &#x5B;owt].&#x5B;wait_duration_ms],\r\n    &#x5B;owt].&#x5B;wait_type],\r\n    &#x5B;owt].&#x5B;blocking_session_id],\r\n    &#x5B;owt].&#x5B;resource_description],\r\n    CASE &#x5B;owt].&#x5B;wait_type]\r\n        WHEN N'CXPACKET' THEN\r\n            RIGHT (&#x5B;owt].&#x5B;resource_description],\r\n            CHARINDEX (N'=', REVERSE (&#x5B;owt].&#x5B;resource_description])) - 1)\r\n        ELSE NULL\r\n    END AS &#x5B;Node ID],\r\n    &#x5B;es].&#x5B;program_name],\r\n    &#x5B;est].text,\r\n    &#x5B;er].&#x5B;database_id],\r\n    &#x5B;eqp].&#x5B;query_plan],\r\n    &#x5B;er].&#x5B;cpu_time]\r\nFROM sys.dm_os_waiting_tasks &#x5B;owt]\r\nINNER JOIN sys.dm_exec_sessions &#x5B;es] ON\r\n    &#x5B;owt].&#x5B;session_id] = &#x5B;es].&#x5B;session_id]\r\nINNER JOIN sys.dm_exec_requests &#x5B;er] ON\r\n    &#x5B;es].&#x5B;session_id] = &#x5B;er].&#x5B;session_id]\r\nOUTER APPLY sys.dm_exec_sql_text (&#x5B;er].&#x5B;sql_handle]) &#x5B;est]\r\nOUTER APPLY sys.dm_exec_query_plan (&#x5B;er].&#x5B;plan_handle]) &#x5B;eqp]\r\nWHERE\r\n    &#x5B;es].&#x5B;is_user_process] = 1\r\nORDER BY\r\n    &#x5B;owt].&#x5B;session_id],\r\n    &#x5B;owt].&#x5B;exec_context_id];\r\nGO\r\n<\/pre>\n<p>Note that the <em>[est].text<\/em> line does not have <em>text<\/em> delimited &#8211; it throws off the plugin.<\/p>\n<p>If you see a lot of lines of output where the <em>wait_type<\/em> is <em>PAGELATCH_UP<\/em> or <em>PAGELATCH_EX<\/em>, and the <em>resource_description<\/em> is <em>2:1:1<\/em> then that&#8217;s the PFS page (database ID 2 &#8211; tempdb, file ID 1, page ID 1), and if you see\u00a0<em>2:1:3<\/em> then that&#8217;s another allocation page called an SGAM (more info <a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/inside-the-storage-engine-gam-sgam-pfs-and-other-allocation-maps\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>).<\/p>\n<p>There are three things you can do to alleviate this kind of contention and increase the throughput of the overall workload:<\/p>\n<ol>\n<li><span style=\"line-height: 12.997159004211426px;\">Stop using temp tables<\/span><\/li>\n<li>Enable trace flag 1118 as a start-up trace flag<\/li>\n<li>Create multiple tempdb data files<\/li>\n<\/ol>\n<p>Ok &#8211; so #1 is much easier said than done, but it does solve that problem :-) Seriously though, you might find that temp tables are a design pattern in your environment because they made a query go faster once and then everyone started using them, whether they&#8217;re *really* needed or not for enhancing performance and throughput. That&#8217;s a whole other topic though and outside the scope of this post.<\/p>\n<p>#2 prevents contention on the SGAM pages by slightly changing the allocation algorithm used. There is no downside from having this enabled, and I even say that all SQL Server instances across the world should have this trace flag enabled by default (and I said the same thing when I ran the dev team that owned the allocation code in the SQL Server Storage Engine).<\/p>\n<p>#3 will help to remove the PFS page contention, by spreading the allocation workload over multiple files, thus reducing contention on the individual, per-file PFS pages. But how many data files should you create?<\/p>\n<p>The best guidance I&#8217;ve seen is from a great friend of mine, Bob Ward, who&#8217;s the top Escalation Engineer in Microsoft SQL Product Support. Figure out the number of logical processor cores you have (e.g. two CPUS, with 4 physical cores each, plus hyperthreading enabled = 2 (cpus) x 4 (cores) x 2 (hyperthreading) = 16 logical cores. Then if you have less than 8 logical cores, create the same number of data files as logical cores. If you have more than 8 logical cores, create 8 data files and then add more in chunks of 4 if you still see PFS contention. Make sure all the tempdb data files are the same size too. (This advice is now official Microsoft guidance in\u00a0<a href=\"https:\/\/support.microsoft.com\/kb\/2154845\" target=\"_blank\" rel=\"noopener noreferrer\">KB article 2154845<\/a>.)<\/p>\n<p>Here&#8217;s an example screenshot of a 100-connection workload on tempdb.<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg\"><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-4166\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg\" alt=\"tempfiles\" width=\"813\" height=\"555\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg 813w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles-300x204.jpg 300w\" sizes=\"(max-width: 813px) 100vw, 813px\" \/><\/a><\/p>\n<p>On the left was when I had a single tempdb data file and I was seeing nearly all the connections waiting for\u00a0<em>PAGELATCH_UP<\/em>\u00a0on\u00a0<em>2:1:1<\/em>. After adding three more tempdb data files and stabilizing, the throughput jumped, as you can clearly see.<\/p>\n<p>This has just been an overview of this problem, but as I said, it&#8217;s very common. You can get more information from the links below:<\/p>\n<ul>\n<li><span style=\"line-height: 12.997159004211426px;\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/misconceptions-around-tf-1118\/\" target=\"_blank\" rel=\"noopener noreferrer\">Misconceptions around TF 1118<\/a><br \/>\n<\/span><\/li>\n<li><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/tempdb-configuration-survey-results-and-advice\/\" target=\"_blank\" rel=\"noopener noreferrer\">Tempdb configuration survey results and advice<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>(New\u00a0for 2020: we\u2019ve published a range of SQL Server interview candidate screening assessments with our partner Kandio, so you can avoid hiring an \u2018expert\u2019 who ends up causing problems. Check them out\u00a0here.) This month the SQLskills team is presenting a series of blog posts aimed at helping Accidental\/Junior DBAs &#8216;keep the SQL Server lights on&#8217;. [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52,66,93],"tags":[],"class_list":["post-4165","post","type-post","status-publish","format-standard","hentry","category-involuntary-dba","category-performance-tuning","category-tempdb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention - 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\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"(New\u00a0for 2020: we\u2019ve published a range of SQL Server interview candidate screening assessments with our partner Kandio, so you can avoid hiring an \u2018expert\u2019 who ends up causing problems. Check them out\u00a0here.) This month the SQLskills team is presenting a series of blog posts aimed at helping Accidental\/Junior DBAs &#8216;keep the SQL Server lights on&#8217;. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2013-06-27T15:00:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-05-04T00:06:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.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\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/\",\"name\":\"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg\",\"datePublished\":\"2013-06-27T15:00:53+00:00\",\"dateModified\":\"2020-05-04T00:06:06+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#primaryimage\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg\",\"contentUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg\",\"width\":813,\"height\":555},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention\"}]},{\"@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":"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention - 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\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/","og_locale":"en_US","og_type":"article","og_title":"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention - Paul S. Randal","og_description":"(New\u00a0for 2020: we\u2019ve published a range of SQL Server interview candidate screening assessments with our partner Kandio, so you can avoid hiring an \u2018expert\u2019 who ends up causing problems. Check them out\u00a0here.) This month the SQLskills team is presenting a series of blog posts aimed at helping Accidental\/Junior DBAs &#8216;keep the SQL Server lights on&#8217;. [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/","og_site_name":"Paul S. Randal","article_published_time":"2013-06-27T15:00:53+00:00","article_modified_time":"2020-05-04T00:06:06+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.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\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/","name":"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg","datePublished":"2013-06-27T15:00:53+00:00","dateModified":"2020-05-04T00:06:06+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#primaryimage","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg","contentUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2013\/06\/tempfiles.jpg","width":813,"height":555},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"The Accidental DBA (Day 27 of 30): Troubleshooting: Tempdb Contention"}]},{"@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\/4165","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=4165"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4165\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=4165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=4165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=4165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}