{"id":496,"date":"2012-05-03T07:24:58","date_gmt":"2012-05-03T07:24:58","guid":{"rendered":"\/blogs\/joe\/post\/Being-Mindful-of-Cursor-Lock-Overhead.aspx"},"modified":"2013-01-02T20:31:57","modified_gmt":"2013-01-03T04:31:57","slug":"being-mindful-of-cursor-lock-overhead","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/","title":{"rendered":"Being Mindful of Cursor Lock Overhead"},"content":{"rendered":"<p>This post is just a reminder to be attentive to the locking overhead of your Transact-SQL server cursors.<\/p>\n<p>For example, the following cursor is using default options in SQL Server 2012 to iterate row-by-row through the Employee table.&#160; I\u2019m declaring a variable and populating it with the BusinessEntityID from each row (and I\u2019m not doing anything with it \u2013 as I just wanted to avoid the chatter back to my SQL Server Management Studio window):<\/p>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"lnum\">   1:  <\/span><span class=\"kwrd\">DECLARE<\/span> Employee_Cursor <span class=\"kwrd\">CURSOR<\/span> <span class=\"kwrd\">FOR<\/span><\/pre>\n<pre><span class=\"lnum\">   2:  <\/span>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   3:  <\/span><span class=\"kwrd\">SELECT<\/span> BusinessEntityID<\/pre>\n<pre><span class=\"lnum\">   4:  <\/span><span class=\"kwrd\">FROM<\/span> [HumanResources].[Employee];<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   5:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">   6:  <\/span><span class=\"kwrd\">SELECT<\/span> properties<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   7:  <\/span><span class=\"kwrd\">FROM<\/span> sys.dm_exec_cursors(52);<\/pre>\n<pre><span class=\"lnum\">   8:  <\/span>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   9:  <\/span><span class=\"kwrd\">OPEN<\/span> Employee_Cursor;<\/pre>\n<pre><span class=\"lnum\">  10:  <\/span>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  11:  <\/span><span class=\"kwrd\">DECLARE<\/span> @BusinessEntityID <span class=\"kwrd\">int<\/span>;<\/pre>\n<pre><span class=\"lnum\">  12:  <\/span>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  13:  <\/span><span class=\"kwrd\">FETCH<\/span> <span class=\"kwrd\">NEXT<\/span> <span class=\"kwrd\">FROM<\/span> Employee_Cursor<\/pre>\n<pre><span class=\"lnum\">  14:  <\/span><span class=\"kwrd\">INTO<\/span> @BusinessEntityID;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  15:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">  16:  <\/span><span class=\"kwrd\">WHILE<\/span> <span class=\"preproc\">@@FETCH_STATUS<\/span> = 0<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  17:  <\/span><span class=\"kwrd\">BEGIN<\/span><\/pre>\n<pre><span class=\"lnum\">  18:  <\/span>   <\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  19:  <\/span>    <span class=\"kwrd\">FETCH<\/span> <span class=\"kwrd\">NEXT<\/span> <span class=\"kwrd\">FROM<\/span> Employee_Cursor<\/pre>\n<pre><span class=\"lnum\">  20:  <\/span>    <span class=\"kwrd\">INTO<\/span> @BusinessEntityID;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  21:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">  22:  <\/span><span class=\"kwrd\">END<\/span><\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  23:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">  24:  <\/span><span class=\"kwrd\">CLOSE<\/span> Employee_Cursor;<\/pre>\n<\/div>\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>Now what kind of locking behavior did I see?&#160; Using extended events and tracking lock_acquired and lock_released, I saw 2,340 events total.&#160; Below is just a bit of what I saw \u2013 with the IS mode acquired for object, then IS mode lock for page, then S lock mode for the key, released for that key, acquired for the next key, released, and then released for the page and object and then starting all over again until reaching the final row of the table.<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/watch-your\/3dc81a95\/snaghtml1610fa0.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=\"SNAGHTML1610fa0\" border=\"0\" alt=\"SNAGHTML1610fa0\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/watch-your\/1bfc4204\/snaghtml1610fa0_thumb.png\" width=\"1036\" height=\"374\" \/><\/a><\/p>\n<p>I also included a call to sys.dm_exec_cursors for my test session id (52).&#160; This returned the following property value:<\/p>\n<blockquote>\n<p>TSQL | Dynamic | Optimistic | Global (0)<\/p>\n<\/blockquote>\n<p>What about using SCROLL_LOCKS? (TSQL | Dynamic | Scroll Locks | Global (0)).&#160; Here is the slightly modified T-SQL code and abridged result set:<\/p>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"lnum\">   1:  <\/span><span class=\"kwrd\">DECLARE<\/span> Employee_Cursor  <span class=\"kwrd\">CURSOR<\/span> SCROLL_LOCKS<\/pre>\n<pre><span class=\"lnum\">   2:  <\/span><span class=\"kwrd\">FOR<\/span><\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   3:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">   4:  <\/span><span class=\"kwrd\">SELECT<\/span> BusinessEntityID<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   5:  <\/span><span class=\"kwrd\">FROM<\/span> [HumanResources].[Employee];<\/pre>\n<pre><span class=\"lnum\">   6:  <\/span>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   7:  <\/span><span class=\"kwrd\">SELECT<\/span> properties<\/pre>\n<pre><span class=\"lnum\">   8:  <\/span><span class=\"kwrd\">FROM<\/span> sys.dm_exec_cursors(55);<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">   9:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">  10:  <\/span><span class=\"kwrd\">OPEN<\/span> Employee_Cursor;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  11:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">  12:  <\/span><span class=\"kwrd\">FETCH<\/span> <span class=\"kwrd\">NEXT<\/span> <span class=\"kwrd\">FROM<\/span> Employee_Cursor;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  13:  <\/span>&#160;<\/pre>\n<pre><span class=\"lnum\">  14:  <\/span><span class=\"kwrd\">WHILE<\/span> <span class=\"preproc\">@@FETCH_STATUS<\/span> = 0<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  15:  <\/span><span class=\"kwrd\">BEGIN<\/span><\/pre>\n<pre><span class=\"lnum\">  16:  <\/span>   <\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  17:  <\/span>    <span class=\"kwrd\">FETCH<\/span> <span class=\"kwrd\">NEXT<\/span> <span class=\"kwrd\">FROM<\/span> Employee_Cursor;<\/pre>\n<pre><span class=\"lnum\">  18:  <\/span>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  19:  <\/span><span class=\"kwrd\">END<\/span><\/pre>\n<pre><span class=\"lnum\">  20:  <\/span>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"lnum\">  21:  <\/span><span class=\"kwrd\">CLOSE<\/span> Employee_Cursor;<\/pre>\n<pre><span class=\"lnum\">  22:  <\/span><span class=\"kwrd\">DEALLOCATE<\/span> Employee_Cursor;<\/pre>\n<\/div>\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><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/watch-your\/45fc402c\/snaghtml1712dcb.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=\"SNAGHTML1712dcb\" border=\"0\" alt=\"SNAGHTML1712dcb\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/watch-your\/04edc0c8\/snaghtml1712dcb_thumb.png\" width=\"1038\" height=\"335\" \/><\/a><\/p>\n<p>Now we see IX (object), IU (page) and U (key) modes enter the mix.&#160; By the way, the 1237579447 is associated with the Employee table.&#160; The 72057594045136896 value is the container_id \u2013 which is a type \u201c1\u201d (IN_ROW_DATA), so we can cross reference to sys.partitions.hobt_id, which then correlated to the Employee table.<\/p>\n<p>Are the locks necessary? Maybe, depending on what you wish to achieve, but I find that often the cursor settings are not configured intentionally.&#160; <\/p>\n<p>As an exercise, you can check sys.dm_exec_cursor to see cursors running on your server at that moment in time.&#160; This DMF will surface the session IDs, cursor name, properties and the associated sql_handle.&#160; You may see settings that are unexpected or are overkill for what is actually required.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is just a reminder to be attentive to the locking overhead of your Transact-SQL server cursors. For example, the following cursor is using default options in SQL Server 2012 to iterate row-by-row through the Employee table.&#160; I\u2019m declaring a variable and populating it with the BusinessEntityID from each row (and I\u2019m not doing [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28],"tags":[],"class_list":["post-496","post","type-post","status-publish","format-standard","hentry","category-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Being Mindful of Cursor Lock Overhead - 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\/being-mindful-of-cursor-lock-overhead\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Being Mindful of Cursor Lock Overhead - Joe Sack\" \/>\n<meta property=\"og:description\" content=\"This post is just a reminder to be attentive to the locking overhead of your Transact-SQL server cursors. For example, the following cursor is using default options in SQL Server 2012 to iterate row-by-row through the Employee table.&#160; I\u2019m declaring a variable and populating it with the BusinessEntityID from each row (and I\u2019m not doing [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/\" \/>\n<meta property=\"og:site_name\" content=\"Joe Sack\" \/>\n<meta property=\"article:published_time\" content=\"2012-05-03T07:24:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-01-03T04:31:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/watch-your\/1bfc4204\/snaghtml1610fa0_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=\"2 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\/being-mindful-of-cursor-lock-overhead\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/\",\"name\":\"Being Mindful of Cursor Lock Overhead - Joe Sack\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#website\"},\"datePublished\":\"2012-05-03T07:24:58+00:00\",\"dateModified\":\"2013-01-03T04:31:57+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Performance\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/performance\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Being Mindful of Cursor Lock Overhead\"}]},{\"@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":"Being Mindful of Cursor Lock Overhead - 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\/being-mindful-of-cursor-lock-overhead\/","og_locale":"en_US","og_type":"article","og_title":"Being Mindful of Cursor Lock Overhead - Joe Sack","og_description":"This post is just a reminder to be attentive to the locking overhead of your Transact-SQL server cursors. For example, the following cursor is using default options in SQL Server 2012 to iterate row-by-row through the Employee table.&#160; I\u2019m declaring a variable and populating it with the BusinessEntityID from each row (and I\u2019m not doing [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/","og_site_name":"Joe Sack","article_published_time":"2012-05-03T07:24:58+00:00","article_modified_time":"2013-01-03T04:31:57+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/windows-live-writer\/watch-your\/1bfc4204\/snaghtml1610fa0_thumb.png"}],"author":"Joseph Sack","twitter_misc":{"Written by":"Joseph Sack","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/","url":"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/","name":"Being Mindful of Cursor Lock Overhead - Joe Sack","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#website"},"datePublished":"2012-05-03T07:24:58+00:00","dateModified":"2013-01-03T04:31:57+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/being-mindful-of-cursor-lock-overhead\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/"},{"@type":"ListItem","position":2,"name":"Performance","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/performance\/"},{"@type":"ListItem","position":3,"name":"Being Mindful of Cursor Lock Overhead"}]},{"@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\/496","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=496"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts\/496\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/media?parent=496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/categories?post=496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/tags?post=496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}