{"id":1110,"date":"2013-11-17T14:09:08","date_gmt":"2013-11-17T22:09:08","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/joe\/?p=1110"},"modified":"2013-12-29T19:12:46","modified_gmt":"2013-12-30T03:12:46","slug":"the-cselcalcascendingkeyfilter-calculator","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/","title":{"rendered":"The CSelCalcAscendingKeyFilter Calculator"},"content":{"rendered":"<p>This post is a continuation of the SQL Server 2014 Cardinality Estimator enhancements exploration series (yeah \u2013 I\u2019ve decided to call this a series, since there will be quite a bit to talk about, time permitting):<\/p>\n<ul>\n<li><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/a-first-look-at-the-query_optimizer_estimate_cardinality-xe-event\/\" target=\"_blank\">A first look at the query_optimizer_estimate_cardinality XE event<\/a><\/li>\n<li><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/cselcalccombinefilters_exponentialbackoff-calculator\/\" target=\"_blank\">\u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator<\/a><\/li>\n<li><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/cselcalccombinefilters_exponentialbackoff-calculator-part-ii\/\" target=\"_blank\">\u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator\u2013 Part II<\/a><\/li>\n<\/ul>\n<p>So for this post, I created a nonclustered index on the charge_dt column from the charge table in the Credit sample database and then inserted 10 new rows as follows:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nINSERT INTO &#x5B;dbo].&#x5B;charge]\r\n(&#x5B;member_no]\r\n,&#x5B;provider_no]\r\n,&#x5B;category_no]\r\n,&#x5B;charge_dt]\r\n,&#x5B;charge_amt]\r\n,&#x5B;statement_no]\r\n,&#x5B;charge_code])\r\nSELECT TOP 10 &#x5B;member_no]\r\n,&#x5B;provider_no]\r\n,&#x5B;category_no]\r\n,GETDATE()\r\n,&#x5B;charge_amt]\r\n,&#x5B;statement_no]\r\n,&#x5B;charge_code]\r\nFROM dbo.charge\r\nGO\r\n<\/pre>\n<p>Notice I\u2019m using GETDATE() for the charge_dt, and if you look at the last few rows of the histogram for charge_dt you\u2019ll see that nothing in the year 2013 is represented (and I\u2019m only inserting 10 new rows, and haven\u2019t manually update statistics recently):<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image11.png\"><img fetchpriority=\"high\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb11.png\" width=\"765\" height=\"318\" border=\"0\" \/><\/a><\/p>\n<p>In SQL Server 2012, what row estimate would you expect if I executed the following query?<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nSELECT &#x5B;charge_no]\r\nFROM dbo.&#x5B;charge]\r\nWHERE &#x5B;charge_dt] = \u20182013-11-17 12:46:44.307\u2019\r\nOPTION (RECOMPILE);\r\n<\/pre>\n<p>In this case, the plan tree (via SQL Sentry Plan Explorer) is as follows:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image12.png\"><img decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb12.png\" width=\"866\" height=\"93\" border=\"0\" \/><\/a><\/p>\n<p>The estimate is for 1 row (actual is 10 rows).<\/p>\n<p>What are my estimates if I switch the database to compatibility mode 120 and re-execute the same exact query?<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image13.png\"><img decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb13.png\" width=\"869\" height=\"90\" border=\"0\" \/><\/a><\/p>\n<p>In 2014 CTP2 \u2013 my estimate is for 10 rows, and re-checking the histogram, the maximum RANGE_HI_KEY is still 1999-10-13 10:51:19.317 and not a more recent value.<\/p>\n<p>What does the query_optimizer_estimate_cardinality event show?<\/p>\n<blockquote><p>&lt;CalculatorList&gt;<br \/>\n&lt;FilterCalculator CalculatorName=&#8221;<span style=\"background-color: #ffff00;\">CSelCalcColumnInInterval<\/span>&#8221; Selectivity=&#8221;-1.000&#8243;<br \/>\n<span style=\"background-color: #ffff00;\"> CalculatorFailed=&#8221;true&#8221;<\/span> TableName=&#8221;[Credit].[dbo].[charge]&#8221; ColumnName=&#8221;charge_dt&#8221; \/&gt;<\/p>\n<p>&lt;FilterCalculator CalculatorName=&#8221;<span style=\"background-color: #00ff00;\">CSelCalcAscendingKeyFilter<\/span>&#8221; Selectivity=&#8221;0.000&#8243;<br \/>\nTableName=&#8221;[Credit].[dbo].[charge]&#8221; ColumnName=&#8221;charge_dt&#8221; <span style=\"background-color: #00ff00;\">UseAverageFrequency=&#8221;true&#8221;<\/span> StatId=&#8221;7&#8243; \/&gt;<br \/>\n&lt;\/CalculatorList&gt;<\/p><\/blockquote>\n<p>I highlighted a couple of interesting areas \u2013 including the CalculatorFailed=\u201dtrue\u201d associated with CSelCalcColumnInInterval and then what seems to be the application of a second calculator, CSelCalcAscendingKeyFilter \u2013 which implies I would assume something related to the classic ascending key issue and a \u201ctrue\u201d for \u201cUseAverageFrequency\u201d.<\/p>\n<p>If this is average frequency, then we\u2019re looking at density times the row count, which would mean 1,600,010 rows times the 1.006087E-05 density from the that particular statistics object:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image14.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb14.png\" width=\"476\" height=\"101\" border=\"0\" \/><\/a><\/p>\n<p>However if you do that calculation, you\u2019ll get 16.0974926087 instead of the 10 row estimate.<\/p>\n<p>Looking further in the query_optimizer_estimate_cardinality output (still associated with the prior calculator) I see the following:<\/p>\n<blockquote><p>&lt;StatsCollection Name=&#8221;CStCollFilter&#8221; Id=&#8221;2&#8243; <span style=\"background-color: #00ff00;\">Card=&#8221;10.00&#8243;<\/span>&gt;<br \/>\n&lt;LoadedStats&gt;<br \/>\n&lt;StatsInfo DbId=&#8221;6&#8243; ObjectId=&#8221;229575856&#8243; StatsId=&#8221;7&#8243; \/&gt;<br \/>\n&lt;\/LoadedStats&gt;<br \/>\n&lt;\/StatsCollection&gt;<\/p><\/blockquote>\n<p>Continuing the search, I loaded 90 more rows with that same \u20182013-11-17 12:46:44.307\u2019 value and re-executed the query to see the query_optimizer_estimate_cardinality event information.<\/p>\n<p>This time the estimates bumped up as follows (16 rows instead of a 10 row estimate, with 100 actual rows):<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image15.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb15.png\" width=\"805\" height=\"95\" border=\"0\" \/><\/a><\/p>\n<p>There was still no change to the statistics (no additional step for the year 2013 data).<\/p>\n<p>As for query_optimizer_estimate_cardinality event information, I saw the following:<\/p>\n<blockquote><p>&lt;CalculatorList&gt;<br \/>\n&lt;FilterCalculator CalculatorName=&#8221;CSelCalcColumnInInterval&#8221; Selectivity=&#8221;-1.000&#8243; CalculatorFailed=&#8221;true&#8221; TableName=&#8221;[Credit].[dbo].[charge]&#8221; ColumnName=&#8221;charge_dt&#8221; \/&gt;<br \/>\n&lt;FilterCalculator CalculatorName=&#8221;CSelCalcAscendingKeyFilter&#8221; Selectivity=&#8221;0.000&#8243; TableName=&#8221;[Credit].[dbo].[charge]&#8221; ColumnName=&#8221;charge_dt&#8221; <span style=\"background-color: #00ff00;\">UseAverageFrequency=&#8221;true&#8221;<\/span> StatId=&#8221;7&#8243; \/&gt;<br \/>\n&lt;\/CalculatorList&gt;<\/p><\/blockquote>\n<blockquote><p>&lt;StatsCollection Name=&#8221;CStCollFilter&#8221; Id=&#8221;2&#8243; Card=&#8221;<span style=\"background-color: #00ff00;\">16.10<\/span>&#8220;&gt;<br \/>\n&lt;LoadedStats&gt;<br \/>\n&lt;StatsInfo DbId=&#8221;6&#8243; ObjectId=&#8221;229575856&#8243; StatsId=&#8221;7&#8221; \/&gt;<br \/>\n&lt;\/LoadedStats&gt;<br \/>\n&lt;\/StatsCollection&gt;<\/p><\/blockquote>\n<p>The 16.10 reflects what the average frequency value was that I expected (16.0974926087 rounded up).\u00a0 But regarding the original 10 estimate, I wondered what would happen if I deleted 99 out of the 100 rows with the 2013 value.\u00a0 Would I still see a Card=\u201d10.00\u201d or something else?<\/p>\n<p>This is what I saw:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image16.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"image\" alt=\"image\" src=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb16.png\" width=\"859\" height=\"86\" border=\"0\" \/><\/a><\/p>\n<p>The estimate was for 16 rows again \u2013 with 1 actual row returned.<\/p>\n<p>Then I thought about reverting to the beginning of my test \u2013 restoring from backup to the vanilla version of the Credit database and then flipping it to 2014 mode again.\u00a0 I did this, re-created the index on charge_dt and then re-ran the initial 10 row insert and follow-up query against the 2013 date value that didn\u2019t exist as a histogram step.\u00a0 I was able to repeat the 10 row estimate effect.<\/p>\n<p>I also tried a re-set of the test with just 2 rows initially inserted and got the estimate of 2 rows and Card=\u201d2.00\u201d for the stats_collection output for query_optimizer_estimate_cardinality. Same thing if I did 15 rows (got a 15 row estimate).\u00a0 Doing 16 rows, the same \u2013 estimating 16 instead of 16.10.<\/p>\n<p>And when I reset the test with 17 rows (which is above the average frequency), the estimate used is the average frequency of 16.10 and <em>not<\/em> 17.\u00a0 Interesting!<\/p>\n<p>Much more to explore on this overall subject.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is a continuation of the SQL Server 2014 Cardinality Estimator enhancements exploration series (yeah \u2013 I\u2019ve decided to call this a series, since there will be quite a bit to talk about, time permitting): A first look at the query_optimizer_estimate_cardinality XE event \u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator \u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator\u2013 Part II So for this post, I [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42,28],"tags":[],"class_list":["post-1110","post","type-post","status-publish","format-standard","hentry","category-cardinality-estimation","category-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The CSelCalcAscendingKeyFilter Calculator - 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\/the-cselcalcascendingkeyfilter-calculator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The CSelCalcAscendingKeyFilter Calculator - Joe Sack\" \/>\n<meta property=\"og:description\" content=\"This post is a continuation of the SQL Server 2014 Cardinality Estimator enhancements exploration series (yeah \u2013 I\u2019ve decided to call this a series, since there will be quite a bit to talk about, time permitting): A first look at the query_optimizer_estimate_cardinality XE event \u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator \u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator\u2013 Part II So for this post, I [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/\" \/>\n<meta property=\"og:site_name\" content=\"Joe Sack\" \/>\n<meta property=\"article:published_time\" content=\"2013-11-17T22:09:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-12-30T03:12:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb11.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=\"4 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\/the-cselcalcascendingkeyfilter-calculator\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/\",\"name\":\"The CSelCalcAscendingKeyFilter Calculator - Joe Sack\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#website\"},\"datePublished\":\"2013-11-17T22:09:08+00:00\",\"dateModified\":\"2013-12-30T03:12:46+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cardinality Estimation\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/cardinality-estimation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"The CSelCalcAscendingKeyFilter Calculator\"}]},{\"@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":"The CSelCalcAscendingKeyFilter Calculator - 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\/the-cselcalcascendingkeyfilter-calculator\/","og_locale":"en_US","og_type":"article","og_title":"The CSelCalcAscendingKeyFilter Calculator - Joe Sack","og_description":"This post is a continuation of the SQL Server 2014 Cardinality Estimator enhancements exploration series (yeah \u2013 I\u2019ve decided to call this a series, since there will be quite a bit to talk about, time permitting): A first look at the query_optimizer_estimate_cardinality XE event \u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator \u201cCSelCalcCombineFilters_ExponentialBackoff\u201d Calculator\u2013 Part II So for this post, I [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/","og_site_name":"Joe Sack","article_published_time":"2013-11-17T22:09:08+00:00","article_modified_time":"2013-12-30T03:12:46+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-content\/uploads\/2013\/11\/image_thumb11.png"}],"author":"Joseph Sack","twitter_misc":{"Written by":"Joseph Sack","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/","url":"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/","name":"The CSelCalcAscendingKeyFilter Calculator - Joe Sack","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#website"},"datePublished":"2013-11-17T22:09:08+00:00","dateModified":"2013-12-30T03:12:46+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/#\/schema\/person\/533eb0113a15fb5a6e8067a49e4ae648"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/joe\/the-cselcalcascendingkeyfilter-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/"},{"@type":"ListItem","position":2,"name":"Cardinality Estimation","item":"https:\/\/www.sqlskills.com\/blogs\/joe\/category\/cardinality-estimation\/"},{"@type":"ListItem","position":3,"name":"The CSelCalcAscendingKeyFilter Calculator"}]},{"@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\/1110","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=1110"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/posts\/1110\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/media?parent=1110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/categories?post=1110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/joe\/wp-json\/wp\/v2\/tags?post=1110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}