{"id":689,"date":"2008-06-09T21:02:00","date_gmt":"2008-06-09T21:02:00","guid":{"rendered":"\/blogs\/bobb\/post\/Performance-features-in-SQL-Server-2008-RC0-Hashes-for-queries-and-query-plans.aspx"},"modified":"2008-06-09T21:02:00","modified_gmt":"2008-06-09T21:02:00","slug":"performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/","title":{"rendered":"Performance features in SQL Server 2008 RC0 &#8211; Hashes for queries and query plans"},"content":{"rendered":"<p>\nThere&#39;s a newer version of SQL Server 2008 (Release Candidate 0) available on MSDN and Technet.\n<\/p>\n<p>\nAnother performance-related feature (actually its additional information) allows you to have better visibility into performance-affecting queries. This information is available as columns query_hash and query_plan_hash in the sys.dm_exec_query_stats and sys.dm_exec_requests DMV. There&#39;s a really nice illustrative example in Books Online, so I won&#39;t repeat it here. You can use the queries in my last blog post to experiment with this as well.\n<\/p>\n<p>\nThe queries:\n<\/p>\n<p>\nSELECT title_id, sum(qty) from sales<br \/>\ngroup by title_id<br \/>\nhaving sum(qty) = 30\n<\/p>\n<p>\nand\n<\/p>\n<p>\nSELECT title_id, sum(qty) from sales<br \/>\ngroup by title_id<br \/>\nhaving sum(qty) = 40\n<\/p>\n<p>\nare similar enough that they could be parameterized (although they aren&#39;t autoparameterized). Parameterization would save query plan entry storage, rather than allocating a separate plan for each incantation of the similar query. You can also use this feature, along with the additional information in sys.dm_exec_query_stats to produce cumulative statistics (such as avg IOs, elasped time, etc. BOL has a nice query to accumulate similar plans, the relavent part is simply &quot;GROUP BY query_hash&quot;.\n<\/p>\n<p>\nBut because you have similar queries, should you always have a parameterized query? What if &quot;&#8230;having&nbsp; sum(qty) = 30&quot; has a completely different plan than &quot;&#8230;having sum(qty) = 130&quot;? You can find this information by looking at query_plan_hash. If two plans have similar structure but a different query plan, the query_hash value will be identical but query_plan_hash will be different. That&#39;s an indication that parameterization might not be the way to go; the first query to executed will cache it&#39;s plan and the other query will use the same plan. This is because of a SQL Server behavior known as parameter sniffing.\n<\/p>\n<p>\nBecause parameterizing queries is usually one of the first things programmers can do to affect performance, it helps to know when to parameterize. In addition, many folks like to start query tuning by tuning the queries (including&nbsp;similar queries with different parameter values)&nbsp;that are executed most frequently. Query_plan_hash and query_hash gives you visibility into this important information.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There&#39;s a newer version of SQL Server 2008 (Release Candidate 0) available on MSDN and Technet. Another performance-related feature (actually its additional information) allows you to have better visibility into performance-affecting queries. This information is available as columns query_hash and query_plan_hash in the sys.dm_exec_query_stats and sys.dm_exec_requests DMV. There&#39;s a really nice illustrative example in Books [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,29],"tags":[],"class_list":["post-689","post","type-post","status-publish","format-standard","hentry","category-performance","category-sql-server-2008"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Performance features in SQL Server 2008 RC0 - Hashes for queries and query plans - Bob Beauchemin<\/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\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Performance features in SQL Server 2008 RC0 - Hashes for queries and query plans - Bob Beauchemin\" \/>\n<meta property=\"og:description\" content=\"There&#039;s a newer version of SQL Server 2008 (Release Candidate 0) available on MSDN and Technet. Another performance-related feature (actually its additional information) allows you to have better visibility into performance-affecting queries. This information is available as columns query_hash and query_plan_hash in the sys.dm_exec_query_stats and sys.dm_exec_requests DMV. There&#039;s a really nice illustrative example in Books [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/\" \/>\n<meta property=\"og:site_name\" content=\"Bob Beauchemin\" \/>\n<meta property=\"article:published_time\" content=\"2008-06-09T21:02:00+00:00\" \/>\n<meta name=\"author\" content=\"Bob Beauchemin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Bob Beauchemin\" \/>\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\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/\",\"name\":\"Performance features in SQL Server 2008 RC0 - Hashes for queries and query plans - Bob Beauchemin\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/#website\"},\"datePublished\":\"2008-06-09T21:02:00+00:00\",\"dateModified\":\"2008-06-09T21:02:00+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/#\/schema\/person\/62bfa986c5b5d28fcffd8b4fc409c73e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Performance\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/category\/performance\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Performance features in SQL Server 2008 RC0 &#8211; Hashes for queries and query plans\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/\",\"name\":\"Bob Beauchemin\",\"description\":\"SQL Server Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/#\/schema\/person\/62bfa986c5b5d28fcffd8b4fc409c73e\",\"name\":\"Bob Beauchemin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6f80e6cc667410857fa6a21931dc528b8092f4d112bf7a8ff7c267674d44ee37?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6f80e6cc667410857fa6a21931dc528b8092f4d112bf7a8ff7c267674d44ee37?s=96&d=mm&r=g\",\"caption\":\"Bob Beauchemin\"},\"sameAs\":[\"http:\/www.sqlskills.com\/blogs\/bobb\/\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/bobb\/author\/bobb\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Performance features in SQL Server 2008 RC0 - Hashes for queries and query plans - Bob Beauchemin","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\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/","og_locale":"en_US","og_type":"article","og_title":"Performance features in SQL Server 2008 RC0 - Hashes for queries and query plans - Bob Beauchemin","og_description":"There&#39;s a newer version of SQL Server 2008 (Release Candidate 0) available on MSDN and Technet. Another performance-related feature (actually its additional information) allows you to have better visibility into performance-affecting queries. This information is available as columns query_hash and query_plan_hash in the sys.dm_exec_query_stats and sys.dm_exec_requests DMV. There&#39;s a really nice illustrative example in Books [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/","og_site_name":"Bob Beauchemin","article_published_time":"2008-06-09T21:02:00+00:00","author":"Bob Beauchemin","twitter_misc":{"Written by":"Bob Beauchemin","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/","url":"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/","name":"Performance features in SQL Server 2008 RC0 - Hashes for queries and query plans - Bob Beauchemin","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/#website"},"datePublished":"2008-06-09T21:02:00+00:00","dateModified":"2008-06-09T21:02:00+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/#\/schema\/person\/62bfa986c5b5d28fcffd8b4fc409c73e"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/performance-features-in-sql-server-2008-rc0-hashes-for-queries-and-query-plans\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/bobb\/"},{"@type":"ListItem","position":2,"name":"Performance","item":"https:\/\/www.sqlskills.com\/blogs\/bobb\/category\/performance\/"},{"@type":"ListItem","position":3,"name":"Performance features in SQL Server 2008 RC0 &#8211; Hashes for queries and query plans"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/bobb\/","name":"Bob Beauchemin","description":"SQL Server Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/bobb\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/#\/schema\/person\/62bfa986c5b5d28fcffd8b4fc409c73e","name":"Bob Beauchemin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/bobb\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6f80e6cc667410857fa6a21931dc528b8092f4d112bf7a8ff7c267674d44ee37?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6f80e6cc667410857fa6a21931dc528b8092f4d112bf7a8ff7c267674d44ee37?s=96&d=mm&r=g","caption":"Bob Beauchemin"},"sameAs":["http:\/www.sqlskills.com\/blogs\/bobb\/"],"url":"https:\/\/www.sqlskills.com\/blogs\/bobb\/author\/bobb\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/posts\/689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/posts\/689\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/media?parent=689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/categories?post=689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/bobb\/wp-json\/wp\/v2\/tags?post=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}