{"id":203,"date":"2024-12-31T08:00:00","date_gmt":"2024-12-31T13:00:00","guid":{"rendered":"https:\/\/www.sqltabletalk.com\/?p=203"},"modified":"2024-12-30T22:06:02","modified_gmt":"2024-12-31T03:06:02","slug":"understanding-and-resolving-tempdb-contention","status":"publish","type":"post","link":"https:\/\/www.sqltabletalk.com\/?p=203","title":{"rendered":"Understanding and Resolving TempDB Contention in SQL Server"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.<\/p>\n<h2>Common TempDB Contention Issues<\/h2>\n<h3>PFS and SGAM Contention<\/h3>\n<p>One well-known issue arises from page allocation structures, specifically the Page Free Space (PFS) and Shared Global Allocation Map (SGAM) pages. A common solution is to add multiple TempDB data files, which can reduce contention on these allocation pages. However, even with multiple data files, you may still face contention in other areas\u2014particularly the system tables in TempDB.<\/p>\n<p>For more information on troubleshooting PFS\/SGAM contention in TempDB, see Jonathan Kehayias\u2019s blog post: <a href=\"https:\/\/www.red-gate.com\/simple-talk\/databases\/sql-server\/database-administration-sql-server\/optimizing-tempdb-configuration-with-sql-server-2012-extended-events\/\">Optimizing tempdb configuration with SQL Server 2012 Extended Events<\/a><\/p>\n<h2>Understanding System Table Contention<\/h2>\n<p>When you create a temporary table, SQL Server must insert metadata into various system tables in TempDB (similar to creating a permanent table in a user database). Often, the temporary table definition is cached for reuse. These cached objects show up in <code>tempdb.sys.tables<\/code> under hexadecimal names.<\/p>\n<p>If you create a temporary table that already exists in cache, SQL Server performs a simple \u201crename\u201d operation instead of inserting new entries into the system tables. However, when creating or dropping temporary tables at a very high rate, you can see contention on these system objects.<\/p>\n<h3>Example: sys.sysschobjs<\/h3>\n<p><code>sys.sysschobjs<\/code> is the base table for <code>sys.objects<\/code> in TempDB. You can quickly examine its structure using <code>sp_help<\/code>:<\/p>\n<pre><code>USE tempdb;\nGO\nEXEC sp_help 'sys.sysschobjs';\nGO<\/code><\/pre>\n<p>Among its indexes, one is a nonclustered index on a <code>TINYINT<\/code> column named <code>nsclass<\/code>, and another starts with the <code>name<\/code> column. Under high concurrency, these indexes can become hot spots for latch contention.<\/p>\n<h2>Demonstrating Latch Contention<\/h2>\n<p>You can reproduce this contention using the <strong>OSTRESS<\/strong> command-line tool (part of the RML Utilities). First, set up a simple test scenario:<\/p>\n<ol>\n<li><strong>Create a test database<\/strong>:\n<pre><code>USE master;\nGO\nCREATE DATABASE ContentionTest;\nGO<\/code><\/pre>\n<\/li>\n<li><strong>Add a stored procedure<\/strong> that creates a temporary table:\n<pre><code>USE ContentionTest;\nGO\n\nCREATE PROCEDURE dbo.Test\nAS\n    CREATE TABLE #Test (\n        Id INT,\n        Col1 NVARCHAR(128)\n    );\n    INSERT INTO #Test\n    SELECT 1, 'Test';<\/code><\/pre>\n<\/li>\n<li><strong>Run OSTRESS<\/strong> to hammer your instance with high concurrency:\n<pre><code>ostress -Q\"EXEC ContentionTest.dbo.Test;\" -n500 -r500 -S\"localhost\"<\/code><\/pre>\n<ul>\n<li><code>-n500<\/code> = number of threads<\/li>\n<li><code>-r500<\/code> = each thread runs the query 500 times<\/li>\n<li><code>-S\"localhost\"<\/code> = your SQL Server instance name<\/li>\n<\/ul>\n<p><strong><br \/>\nWarning:<\/strong> Do not run this test on a production server. High thread usage can exhaust resources and make the instance unresponsive.<\/li>\n<li><strong>Check for contention<\/strong> while the test runs:\n<pre><code>USE master;\nGO\n\nSELECT  \n    es.session_id,\n    es.login_time,\n    er.wait_type,\n    er.wait_resource,\n    er.command,\n    DB_NAME(er.database_id) AS dbname\nFROM sys.dm_exec_requests AS er\nJOIN sys.dm_exec_sessions AS es\n    ON er.session_id = es.session_id\nWHERE es.is_user_process = 1;<\/code><\/pre>\n<p>If you see many sessions waiting on <code>PAGELATCH_EX<\/code> with a resource like <code>2:1:14469<\/code>, this indicates latch contention on page 14469 in file 1 of database 2 (TempDB).<\/li>\n<li><strong>Identify what\u2019s on that page<\/strong> using <code>DBCC PAGE<\/code>:\n<pre><code>DBCC PAGE(2, 1, 14469, 3) WITH TABLERESULTS;<\/code><\/pre>\n<p>Look for the rows with <code>Metadata: ObjectId<\/code> and <code>Metadata: IndexId<\/code> in the first result set. Suppose you find <code>ObjectId = 34<\/code> and <code>IndexId = 2<\/code>.<\/li>\n<li><strong>Confirm the table<\/strong>:\n<pre><code>USE tempdb;\nGO\n\nSELECT name\nFROM sys.objects\nWHERE object_id = 34;<\/code><\/pre>\n<p>This might show the object is <code>sys.sysschobjs<\/code>. Index 2 leads with <code>nsclass<\/code>, a <code>TINYINT<\/code> column, which can be a bottleneck due to low selectivity.<\/li>\n<\/ol>\n<p>You may encounter similar contention in other system objects such as <code>sys.sysobjvalues<\/code> for temporary table auto-stats.<\/p>\n<h2>Practical Solution: In-Memory OLTP<\/h2>\n<h3>Memory-Optimized Table Variables<\/h3>\n<p>SQL Server\u2019s In-Memory OLTP engine (often referred to as Hekaton) allows you to create memory-optimized objects that use optimistic concurrency. A straightforward way to leverage this is with <strong>memory-optimized table variables<\/strong>.<\/p>\n<ol>\n<li><strong>Enable a memory-optimized filegroup<\/strong>:\n<pre><code>ALTER DATABASE ContentionTest\nADD FILEGROUP imoltp CONTAINS MEMORY_OPTIMIZED_DATA;\n\nALTER DATABASE ContentionTest\nADD FILE (name = 'imoltp01', filename = 'C:\\data\\imoltp')\nTO FILEGROUP imoltp;<\/code><\/pre>\n<\/li>\n<li><strong>Create a memory-optimized table type<\/strong>:\n<pre><code>USE ContentionTest;\nGO\n\nCREATE SCHEMA MemoryOptimized;\nGO\n\nCREATE TYPE MemoryOptimized.IdTable AS TABLE\n(\n    Id INT,\n    Col1 NVARCHAR(128),\n    PRIMARY KEY NONCLUSTERED (Id)\n)\nWITH (MEMORY_OPTIMIZED = ON);\nGO<\/code><\/pre>\n<p>I created a schema called \u2018MemoryOptimized\u2019 to create my table type under. How you organize your objects is your business, but as you start using memory-optimized objects, I highly recommend placing these objects in their own schema just for the sake of clarity.<\/li>\n<li><strong>Use the memory-optimized table type in a procedure<\/strong>:\n<pre><code>CREATE PROCEDURE dbo.Test2\nAS\n    DECLARE @Test MemoryOptimized.IdTable;\n\n    INSERT INTO @Test\n    SELECT 1, 'Test';<\/code><\/pre>\n<\/li>\n<li><strong>Rerun your OSTRESS test<\/strong>:\n<pre><code>ostress -Q\"EXEC ContentionTest.dbo.Test2;\" -n500 -r500 -S\"localhost\"<\/code><\/pre>\n<p>You should see a dramatic reduction in contention, and queries may finish much faster. This is because temporary storage has moved out of TempDB and into a memory-optimized structure in your user database.<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>TempDB latch contention, especially in highly concurrent environments, can bring your workload to a crawl. While adding TempDB files helps alleviate PFS and SGAM contention, system table contention can remain a bottleneck. Memory-optimized table variables (part of SQL Server\u2019s In-Memory OLTP) are a powerful solution: they move metadata operations out of TempDB and take advantage of lock-free, optimistic concurrency in memory-optimized objects.<\/p>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.red-gate.com\/simple-talk\/databases\/sql-server\/database-administration-sql-server\/optimizing-tempdb-configuration-with-sql-server-2012-extended-events\/\">Optimizing tempdb configuration with SQL Server 2012 Extended Events (Jonathan Kehayias)<\/a><\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/archive\/blogs\/sqlserverstorageengine\/improving-temp-table-and-table-variable-performance-using-memory-optimization\">Improving temp table and table variable performance using memory optimization<\/a><\/li>\n<li><a href=\"https:\/\/support.microsoft.com\/en-us\/kb\/944837\">OSTRESS Tool Download<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12,324,5,13],"tags":[360,444,354,447,445,131,446,443],"class_list":["post-203","post","type-post","status-publish","format-standard","hentry","category-internals","category-locking","category-performance","category-storage-engine","tag-database-optimization","tag-in-memory-oltp-2","tag-latch-contention","tag-memory-optimized-table-variables","tag-pfs-sgam","tag-sql-server","tag-temp-tables","tag-tempdb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Understanding and Resolving TempDB Contention in SQL Server - SQL Table Talk<\/title>\n<meta name=\"description\" content=\"TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.\" \/>\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.sqltabletalk.com\/?p=203\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Understanding and Resolving TempDB Contention in SQL Server - SQL Table Talk\" \/>\n<meta property=\"og:description\" content=\"TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqltabletalk.com\/?p=203\" \/>\n<meta property=\"og:site_name\" content=\"SQL Table Talk\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-31T13:00:00+00:00\" \/>\n<meta name=\"author\" content=\"Yvonne Vanslageren\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yvonne Vanslageren\" \/>\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\":\"Article\",\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=203#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=203\"},\"author\":{\"name\":\"Yvonne Vanslageren\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/68bb31b454bafe9e139183ed4f3e9082\"},\"headline\":\"Understanding and Resolving TempDB Contention in SQL Server\",\"datePublished\":\"2024-12-31T13:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=203\"},\"wordCount\":677,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0\"},\"keywords\":[\"Database Optimization\",\"In-Memory OLTP\",\"Latch Contention\",\"Memory-Optimized Table Variables\",\"PFS SGAM\",\"SQL Server\",\"Temp Tables\",\"TempDB\"],\"articleSection\":[\"Internals\",\"Locking\",\"Performance\",\"Storage Engine\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.sqltabletalk.com\/?p=203#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=203\",\"url\":\"https:\/\/www.sqltabletalk.com\/?p=203\",\"name\":\"Understanding and Resolving TempDB Contention in SQL Server - SQL Table Talk\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#website\"},\"datePublished\":\"2024-12-31T13:00:00+00:00\",\"description\":\"TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=203#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqltabletalk.com\/?p=203\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=203#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqltabletalk.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Understanding and Resolving TempDB Contention in SQL Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#website\",\"url\":\"https:\/\/www.sqltabletalk.com\/\",\"name\":\"SQL Table Talk\",\"description\":\"Breaking Down SQL Server, One Post at a Time.\",\"publisher\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqltabletalk.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0\",\"name\":\"Stephen Planck\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g\",\"caption\":\"Stephen Planck\"},\"logo\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/dexterwiki.com\",\"https:\/\/www.linkedin.com\/in\/stephen-planck-4611b692?trk=people-guest_people_search-card&challengeId=AQErf8gbBmcVMwAAAYsyIsxO-0UvU8z7cHrBpZoo_n3xt9qEKpRN5B_jd_LmAMu-OfeArkQ7GDjobJ2uRoQQV35EQdh_rR6kxA&submissionId=09de7067-c335-8e17-40b8-8dc32b60ed6c&challengeSource=AgEcUCw35zpPmAAAAYsyI4vAWhJTV7Nt4vZYKc3V1qiDBpCkKgUvtlOBgYXcE84&challegeType=AgE_wZiTT09IAQAAAYsyI4vDmNvbZIYe6XHju5V2bXVvM3IVxnJslgY&memberId=AgESFTkUShzs_gAAAYsyI4vGYk0Gic1uc5kB6cKOABA26Gw&recognizeDevice=AgHdSZyUSI5CEwAAAYsyI4vKd_koF9JgpsCJShT8QfbK1QMiv8SI\",\"https:\/\/www.youtube.com\/linuxmate\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/68bb31b454bafe9e139183ed4f3e9082\",\"name\":\"Yvonne Vanslageren\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/22c274a7a354b81a0a8dc5b23e8e0be9bdd81a6bc0541474cfb6b954d6bb2089?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/22c274a7a354b81a0a8dc5b23e8e0be9bdd81a6bc0541474cfb6b954d6bb2089?s=96&d=mm&r=g\",\"caption\":\"Yvonne Vanslageren\"},\"url\":\"https:\/\/www.sqltabletalk.com\/?author=2\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Understanding and Resolving TempDB Contention in SQL Server - SQL Table Talk","description":"TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.","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.sqltabletalk.com\/?p=203","og_locale":"en_US","og_type":"article","og_title":"Understanding and Resolving TempDB Contention in SQL Server - SQL Table Talk","og_description":"TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.","og_url":"https:\/\/www.sqltabletalk.com\/?p=203","og_site_name":"SQL Table Talk","article_published_time":"2024-12-31T13:00:00+00:00","author":"Yvonne Vanslageren","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Yvonne Vanslageren","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sqltabletalk.com\/?p=203#article","isPartOf":{"@id":"https:\/\/www.sqltabletalk.com\/?p=203"},"author":{"name":"Yvonne Vanslageren","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/68bb31b454bafe9e139183ed4f3e9082"},"headline":"Understanding and Resolving TempDB Contention in SQL Server","datePublished":"2024-12-31T13:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sqltabletalk.com\/?p=203"},"wordCount":677,"commentCount":0,"publisher":{"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0"},"keywords":["Database Optimization","In-Memory OLTP","Latch Contention","Memory-Optimized Table Variables","PFS SGAM","SQL Server","Temp Tables","TempDB"],"articleSection":["Internals","Locking","Performance","Storage Engine"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sqltabletalk.com\/?p=203#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sqltabletalk.com\/?p=203","url":"https:\/\/www.sqltabletalk.com\/?p=203","name":"Understanding and Resolving TempDB Contention in SQL Server - SQL Table Talk","isPartOf":{"@id":"https:\/\/www.sqltabletalk.com\/#website"},"datePublished":"2024-12-31T13:00:00+00:00","description":"TempDB contention is a common challenge in SQL Server when running highly concurrent workloads. In this post, we will explore why it occurs, how to identify it, and some practical solutions\u2014especially leveraging In-Memory OLTP and memory-optimized table variables.","breadcrumb":{"@id":"https:\/\/www.sqltabletalk.com\/?p=203#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqltabletalk.com\/?p=203"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqltabletalk.com\/?p=203#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqltabletalk.com\/"},{"@type":"ListItem","position":2,"name":"Understanding and Resolving TempDB Contention in SQL Server"}]},{"@type":"WebSite","@id":"https:\/\/www.sqltabletalk.com\/#website","url":"https:\/\/www.sqltabletalk.com\/","name":"SQL Table Talk","description":"Breaking Down SQL Server, One Post at a Time.","publisher":{"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqltabletalk.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0","name":"Stephen Planck","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g","caption":"Stephen Planck"},"logo":{"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/dexterwiki.com","https:\/\/www.linkedin.com\/in\/stephen-planck-4611b692?trk=people-guest_people_search-card&challengeId=AQErf8gbBmcVMwAAAYsyIsxO-0UvU8z7cHrBpZoo_n3xt9qEKpRN5B_jd_LmAMu-OfeArkQ7GDjobJ2uRoQQV35EQdh_rR6kxA&submissionId=09de7067-c335-8e17-40b8-8dc32b60ed6c&challengeSource=AgEcUCw35zpPmAAAAYsyI4vAWhJTV7Nt4vZYKc3V1qiDBpCkKgUvtlOBgYXcE84&challegeType=AgE_wZiTT09IAQAAAYsyI4vDmNvbZIYe6XHju5V2bXVvM3IVxnJslgY&memberId=AgESFTkUShzs_gAAAYsyI4vGYk0Gic1uc5kB6cKOABA26Gw&recognizeDevice=AgHdSZyUSI5CEwAAAYsyI4vKd_koF9JgpsCJShT8QfbK1QMiv8SI","https:\/\/www.youtube.com\/linuxmate"]},{"@type":"Person","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/68bb31b454bafe9e139183ed4f3e9082","name":"Yvonne Vanslageren","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/22c274a7a354b81a0a8dc5b23e8e0be9bdd81a6bc0541474cfb6b954d6bb2089?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/22c274a7a354b81a0a8dc5b23e8e0be9bdd81a6bc0541474cfb6b954d6bb2089?s=96&d=mm&r=g","caption":"Yvonne Vanslageren"},"url":"https:\/\/www.sqltabletalk.com\/?author=2"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts\/203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=203"}],"version-history":[{"count":6,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts\/203\/revisions"}],"predecessor-version":[{"id":941,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts\/203\/revisions\/941"}],"wp:attachment":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}