<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblogcasts.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>sqlworkshops</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Stale statistics on a newly created temporary table in a stored procedure can lead to poor performance</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2012/08/15/stale-statistics-on-a-newly-created-temporary-table-in-a-stored-procedure-can-lead-to-poor-performance.aspx</link><pubDate>Wed, 15 Aug 2012 15:26:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:16274</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=16274</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2012/08/15/stale-statistics-on-a-newly-created-temporary-table-in-a-stored-procedure-can-lead-to-poor-performance.aspx#comments</comments><description>&lt;p dir="LTR" align="LEFT"&gt;When you create a temporary table you expect a new table with no past history (statistics based on past existence), this is not true if you have less than 6 updates to the temporary table. This might lead to poor performance of queries which are sensitive to the content of temporary tables.&lt;/p&gt;&lt;p dir="LTR" align="LEFT"&gt;I was optimizing SQL Server Performance at one of my customers who provides search functionality on their website. They use stored procedure with temporary table for the search. The performance of the search depended on who searched what in the past, option (recompile) by itself had no effect. Sometimes a simple search led to timeout because of non-optimal plan usage due to this behavior. This is not a plan caching issue rather temporary table statistics caching issue, which was part of the temporary object caching feature that was introduced in SQL Server 2005 and is also present in SQL Server 2008 and SQL Server 2012. In this customer case we implemented a workaround to avoid this issue (see below for example for workarounds).&lt;/p&gt;&lt;p dir="LTR" align="LEFT"&gt;When temporary tables are cached, the statistics are not newly created rather cached from the past and updated based on automatic update statistics threshold. Caching temporary tables/objects is good for performance, but caching stale statistics from the past is not optimal.&lt;/p&gt;&lt;p dir="LTR" align="LEFT"&gt;We can work around this issue by disabling temporary table caching by explicitly executing a DDL statement on the temporary table. One possibility is to execute an alter table statement, but this can lead to duplicate constraint name error on concurrent stored procedure execution. The other way to work around this is to create an index.&lt;/p&gt;&lt;p dir="LTR" align="LEFT"&gt;I think there might be many customers in such a situation without knowing that stale statistics are being cached along with temporary table leading to poor performance.&lt;/p&gt;&lt;p dir="LTR" align="LEFT"&gt;Ideal solution is to have more aggressive statistics update when the temporary table has less number of rows when temporary table caching is used. I will open a connect item to report this issue.&lt;/p&gt;&lt;p dir="LTR" align="LEFT"&gt;Meanwhile you can mitigate the issue by creating an index on the temporary table. You can monitor active temporary tables using Windows Server Performance Monitor counter: SQL Server: General Statistics-&amp;gt;Active Temp Tables.&lt;/p&gt;&lt;p dir="LTR" align="LEFT"&gt; The script to understand the issue and the workaround is listed below:&lt;/p&gt;&lt;p&gt;set nocount on&lt;/p&gt;&lt;p&gt;set statistics time off&lt;/p&gt;&lt;p&gt;set statistics io off&lt;/p&gt;&lt;p&gt;drop table tab7&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;create table tab7 (c1 int primary key clustered, c2 int, c3 char(200))&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;create index test on tab7(c2, c1, c3)&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;begin tran&lt;/p&gt;&lt;p&gt;declare @i int&lt;/p&gt;&lt;p&gt;set @i = 1&lt;/p&gt;&lt;p&gt;while @i &amp;lt;= 50000&lt;/p&gt;&lt;p&gt;begin&lt;/p&gt;&lt;p&gt;insert into tab7 values (@i, 1, ‘a’)&lt;/p&gt;&lt;p&gt;set @i = @i + 1&lt;/p&gt;&lt;p&gt;end&lt;/p&gt;&lt;p&gt;commit tran&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;insert into tab7 values (50001, 1, ‘a’)&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;checkpoint&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;drop proc test_slow&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;create proc test_slow @i int&lt;/p&gt;&lt;p&gt;as&lt;/p&gt;&lt;p&gt;begin&lt;/p&gt;&lt;p&gt;declare @j int&lt;/p&gt;&lt;p&gt;create table #temp1 (c1 int primary key)&lt;/p&gt;&lt;p&gt;insert into #temp1 (c1) select @i&lt;/p&gt;&lt;p&gt;select @j = t7.c1 from tab7 t7 inner join #temp1 t on (t7.c2 = t.c1)&lt;/p&gt;&lt;p&gt;end&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;set statistics time on&lt;/p&gt;&lt;p&gt;set statistics io on&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–high reads as expected for parameter ’1′&lt;/p&gt;&lt;p&gt;exec test_slow 1&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–high reads that are not expected for parameter ’2′&lt;/p&gt;&lt;p&gt;exec test_slow 2&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;drop proc test_with_recompile&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;create proc test_with_recompile @i int&lt;/p&gt;&lt;p&gt;as&lt;/p&gt;&lt;p&gt;begin&lt;/p&gt;&lt;p&gt;declare @j int&lt;/p&gt;&lt;p&gt;create table #temp1 (c1 int primary key)&lt;/p&gt;&lt;p&gt;insert into #temp1 (c1) select @i&lt;/p&gt;&lt;p&gt;select @j = t7.c1 from tab7 t7 inner join #temp1 t on (t7.c2 = t.c1)&lt;/p&gt;&lt;p&gt;option (recompile)&lt;/p&gt;&lt;p&gt;end&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;set statistics time on&lt;/p&gt;&lt;p&gt;set statistics io on&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–high reads as expected for parameter ’1′&lt;/p&gt;&lt;p&gt;exec test_with_recompile 1&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–high reads that are not expected for parameter ’2′&lt;/p&gt;&lt;p&gt;–low reads on 3rd execution as expected for parameter ’2′&lt;/p&gt;&lt;p&gt;exec test_with_recompile 2&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;drop proc test_with_alter_table_recompile&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;create proc test_with_alter_table_recompile @i int&lt;/p&gt;&lt;p&gt;as&lt;/p&gt;&lt;p&gt;begin&lt;/p&gt;&lt;p&gt;declare @j int&lt;/p&gt;&lt;p&gt;create table #temp1 (c1 int primary key)&lt;/p&gt;&lt;p&gt;–to avoid caching of temporary tables one can create a constraint&lt;/p&gt;&lt;p&gt;–but this might lead to duplicate constraint name error on concurrent usage&lt;/p&gt;&lt;p&gt;alter table #temp1 add constraint test123 unique(c1)&lt;/p&gt;&lt;p&gt;insert into #temp1 (c1) select @i&lt;/p&gt;&lt;p&gt;select @j = t7.c1 from tab7 t7 inner join #temp1 t on (t7.c2 = t.c1)&lt;/p&gt;&lt;p&gt;option (recompile)&lt;/p&gt;&lt;p&gt;end&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;set statistics time on&lt;/p&gt;&lt;p&gt;set statistics io on&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–high reads as expected for parameter ’1′&lt;/p&gt;&lt;p&gt;exec test_with_alter_table_recompile 1&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–low reads as expected for parameter ’2′&lt;/p&gt;&lt;p&gt;exec test_with_alter_table_recompile 2&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;drop proc test_with_index_recompile&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;create proc test_with_index_recompile @i int&lt;/p&gt;&lt;p&gt;as&lt;/p&gt;&lt;p&gt;begin&lt;/p&gt;&lt;p&gt;declare @j int&lt;/p&gt;&lt;p&gt;create table #temp1 (c1 int primary key)&lt;/p&gt;&lt;p&gt;–to avoid caching of temporary tables one can create an index&lt;/p&gt;&lt;p&gt;create index test on #temp1(c1)&lt;/p&gt;&lt;p&gt;insert into #temp1 (c1) select @i&lt;/p&gt;&lt;p&gt;select @j = t7.c1 from tab7 t7 inner join #temp1 t on (t7.c2 = t.c1)&lt;/p&gt;&lt;p&gt;option (recompile)&lt;/p&gt;&lt;p&gt;end&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;set statistics time on&lt;/p&gt;&lt;p&gt;set statistics io on&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–high reads as expected for parameter ’1′&lt;/p&gt;&lt;p&gt;exec test_with_index_recompile 1&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;dbcc dropcleanbuffers&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;p&gt;–low reads as expected for parameter ’2′&lt;/p&gt;&lt;p&gt;exec test_with_index_recompile 2&lt;/p&gt;&lt;p&gt;go&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=16274" width="1" height="1"&gt;</description></item><item><title>SQL Server IO handling mechanism can be severely affected by high CPU usage</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2012/05/29/sql-server-io-handling-mechanism-can-be-severely-affected-by-high-cpu-usage.aspx</link><pubDate>Tue, 29 May 2012 18:53:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:16223</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=16223</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2012/05/29/sql-server-io-handling-mechanism-can-be-severely-affected-by-high-cpu-usage.aspx#comments</comments><description>&lt;p&gt;Are you using SSD or SAN / NAS based storage solution and sporadically observe SQL Server experiencing high IO wait times or from time to time your DAS / HDD becomes very slow according to SQL Server statistics? Read on… I need your help to up vote my connect item – &lt;a href="https://connect.microsoft.com/SQLServer/feedback/details/744650/sql-server-io-handling-mechanism-can-be-severely-affected-by-high-cpu-usage"&gt;https://connect.microsoft.com/SQLServer/feedback/details/744650/sql-server-io-handling-mechanism-can-be-severely-affected-by-high-cpu-usage&lt;/a&gt;. Instead of taking few seconds, queries could take minutes/hours to complete when CPU is busy.&lt;/p&gt;&lt;p&gt;In SQL Server when a query / request needs to read data that is not in data cache or when the request has to write to disk, like transaction log records, the request / task will queue up the IO operation and wait for it to complete (task in suspended state, this wait time is the resource wait time). When the IO operation is complete, the task will be queued to run on the CPU. If the CPU is busy executing other tasks, this task will wait (task in runnable state) until other tasks in the queue either complete or get suspended due to waits or exhaust their quantum of 4ms (this is the signal wait time, which along with resource wait time will increase the overall wait time). When the CPU becomes free, the task will finally be run on the CPU (task in running state).&lt;/p&gt;&lt;p&gt;The signal wait time can be up to 4ms per runnable task, this is by design. So if a CPU has 5 runnable tasks in the queue, then this query after the resource becomes available might wait up to a maximum of 5 X 4ms = 20ms in the runnable state (normally less as other tasks might not use the full quantum).&lt;/p&gt;&lt;p&gt;In case the CPU usage is high, let’s say many CPU intensive queries are running on the instance, there is a possibility that the IO operations that are completed at the Hardware and Operating System level are not yet processed by SQL Server, keeping the task in the resource wait state for longer than necessary. In case of an SSD, the IO operation might even complete in less than a millisecond, but it might take SQL Server 100s of milliseconds, for instance, to process the completed IO operation. For example, let’s say you have a user inserting 500 rows in individual transactions. When the transaction log is on an SSD or battery backed up controller that has write cache enabled, all of these inserts will complete in 100 to 200ms. With a CPU intensive parallel query executing across all CPU cores, the same inserts might take minutes to complete. WRITELOG wait time will be very high in this case (both under sys.dm_io_virtual_file_stats and sys.dm_os_wait_stats). In addition you will notice a large number of WAITELOG waits since log records are written by LOG WRITER and hence very high signal_wait_time_ms leading to more query delays. However, Performance Monitor Counter, PhysicalDisk, Avg. Disk sec/Write will report very low latency times.&lt;/p&gt;&lt;p&gt;Such delayed IO handling also occurs to read operations with artificially very high PAGEIOLATCH_SH wait time (with number of PAGEIOLATCH_SH waits remaining the same). This problem will manifest more and more as customers start using SSD based storage for SQL Server, since they drive the CPU usage to the limits with faster IOs. We have a few workarounds for specific scenarios, but we think Microsoft should resolve this issue at the product level. We have a connect item open – &lt;a href="https://connect.microsoft.com/SQLServer/feedback/details/744650/sql-server-io-handling-mechanism-can-be-severely-affected-by-high-cpu-usage"&gt;https://connect.microsoft.com/SQLServer/feedback/details/744650/sql-server-io-handling-mechanism-can-be-severely-affected-by-high-cpu-usage&lt;/a&gt; - (with example scripts) to reproduce this behavior, please up vote the item so the issue will be addressed by the SQL Server product team soon.&lt;/p&gt;&lt;p&gt;Thanks for your help and best regards,&lt;br /&gt;Ramesh Meyyappan&lt;br /&gt;Home: &lt;a href="http://www.sqlworkshops.com"&gt;www.sqlworkshops.com&lt;/a&gt;&lt;br /&gt;LinkedIn: &lt;a href="http://at.linkedin.com/in/rmeyyappan"&gt;http://at.linkedin.com/in/rmeyyappan&lt;/a&gt;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=16223" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Workspace Memory / Query Memory Tuning – RESOURCE_SEMAPHORE / IO_COMPLETION / SLEEP_TASK Waits</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/10/14/workspace-memory-query-memory-tuning-resource-semaphore-io-completion-sleep-task-waits.aspx</link><pubDate>Fri, 14 Oct 2011 17:01:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:15928</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=15928</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/10/14/workspace-memory-query-memory-tuning-resource-semaphore-io-completion-sleep-task-waits.aspx#comments</comments><description>&lt;p class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;strong&gt;SQL Server is configured to use a lot of memory, but my query is slow and not using all the memory available and it is spilling the sort or the hash match operation to tempdb, how can you tune the configuration and the query?&lt;/strong&gt;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;Memory allocating queries request memory based on estimation (ideal memory) and query memory (workspace memory) availability, when they don’t get the right amount of memory they spill to tempdb and lead to performance issues. Previous &lt;span class="style21"&gt;&lt;span class="style7"&gt;&lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/articles.htm"&gt;&lt;u&gt;articles&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt; discussed ways to make the estimation better; this article discusses ways to address query memory availability.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;You can find the ideal amount of memory a query needs (when the query is executing) using sys.dm_exec_query_memory_grants. Common memory allocating queries are that perform Sort and do Hash Match operations like Hash Join or Hash Aggregation or Hash Union.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:gray;"&gt;*&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_exec_query_memory_grants&lt;/span&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;" class="style28"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;Column ideal_memory_kb indicates the ideal amount of memory the query needs. This is based on estimation, this might be incorrect for various reasons including out of date statistics, in some cases (more common that you might think) under estimation of memory by the optimizer even when the statistics are up to date (refer to article &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://jahaines.blogspot.com/2010/03/performance-tuning-101-what-you-will.html" href="http://jahaines.blogspot.com/2010/03/performance-tuning-101-what-you-will.html" target="_blank"&gt;&lt;u&gt;&lt;span class="style7"&gt;http://jahaines.blogspot.com/2010/03/performance-tuning-101-what-you-will.html&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt;) and due to plan caching (refer to article &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory.htm"&gt;&lt;u&gt;Plan Caching and Query Memory&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;). Some might recommend tweaking the index/column statistics in an undocumented way to inflate the estimation for additional memory, I suggest following the MSSQL Tip &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.mssqltips.com/sqlservertip/1955" href="http://www.mssqltips.com/sqlservertip/1955" target="_blank"&gt;&lt;u&gt;&lt;span class="style7"&gt;http://www.mssqltips.com/sqlservertip/1955&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and webcast 1 and 2 at &lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;www.sqlworkshops.com/webcasts&lt;/u&gt;&lt;/a&gt; to understand the issue and the recommendations.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style21"&gt;To read additional articles I wrote click &lt;span class="style7"&gt;&lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/articles.htm"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style21"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;The ideal amount of memory a query needs is based on estimat&lt;/font&gt;&lt;/span&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;ion. Requested memory is based on ideal memory and maximum available workspace memory. There is a possibility the estimation is correct (let’s say you have up to date statistics and/or fixed the under estimation issues by following the above articles) but the available workspace memory is not enough and hence ideal amount is low. The next question is: what is available workspace memory.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;Available workspace memory, also known as query memory, is the amount of memory available for common memory allocating queries that perform Sort and do Hash Match operations. This is automatically calculated based on your system configuration. You can monitor the currently available workspace memory and maximum workspace memory by executing the command dbcc memorystatus and looking for ‘Available’ and ‘Current Max’ under ‘Query Memory Objects (default)’ and ‘Small Query Memory Objects (default)’. Or using Performance Monitor counters ‘Granted Workspace Memory (KB)’ and ‘Maximum Workspace Memory (KB)’ under object Memory Manager. ‘Maximum Workspace Memory (KB)’ is the sum of ‘Current Max’ of both ‘Query Memory Objects (default)’ and ‘Small Query Memory Objects (default)’, note ‘Current Max’ is in pages (* 8 = KB).&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;Here is a query to find the ‘Maximum Workspace Memory (KB)’ using sys.dm_os_performance_counters, ‘Maximum Workspace Memory (KB)’ can be up to 75% of ‘Target Server Memory (KB)’.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;font size="2"&gt;The best way to learn is to practice. To create the below tables and reproduce the behavior, join the mailing list by using this link: &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;www.sqlworkshops.com/ml&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and I will send you the table creation script.&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; cntr_value&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_os_performance_counters&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;object_name&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;%Memory Manager%&amp;#39;&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; counter_name &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Maximum Workspace Memory (KB)%&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Maximum Workspace Memory (KB)&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; cntr_value&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_os_performance_counters&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;object_name&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;%Memory Manager%&amp;#39;&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; counter_name &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Target Server Memory (KB)%&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Target Server Memory (KB)&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; cntr_value&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_os_performance_counters&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;object_name&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;%Memory Manager%&amp;#39;&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; counter_name &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Maximum Workspace Memory (KB)%&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;*&lt;/span&gt; 100.0 &lt;span style="COLOR:gray;"&gt;/&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; cntr_value&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_os_performance_counters&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt; &lt;span style="COLOR:fuchsia;"&gt;object_name&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;%Memory Manager%&amp;#39;&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; counter_name &lt;span style="COLOR:gray;"&gt;like&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Target Server Memory (KB)%&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;as&lt;/span&gt; Ratio&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt; 
&lt;p class="style18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;In my server, when Target Server Memory is 4096MB, Maximum Workspace Memory is 3077MB, which is about 75% of Target Server Memory.&lt;/p&gt;
&lt;p class="style18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;By default a query will not request more than 25% of this Maximum Workspace Memory in SQL Server 2008 and above and this Memory Grant 25% can be changed using Resource Governor Workload Group settings. With SQL Server 2005 and below, this is 20% and cannot be changed without the support of Microsoft (with a combination of undocumented trace flag and changes to the configuration parameters).&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;Why should you care about 25%? You might have a customer executing a heavy reporting query in the night and they want to use more than 25% of Maximum Workspace Memory for that single query. Let’s assume the customer configured 4096MB for their SQL Server instance (the Target Server Memory might be less than the configured memory if there is memory pressure on the server), let&amp;#39;s say their workspace memory is 3077MB (‘Query Memory Objects (default)’-&amp;gt;‘Current Max’ = 381175 pages = 3049400KB + ‘Small Query Memory Objects (default)’ -&amp;gt;‘Current Max’ = 12800 pages = 102400KB; 3049400KB + 102400KB = 3077MB. And this customer’s query executing the report is limited to a maximum of 3049400KB / 4 = 744MB.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;Let’s say the customer’s query executing the report needs 1,470MB of query memory (ideal memory) in order not to spill the sort to tempdb, but the query will request only 744MB. In case the customer can set the ‘request_max_memory_grant_percent’ (Memory Grant %) of the Workload Group setting to 50%, then the query can request up to 1,488MB and in this case the query will request the ideal memory it needs which is 1,470MB.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;SQL Server has memory grant queues based on cost, if queries need more memory and there is not enough memory available in the queue, then the query will wait, you can get additional details using the command dbcc memorystatus. If a query requests huge amount of memory, but doesn’t utilize it (due to over estimation), this memory will be reserved and cannot be used by other queries, in some cases this will lead to unnecessary memory grant waits. So one has to be very careful not to overestimate (also described in the webcast &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;font size="2"&gt;www.sqlworkshops.com/webcasts&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;) too much memory as it will affect concurrency. When the query waits for memory, the wait type will be ‘RESOURCE_SEMAPHORE’.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;Let&amp;#39;s set &amp;#39;max server memory (MB)&amp;#39; to 4GB.&lt;/p&gt;
&lt;p class="style18"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:maroon;"&gt;sp_configure&lt;/span&gt;&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;max server memory (MB)&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; 4096&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;reconfigure&lt;br /&gt;go&lt;/span&gt; 
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;The best way to learn is to practice. To create the below tables and reproduce the behavior, join the mailing list by using this link: &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;www.sqlworkshops.com/ml&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and I will send you the table creation script.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;span class="style18"&gt;Scenario 1:&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class="style18"&gt;This query will underestimate memory due to optimizer issues and will also request less memory (744MB) due to the 25% Resource Governor Workload Group Memory Grant setting. &lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;The query will be slow spilling the sort to tempdb.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff0000" size="2"&gt;&lt;span class="style18"&gt;&lt;span class="style30"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;When the sort spills to tempdb the wait type will be ‘&lt;strong&gt;IO_COMPLETION&lt;/strong&gt;’ but when the Hash Match operation spills to tempdb the wait type will be ‘&lt;strong&gt;SLEEP_TASK&lt;/strong&gt;’.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;We are using option (maxdop 1) to disable parallelism, to learn more about monitoring and tuning parallel query execution, refer to the webcast &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;font size="2"&gt;www.sqlworkshops.com/webcasts&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt; and article &lt;/font&gt;&lt;/span&gt;&lt;span class="style18"&gt;&lt;u&gt;&lt;a href="http://www.sqlworkshops.com/parallelmerge.htm"&gt;&lt;u&gt;&lt;font size="2"&gt;Parallel Sort and Merge Join – Watch out for unpredictability in performance&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 500000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;1&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt; 
&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;span class="style18"&gt;Scenario 2:&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span class="style18"&gt;This query will have better memory estimation due to the option clause with optimize for hint, but will still request less memory (744MB) due to the 25% Resource Governor Workload Group Memory Grant setting. &lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;The query will also be slow spilling the sort to tempdb.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff0000" size="2"&gt;&lt;span class="style18"&gt;&lt;span class="style30"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 500000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 600000&lt;span style="COLOR:gray;"&gt;)&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;, &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;1&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;/span&gt;&lt;span class="style33"&gt;&lt;font color="#008000" size="2" face="Courier New"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt; 
&lt;p class="style24"&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;Scenario 3:&lt;br /&gt;&lt;/strong&gt;This query will have better memory estimation due to the option clause with optimize for hint and will also request enough memory (1,470MB) due to the 50% Resource Governor Workload Group Memory Grant setting.&lt;span class="style31"&gt;&lt;font color="#00ff00"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span class="style29"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;The query will be fast with no spilling of sort to tempdb.&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;font color="#0000ff" size="2"&gt;&lt;span class="style18"&gt;&lt;span class="style29"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;strong&gt;Please read the entire article and answer the challenge posted at the end of this article before changing the Resource Governor Workload Group Memory Grant setting in your production server as there are major disadvantages of changing the Resource Governor Workload Group Memory Grant setting, don&amp;#39;t do it without understanding the full picture.&lt;/strong&gt;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;alter&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;workload&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;group&lt;/span&gt; [default] &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;request_max_memory_grant_percent&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt;50&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;alter&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;resource&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;governor&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;reconfigure&lt;/span&gt;&lt;span class="style29"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 500000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 600000&lt;span style="COLOR:gray;"&gt;)&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;, &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;/span&gt;&lt;span class="style33"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt; 
&lt;p&gt;&lt;strong&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;Scenario 4:&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;L&lt;span class="style18"&gt;&lt;font size="2"&gt;et&amp;#39;s execute 2 of this query concurrently in 2 sessions, with 25% Resource Governor Workload Group Memory Grant setting.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;alter&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;workload&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;group&lt;/span&gt; [default] &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;request_max_memory_grant_percent&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt;25&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;alter&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;resource&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;governor&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;reconfigure&lt;/span&gt;&lt;span class="style29"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt; 
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;Session 1:&lt;/u&gt;&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Let&amp;#39;s execute this query in a loop and measure the performance of the query executed in session 2. This query will have better memory estimation due to the option clause with optimize for hint, but will still request less memory (744MB) due to the 25% &lt;font size="2"&gt;&lt;span class="style18"&gt;Resource Governor Workload Group Memory Grant setting&lt;/span&gt;&lt;/font&gt;. &lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;The query will be spilling the sort to tempdb.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;while 1=1&lt;br /&gt;begin&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 500000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 600000&lt;span style="COLOR:gray;"&gt;), &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;span class="style33"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/span&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;end&lt;br /&gt;go&lt;/span&gt;&lt;/span&gt; 
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;Session 2:&lt;/u&gt;&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Let&amp;#39;s execute this query few times. This query will have better memory estimation due to the option clause with optimize for hint, but will still request less memory (744MB) due to the 25% &lt;font size="2"&gt;&lt;span class="style18"&gt;Resource Governor Workload Group Memory Grant setting&lt;/span&gt;&lt;/font&gt;. &lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;The query will be slow spilling the sort to tempdb. &lt;/font&gt;&lt;/span&gt;This query might take up to twice the amount of time to complete compared to Scenario 2, because 2 queries from 2 sessions are concurrently spilling to tempdb. There is no wait for memory grants (no RESOURCE_SEMAPHORE waits).&lt;/p&gt;
&lt;p class="style18"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 500000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 600000&lt;span style="COLOR:gray;"&gt;), &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;span class="style33"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/span&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/span&gt; 
&lt;p&gt;&lt;strong&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;Scenario 5:&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;L&lt;span class="style18"&gt;&lt;font size="2"&gt;et&amp;#39;s execute 2 of this query concurrently in 2 sessions, with 50% Resource Governor Workload Group Memory Grant setting.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;alter&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;workload&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;group&lt;/span&gt; [default] &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;request_max_memory_grant_percent&lt;span style="COLOR:gray;"&gt;=50)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;alter&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;resource&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;governor&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;reconfigure&lt;/span&gt;&lt;span class="style29"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt; 
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;Session 1:&lt;/u&gt;&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Let&amp;#39;s execute this query in a loop and measure the performance of the query executed in session 2. &lt;font size="2"&gt;This query will have better memory estimation due to the option clause with optimize for hint and will also request enough memory (1,470MB) due to the 50% Resource Governor Workload Group Memory Grant setting.&lt;span class="style31"&gt;&lt;font color="#00ff00"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span class="style29"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;The query will have no spilling of sort to tempdb.&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;font color="#0000ff" size="2"&gt;&lt;span class="style29"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;while 1=1&lt;br /&gt;begin&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 500000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 600000&lt;span style="COLOR:gray;"&gt;), &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;span class="style33"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/span&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;end&lt;br /&gt;go&lt;/span&gt;&lt;/span&gt; 
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;Session 2:&lt;/u&gt;&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Let&amp;#39;s execute this query few times. &lt;font size="2"&gt;This query will have better memory estimation due to the option clause with optimize for hint and will also request enough memory (1,470MB) due to the 50% Resource Governor Workload Group Memory Grant setting.&lt;span class="style31"&gt;&lt;font color="#00ff00"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span class="style29"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;The query will be fast with no spilling of sort to tempdb.&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt; But this query might take up to twice the amount of time to complete compared to Scenario 3, because 2 queries from 2 sessions are concurrently requesting nearly 50% of workspace memory. &lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;There is wait for memory grants (RESOURCE_SEMAPHORE waits)&lt;/font&gt;&lt;/span&gt;, SQL Server grants memory to one query at a time as the memory in the grant queue is not enough to grant simultaneously the requested memory to both queries.&lt;/p&gt;
&lt;p class="style18"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 500000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 600000&lt;span style="COLOR:gray;"&gt;), &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;span class="style33"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/span&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/span&gt; 
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;Overall performance of scenario 5 is better than scenario 4 even though there was memory grant waits. &lt;/u&gt;&lt;/span&gt;In this case waiting for memory is far worse than spilling the sort to tempdb.&lt;/p&gt;
&lt;p class="style18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;Scenario 6:&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;L&lt;span class="style18"&gt;&lt;font size="2"&gt;et&amp;#39;s execute two queries with less memory requirement concurrently in two sessions (so memory can be granted for both queries simultaneously from the same memory grant queue), with 50% Resource Governor Workload Group Memory Grant setting.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;&lt;font size="2"&gt;Session 1:&lt;/font&gt;&lt;/u&gt;&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;font size="2"&gt;Let&amp;#39;s execute this query in a loop and measure the performance of the query executed in session 2. This query will have better memory estimation due to the option clause with optimize for hint and will also request enough memory (1,102MB) due to the 50% Resource Governor Workload Group Memory Grant setting.&lt;span class="style31"&gt;&lt;font color="#00ff00"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span class="style29"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;The query will have no spilling of sort to tempdb.&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;while&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; 1&lt;span style="COLOR:gray;"&gt;=&lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;begin&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 400000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 450000&lt;span style="COLOR:gray;"&gt;), &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;span class="style33"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/span&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;end&lt;br /&gt;go&lt;/span&gt;&lt;/span&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;span class="style32"&gt;&lt;u&gt;&lt;font size="2"&gt;Session 2:&lt;/font&gt;&lt;/u&gt;&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;font size="2"&gt;Let&amp;#39;s execute this query few times. This query will have better memory estimation due to the option clause with optimize for hint and will also request enough memory (1,102MB) due to the 50% Resource Governor Workload Group Memory Grant setting.&lt;span class="style31"&gt;&lt;font color="#00ff00"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span class="style29"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;The query will be fast with no spilling of sort to tempdb.&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt; &lt;span class="style29"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;There will be no wait for memory grants (RESOURCE_SEMAPHORE waits)&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;, SQL Server grants memory to both queries simultaneously as the memory in the grant queue is enough to grant the requested memory to both queries.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;br /&gt;&lt;/span&gt;--Example provided by www.sqlworkshops.com&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2000&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:blue;"&gt;int&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 400000&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @c1 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c2 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @c3 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c3&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; tab7&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; c1 &lt;span style="COLOR:gray;"&gt;&amp;lt;&lt;/span&gt; @i&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; order&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c2&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@i &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 450000&lt;span style="COLOR:gray;"&gt;), &lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop &lt;/span&gt;&lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- Option optimize for is used to inflate memory request&lt;br /&gt;-- without this the query will spill the sort to tempdb due&lt;br /&gt;&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-- to query optimizer under estimation of memory.&lt;br /&gt;&lt;span class="style33"&gt;-- One possibility is to inflate the number of rows,&lt;br /&gt;-- the other possibility is to inflate the row size&lt;br /&gt;&lt;/span&gt;-- For more information refer to webcasts 1 &amp;amp; 2&lt;br /&gt;-- at www.sqlworkshops.com/webcasts.&lt;/span&gt;&lt;br /&gt;go&lt;/span&gt;&lt;/span&gt; 
&lt;p class="style24"&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;Challenge:&lt;br /&gt;&lt;/strong&gt;&lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;There are major disadvantages of changing the Resource Governor Workload Group Memory Grant setting, so don&amp;#39;t make any changes without understanding the full picture. I will cover this is the next article, meanwhile if you can guess some reasons, write to me:&lt;/font&gt;&lt;/span&gt; &lt;span class="style6"&gt;&lt;font class="style18" size="2"&gt;&lt;a href="http://www.sqlworkshops.com/contacts.asp"&gt;&lt;u&gt;Contacts&lt;/u&gt;&lt;/a&gt;&lt;span class="style30"&gt;&lt;font color="#ff0000"&gt;.&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;span class="style6"&gt;&lt;font class="style18" color="#ff0000" size="2"&gt;&lt;span class="style30"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;I explain some of these concepts with detailed examples in my webcasts (&lt;/strong&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;www.sqlworkshops.com/webcasts&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;strong&gt;), I recommend you to watch them. The best way to learn is to practice. To create the above tables and reproduce the behavior, join the mailing list at &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;www.sqlworkshops.com/ml&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and I will send you the relevant SQL Scripts.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="style6"&gt;
&lt;p class="style21"&gt;Register for the upcoming 3 Day Level 400 Microsoft SQL Server 2008 Performance Monitoring &amp;amp; Tuning Hands-on Workshop &lt;span&gt;in &lt;strong&gt;&lt;span class="style4"&gt;&lt;font style="BACKGROUND-COLOR:#d3cd2e;"&gt;Vienna, Austria&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt; &lt;/span&gt;during&lt;strong&gt; &lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationaustria7.asp"&gt;&lt;u&gt;November 15-17, 2011&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;, click &lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationaustria7.asp"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt; to register / &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://blogs.technet.com/b/austria/archive/2010/06/06/sql-server-2008-and-2005-performance-monitoring-and-tuning-workshop-im-juni.aspx" href="http://blogs.technet.com/b/austria/archive/2010/06/06/sql-server-2008-and-2005-performance-monitoring-and-tuning-workshop-im-juni.aspx" target="_blank"&gt;&lt;u&gt;&lt;span class="style1"&gt;&lt;strong&gt;Microsoft Austria TechNet&lt;/strong&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; or in &lt;strong&gt;&lt;span class="style4"&gt;&lt;font style="BACKGROUND-COLOR:#d3cd2e;"&gt;Oslo, Norway&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt; during &lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationnorway1.asp"&gt;&lt;u&gt;January 17-19, 2012&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;, click &lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationnorway1.asp"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt; to register. These are hands-on workshops with a maximum of 12 participants and not lectures. For consulting engagements click &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/consulting.asp"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="style6"&gt;
&lt;p class="style21"&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;span class="style18"&gt;Disclaimer and copyright information:&lt;/span&gt;&lt;/strong&gt;&lt;br class="style18" /&gt;&lt;span class="style18"&gt;This article refers to organizations and products that may be the trademarks or registered trademarks of their various owners.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class="style18"&gt;&lt;font size="2"&gt;Copyright of this article belongs to &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/instructor.htm"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;R Meyyappan&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt; / &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;www.sqlworkshops.com&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;. You may freely use the ideas and concepts discussed in this article with acknowledgement (&lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;www.sqlworkshops.com&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;), but you may not claim any of it as your own work.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style18"&gt;This article is for informational purposes only; you use any of the suggestions given here entirely at your own risk.&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style21"&gt;R Meyyappan &lt;a href="mailto:rmeyyappan@sqlworkshops.com"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;rmeyyappan@sqlworkshops.com&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="style21"&gt;LinkedIn: &lt;a href="http://at.linkedin.com/in/rmeyyappan"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;http://at.linkedin.com/in/rmeyyappan&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=15928" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/SQLBits+Performance/default.aspx">SQLBits Performance</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/SQLBits.com/default.aspx">SQLBits.com</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/SQLBits/default.aspx">SQLBits</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Training/default.aspx">Training</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Level+400/default.aspx">Level 400</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Workshop/default.aspx">Workshop</category></item><item><title>Plan Caching and Query Memory Part II (Hash Match) – When not to use stored procedure - Most common performance mistake SQL Server developers make.</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/16/plan-caching-and-query-memory-part-ii-hash-match-when-not-to-use-stored-procedure-or-other-plan-caching-mechanisms-like-sp-executesql-or-prepared-statement.aspx</link><pubDate>Wed, 16 Feb 2011 09:45:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:15395</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=15395</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/16/plan-caching-and-query-memory-part-ii-hash-match-when-not-to-use-stored-procedure-or-other-plan-caching-mechanisms-like-sp-executesql-or-prepared-statement.aspx#comments</comments><description>&lt;p&gt;&lt;span class="style18"&gt;SQL Server estimates Memory requirement at compile time, when stored procedure or other plan caching mechanisms like sp_executesql or prepared statement are used, the memory requirement is estimated based on first set of execution parameters. This is a common reason for spill over tempdb and hence poor performance. Common memory allocating queries are that perform Sort and do Hash Match operations like Hash Join or Hash Aggregation or Hash Union. This article covers Hash Match operations with examples. It is recommended to read &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory.htm"&gt;&lt;u&gt;&lt;strong&gt;Plan Caching and Query Memory Part I&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; before this article which covers an introduction and Query memory for Sort. In most cases it is cheaper to pay for the compilation cost of dynamic queries than huge cost for spill over tempdb, unless memory requirement for a query does not change significantly based on predicates.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;This article covers underestimation / overestimation of memory for Hash Match operation. &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory.htm"&gt;&lt;u&gt;&lt;strong&gt;Plan Caching and Query Memory Part I&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; covers underestimation / overestimation for Sort. It is important to note that underestimation of memory for Sort and Hash Match operations lead to spill over tempdb and hence negatively impact performance. Overestimation of memory affects the memory needs of other concurrently executing queries. &lt;strong&gt;In addition, it is important to note, with Hash Match operations, overestimation of memory can actually lead to poor performance.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style21"&gt;To read additional articles I wrote click &lt;span class="style7"&gt;&lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/articles.htm"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style21"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;The best way to learn is to practice. To create the below tables and reproduce the behavior, join the mailing list by using this link: &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;www.sqlworkshops.com/ml&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and I will send you the table creation script. Most of these concepts are also covered in our webcasts: &lt;a href="http://www.sqlworkshops.com/webcasts"&gt;&lt;u&gt;www.sqlworkshops.com/webcasts&lt;/u&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;Let’s create a Customer’s State table that has 99% of customers in NY and the rest 1% in WA.Customers table used in Part I of this article is also used here.To observe Hash Warning, enable &amp;#39;Hash Warning&amp;#39; in SQL Profiler under Events &amp;#39;Errors and Warnings&amp;#39;. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;drop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;table&lt;/span&gt; CustomersState&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;table&lt;/span&gt; CustomersState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;CustomerID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;primary&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;key&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Address&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;200&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;State&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2&lt;span style="COLOR:gray;"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;insert&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;into&lt;/span&gt; CustomersState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;CustomerID&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Address&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; CustomerID&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;Address&amp;#39;&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Customers&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersState &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;State&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;NY&amp;#39;&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; CustomerID &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 100 &lt;span style="COLOR:gray;"&gt;!=&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersState &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;State&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;WA&amp;#39;&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; CustomerID &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 100 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; CustomersState &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;fullscan&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;Let’s create a stored procedure that joins customers with CustomersState table with a predicate on State. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByState @State &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;begin&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @CustomerID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @CustomerID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Customers e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;inner&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; CustomersState es &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; es&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; es&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;State&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; @State&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; 1&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;end&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;Let’s execute the stored procedure first with parameter value ‘WA’ – which will select 1% of data. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;WA&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;The stored procedure took 294 ms to complete. 
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/h1.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;The stored procedure was granted 6704 KB based on 8000 rows being estimated. 
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/h2.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;The estimated number of rows, 8000 is similar to actual number of rows 8000 and hence the memory estimation should be ok. 
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/h3.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;There was no Hash Warning in SQL Profiler. To observe Hash Warning, enable &amp;#39;Hash Warning&amp;#39; in SQL Profiler under Events &amp;#39;Errors and Warnings&amp;#39;. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/hp1.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;Now let’s execute the stored procedure with parameter value ‘NY’ – which will select 99% of data. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;-Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;NY&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;The stored procedure took 2922 ms to complete. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h4.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;The stored procedure was granted 6704 KB based on 8000 rows being estimated. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h5.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;The estimated number of rows, 8000 is way different from the actual number of rows 792000 because the estimation is based on the first set of parameter value supplied to the stored procedure which is ‘WA’ in our case. This underestimation will lead to spill over tempdb, resulting in poor performance. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h6.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;There was Hash Warning (Recursion) in SQL Profiler. To observe Hash Warning, enable &amp;#39;Hash Warning&amp;#39; in SQL Profiler under Events &amp;#39;Errors and Warnings&amp;#39;. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/hp2.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;Let’s recompile the stored procedure and then let’s first execute the stored procedure with parameter value ‘NY’. 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;In a production instance it is not advisable to use sp_recompile instead one should use DBCC FREEPROCCACHE (plan_handle). This is due to locking issues involved with sp_recompile, refer to our webcasts, &lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;www.sqlworkshops.com/webcasts&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt; for further details. 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:maroon;"&gt;sp_recompile&lt;/span&gt;&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;CustomersByState&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;NY&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;Now the stored procedure took only 1046 ms instead of 2922 ms. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h7.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;The stored procedure was granted 146752 KB of memory. 
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/h8.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;The estimated number of rows, 792000 is similar to actual number of rows of 792000. Better performance of this stored procedure execution is due to better estimation of memory and avoiding spill over tempdb. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h9.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;There was no Hash Warning in SQL Profiler. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/hp1.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;Now let’s execute the stored procedure with parameter value ‘WA’. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;WA&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;The stored procedure took 351 ms to complete, higher than the previous execution time of 294 ms. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h10.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;This stored procedure was granted more memory (146752 KB) than necessary (6704 KB) based on parameter value ‘NY’ for estimation (792000 rows) instead of parameter value ‘WA’ for estimation (8000 rows). This is because the estimation is based on the first set of parameter value supplied to the stored procedure which is ‘NY’ in this case. This overestimation leads to poor performance of this Hash Match operation, it might also affect the performance of other concurrently executing queries requiring memory and hence overestimation is not recommended. 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h11.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;The estimated number of rows, 792000 is much more than the actual number of rows of 8000. 
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/h12.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&lt;strong&gt;Intermediate Summary:&lt;/strong&gt; This issue can be avoided by not caching the plan for memory allocating queries. Other possibility is to use recompile hint or optimize for hint to allocate memory for predefined data range.Let’s recreate the stored procedure with recompile hint. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;drop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByState&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByState @State &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;begin&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @CustomerID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @CustomerID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Customers e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;inner&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; CustomersState es &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; es&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; es&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;State&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; @State&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; 1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;recompile&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;end&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;Let’s execute the stored procedure initially with parameter value ‘WA’ and then with parameter value ‘NY’. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;WA&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;NY&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;The stored procedure took 297 ms and 1102 ms in line with previous optimal execution times. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h13.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;The stored procedure with parameter value ‘WA’ has good estimation like before. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h14.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;Estimated number of rows of 8000 is similar to actual number of rows of 8000. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h15.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;The stored procedure with parameter value ‘NY’ also has good estimation and memory grant like before because the stored procedure was recompiled with current set of parameter values. 
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/h16.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;Estimated number of rows of 792000 is similar to actual number of rows of 792000. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h17.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;The compilation time and compilation CPU of 1 ms is not expensive in this case compared to the performance benefit. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h18.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;There was no Hash Warning in SQL Profiler. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/hp1.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;Let’s recreate the stored procedure with optimize for hint of ‘NY’. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;drop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByState&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByState @State &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;begin&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @CustomerID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; @CustomerID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Customers e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;inner&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; CustomersState es &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; es&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerID&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;where&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; es&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;State&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; @State&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; 1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@State &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;NY&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;end&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;Let’s execute the stored procedure initially with parameter value ‘WA’ and then with parameter value ‘NY’. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;WA&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByState&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;NY&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;The stored procedure took 353 ms with parameter value ‘WA’, this is much slower than the optimal execution time of 294 ms we observed previously. This is because of overestimation of memory. The stored procedure with parameter value ‘NY’ has optimal execution time like before. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h19.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;The stored procedure with parameter value ‘WA’ has overestimation of rows because of optimize for hint value of ‘NY’. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h21.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;Unlike before, more memory was estimated to this stored procedure based on optimize for hint value ‘NY’. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h20.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;The stored procedure with parameter value ‘NY’ has good estimation because of optimize for hint value of ‘NY’. Estimated number of rows of 792000 is similar to actual number of rows of 792000. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h23.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;Optimal amount memory was estimated to this stored procedure based on optimize for hint value ‘NY’. 
&lt;p class="style24"&gt;&amp;nbsp; &lt;img src="http://images.sqlworkshops.com/h22.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;There was no Hash Warning in SQL Profiler. 
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/hp1.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;This article covers underestimation / overestimation of memory for Hash Match operation. &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory.htm"&gt;&lt;u&gt;&lt;strong&gt;Plan Caching and Query Memory Part I&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; covers underestimation / overestimation for Sort. It is important to note that underestimation of memory for Sort and Hash Match operations lead to spill over tempdb and hence negatively impact performance. Overestimation of memory affects the memory needs of other concurrently executing queries. &lt;strong&gt;In addition, it is important to note, with Hash Match operations, overestimation of memory can actually lead to poor performance.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;strong&gt;Summary:&lt;/strong&gt; Cached plan might lead to underestimation or overestimation of memory because the memory is estimated based on first set of execution parameters. It is recommended not to cache the plan if the amount of memory required to execute the stored procedure has a wide range of possibilities. &lt;b style="mso-bidi-font-weight:normal;"&gt;One can mitigate this by using recompile hint, but that will lead to compilation overhead. However, in most cases it might be ok to pay for compilation rather than spilling sort over tempdb which could be very expensive compared to compilation cost.&lt;/b&gt; The other possibility is to use optimize for hint, but in case one sorts more data than hinted by optimize for hint, this will still lead to spill. On the other side there is also the possibility of overestimation leading to unnecessary memory issues for other concurrently executing queries. In case of Hash Match operations, this overestimation of memory might lead to poor performance. When the values used in optimize for hint are archived from the database, the estimation will be wrong leading to worst performance, so one has to exercise caution before using optimize for hint, recompile hint is better in this case.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;I explain these concepts with detailed examples in my webcasts (&lt;/strong&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;www.sqlworkshops.com/webcasts&lt;/font&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;strong&gt;), I recommend you to watch them. The best way to learn is to practice. To create the above tables and reproduce the behavior, join the mailing list at &lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;&lt;font color="#006bad"&gt;www.sqlworkshops.com/ml&lt;/font&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; and I will send you the relevant SQL Scripts.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style6"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="style6"&gt;Register for the upcoming 3 Day Level 400 Microsoft SQL Server 2008 and SQL Server 2005 Performance Monitoring &amp;amp; Tuning Hands-on Workshop &lt;span&gt;in &lt;/span&gt;&lt;font style="BACKGROUND-COLOR:#d3cd2e;"&gt;&lt;strong&gt;&lt;span class="style4"&gt;London&lt;/span&gt;&lt;/strong&gt;&lt;span class="style4"&gt;, &lt;/span&gt;&lt;strong&gt;&lt;span class="style4"&gt;United Kingdom&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt; during&lt;strong&gt; &lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;&lt;font color="#006bad"&gt;March 15-17, 2011&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;, click &lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;&lt;font color="#006bad"&gt;here&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt; to register&lt;font color="#03664b"&gt; / &lt;u&gt;&lt;a title="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" href="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" target="_blank"&gt;&lt;u&gt;&lt;span class="style1"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;Microsoft UK TechNet&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt;.These are hands-on workshops with a maximum of 12 participants and not lectures. For consulting engagements click &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/consulting.asp"&gt;&lt;u&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;here&lt;/font&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;.&lt;/span&gt;&lt;span class="style6"&gt; 
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;span class="style18"&gt;Disclaimer and copyright information:&lt;/span&gt;&lt;/strong&gt;&lt;br class="style18" /&gt;&lt;span class="style18"&gt;This article refers to organizations and products that may be the trademarks or registered trademarks of their various owners.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class="style18"&gt;&lt;font size="2"&gt;Copyright of this article belongs to &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/instructor.htm"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;R Meyyappan&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt; / &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;www.sqlworkshops.com&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;. You may freely use the ideas and concepts discussed in this article with acknowledgement (&lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;www.sqlworkshops.com&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;), but you may not claim any of it as your own work.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style18"&gt;This article is for informational purposes only; you use any of the suggestions given here entirely at your own risk.&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style21"&gt;R Meyyappan &lt;a href="mailto:rmeyyappan@sqlworkshops.com"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;rmeyyappan@sqlworkshops.com&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="style21"&gt;LinkedIn: &lt;a href="http://at.linkedin.com/in/rmeyyappan"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;http://at.linkedin.com/in/rmeyyappan&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=15395" width="1" height="1"&gt;</description></item><item><title>Plan Caching and Query Memory Part I – When not to use stored procedure or other plan caching mechanisms like sp_executesql or prepared statement</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/08/plan-caching-and-query-memory-part-i-when-not-to-use-stored-procedure-or-other-plan-caching-mechanisms-like-sp-executesql-or-prepared-statement-he-most-common-performance-mistake-sql-server-developers-make.aspx</link><pubDate>Tue, 08 Feb 2011 15:41:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:15359</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=15359</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/08/plan-caching-and-query-memory-part-i-when-not-to-use-stored-procedure-or-other-plan-caching-mechanisms-like-sp-executesql-or-prepared-statement-he-most-common-performance-mistake-sql-server-developers-make.aspx#comments</comments><description>&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;The most common performance mistake SQL Server developers make:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;SQL Server estimates memory requirement for queries at compilation time. This mechanism is fine for dynamic queries that need memory, but not for queries that cache the plan. With dynamic queries the plan is not reused for different set of parameters values / predicates and hence different amount of memory can be estimated based on different set of parameter values / predicates. Common memory allocating queries are that perform Sort and do Hash Match operations like Hash Join or Hash Aggregation or Hash Union. This article covers Sort with examples. It is recommended to read &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory2.htm"&gt;&lt;u&gt;&lt;strong&gt;Plan Caching and Query Memory Part II&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; after this article which covers Hash Match operations.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;When the plan is cached by using stored procedure or other plan caching mechanisms like sp_executesql or prepared statement, SQL Server estimates memory requirement based on first set of execution parameters. Later when the same stored procedure is called with different set of parameter values, the same amount of memory is used to execute the stored procedure. This might lead to underestimation / overestimation of memory on plan reuse, overestimation of memory might not be a noticeable issue for Sort operations, but underestimation of memory will lead to spill over tempdb resulting in poor performance.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style21"&gt;&lt;span class="style18"&gt;This article covers underestimation / overestimation of memory for Sort. &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory2.htm"&gt;&lt;u&gt;&lt;strong&gt;Plan Caching and Query Memory Part II&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; covers underestimation / overestimation for Hash Match operation. It is important to note that underestimation of memory for Sort and Hash Match operations lead to spill over tempdb and hence negatively impact performance. Overestimation of memory affects the memory needs of other concurrently executing queries. &lt;strong&gt;In addition, it is important to note, with Hash Match operations, overestimation of memory can actually lead to poor performance.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style21"&gt;To read additional articles I wrote click &lt;span class="style7"&gt;&lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/articles.htm"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;In most cases it is cheaper to pay for the compilation cost of dynamic queries than huge cost for spill over tempdb, unless memory requirement for a stored procedure does not change significantly based on predicates.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;The best way to learn is to practice. To create the below tables and reproduce the behavior, join the mailing list by using this link: &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;www.sqlworkshops.com/ml&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and I will send you the table creation script. Most of these concepts are also covered in our webcasts: &lt;a href="http://www.sqlworkshops.com/webcasts"&gt;&lt;u&gt;www.sqlworkshops.com/webcasts&lt;/u&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;Enough theory, let’s see an example where we sort initially 1 month of data and then use the stored procedure to sort 6 months of data.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s create a stored procedure that sorts customers by name within certain date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByCreationDate @CreationDateFrom &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CreationDateTo &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;begin&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;declare&lt;/span&gt; @CustomerID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CustomerName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt; @CreationDate &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; @CustomerName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CreationDate &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CreationDate &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Customers c&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CreationDate &lt;span style="COLOR:gray;"&gt;between&lt;/span&gt; @CreationDateFrom &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; @CreationDateTo&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerName&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;option &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;maxdop&lt;/span&gt; 1&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s execute the stored procedure initially with 1 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-31&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 48 ms to complete.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m1.jpg" width="740" height="500" alt="" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;The stored procedure was granted 6656 KB based on 43199.9 rows being estimated.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m2.jpg" width="740" height="500" alt="" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The estimated number of rows, 43199.9 is similar to actual number of rows 43200 and hence the memory estimation should be ok. &lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m19.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;There was no Sort Warnings in SQL Profiler.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/mp1.jpg" width="739" height="499" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Now let’s execute the stored procedure with 6 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-06-30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 679 ms to complete.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m3.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure was granted 6656 KB based on 43199.9 rows being estimated.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m4.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The estimated number of rows, 43199.9 is way different from the actual number of rows 259200 because the estimation is based on the first set of parameter value supplied to the stored procedure which is 1 month in our case. This underestimation will lead to sort spill over tempdb, resulting in poor performance.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m20.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;There was Sort Warnings in SQL Profiler.&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/mp2.jpg" width="739" height="499" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;To monitor the amount of data written and read from tempdb, one can execute &lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; num_of_bytes_written&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; num_of_bytes_read &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; &lt;span style="COLOR:green;"&gt;sys&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:green;"&gt;dm_io_virtual_file_stats&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;2&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;NULL)&lt;/span&gt;&lt;/span&gt; before and after the stored procedure execution, for additional information refer to the webcast: &lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;www.sqlworkshops.com/webcasts&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s recompile the stored procedure and then let’s first execute the stored procedure with 6 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;FONT-SIZE:11pt;mso-ascii-theme-font:minor-latin;mso-fareast-font-family:Calibri;mso-fareast-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-theme-font:minor-bidi;mso-ansi-language:EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA;"&gt;In a production instance it is not advisable to use sp_recompile instead one should use DBCC FREEPROCCACHE (plan_handle). This is due to locking issues involved with sp_recompile, refer to our webcasts for further details.&lt;/span&gt; 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:maroon;"&gt;sp_recompile&lt;/span&gt;&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;CustomersByCreationDate&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-06-30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;Now the stored procedure took only 294 ms instead of 679 ms.&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m5.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure was granted 26832 KB of memory. &lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m6.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The estimated number of rows, 259200 is similar to actual number of rows of 259200. Better performance of this stored procedure is due to better estimation of memory and avoiding sort spill over tempdb.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m21.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;There was no Sort Warnings in SQL Profiler.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/mp1.jpg" width="739" height="499" alt="" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Now let’s execute the stored procedure with 1 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-31&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 49 ms to complete, similar to our very first stored procedure execution.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m7.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;This stored procedure was granted more memory (26832 KB) than necessary memory (6656 KB) based on 6 months of data estimation (259200 rows) instead of 1 month of data estimation (43199.9 rows). This is because the estimation is based on the first set of parameter value supplied to the stored procedure which is 6 months in this case. This overestimation did not affect performance, but it might affect performance of other concurrent queries requiring memory and hence overestimation is not recommended. This overestimation might affect performance Hash Match operations, refer to article &lt;span class="style18"&gt;&lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory2.htm"&gt;&lt;u&gt;&lt;strong&gt;Plan Caching and Query Memory Part II&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; for further details.&amp;nbsp; 
&lt;p&gt;&lt;img src="http://images.sqlworkshops.com/m8.jpg" width="740" height="500" alt="" /&gt; &lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s recompile the stored procedure and then let’s first execute the stored procedure with 2 day date range.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:maroon;"&gt;sp_recompile&lt;/span&gt;&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;CustomersByCreationDate&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-02&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 1 ms.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m9.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure was granted 1024 KB based on 1440 rows being estimated.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m10.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;There was no Sort Warnings in SQL Profiler.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/mp1.jpg" width="739" height="499" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Now let’s execute the stored procedure with 6 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-06-30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 955 ms to complete, way higher than 679 ms or 294ms we noticed before.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m11.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure was granted 1024 KB based on 1440 rows being estimated. But we noticed in the past this stored procedure with 6 month date range needed 26832 KB of memory to execute optimally without spill over tempdb. This is clear underestimation of memory and the reason for the very poor performance.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m12.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;There was Sort Warnings in SQL Profiler. Unlike before this was a Multiple pass sort instead of Single pass sort. This occurs when granted memory is too low.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/mp3.jpg" width="739" height="499" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;strong&gt;Intermediate Summary:&lt;/strong&gt; This issue can be avoided by not caching the plan for memory allocating queries. Other possibility is to use recompile hint or optimize for hint to allocate memory for predefined date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s recreate the stored procedure with recompile hint.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;drop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByCreationDate&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByCreationDate @CreationDateFrom &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CreationDateTo &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;begin&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;declare&lt;/span&gt; @CustomerID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CustomerName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt; @CreationDate &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; @CustomerName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CreationDate &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CreationDate &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Customers c&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CreationDate &lt;span style="COLOR:gray;"&gt;between&lt;/span&gt; @CreationDateFrom &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; @CreationDateTo&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerName&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;option &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;maxdop&lt;/span&gt; 1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;recompile&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s execute the stored procedure initially with 1 month date range and then with 6 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-06-30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 48ms and 291 ms in line with previous optimal execution times.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m13.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure with 1 month date range has good estimation like before.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m14.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure with 6 month date range also has good estimation and memory grant like before because the query was recompiled with current set of parameter values.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m15.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The compilation time and compilation CPU of 1 ms is not expensive in this case compared to the performance benefit.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;img src="http://images.sqlworkshops.com/m22.jpg" width="740" height="500" alt="" /&gt;&lt;/p&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Let’s recreate the stored procedure with optimize for hint of 6 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;drop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByCreationDate&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;proc&lt;/span&gt; CustomersByCreationDate @CreationDateFrom &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CreationDateTo &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;begin&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;declare&lt;/span&gt; @CustomerID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CustomerName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt; @CreationDate &lt;span style="COLOR:blue;"&gt;datetime&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; @CustomerName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CreationDate &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CreationDate &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Customers c&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CreationDate &lt;span style="COLOR:gray;"&gt;between&lt;/span&gt; @CreationDateFrom &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; @CreationDateTo&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; c&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;CustomerName&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;option &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;maxdop&lt;/span&gt; 1&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; optimize &lt;span style="COLOR:blue;"&gt;for &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@CreationDateFrom &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @CreationDateTo &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-06-30&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s execute the stored procedure initially with 1 month date range and then with 6 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-06-30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 48ms and 291 ms in line with previous optimal execution times.&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m16.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure with 1 month date range has overestimation of rows and memory. This is because we provided hint to optimize for 6 months of data.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m17.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure with 6 month date range has good estimation and memory grant because we provided hint to optimize for 6 months of data.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m18.jpg" width="740" height="500" alt="" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s execute the stored procedure with 12 month date range using the currently cashed plan for 6 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;exec&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; CustomersByCreationDate&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:red;"&gt;&amp;#39;2001-01-01&amp;#39;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; &lt;span style="COLOR:red;"&gt;&amp;#39;2001-12-31&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure took 1138 ms to complete.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m23.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;2592000 rows were estimated based on optimize for hint value for 6 month date range. Actual number of rows is 524160 due to 12 month date range.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m24.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The stored procedure was granted enough memory to sort 6 month date range and not 12 month date range, so there will be spill over tempdb.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/m25.jpg" width="740" height="500" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;There was Sort Warnings in SQL Profiler. 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;img src="http://images.sqlworkshops.com/mp2.jpg" width="739" height="499" alt="" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;As we see above, optimize for hint cannot guarantee enough memory and optimal performance compared to recompile hint.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;This article covers underestimation / overestimation of memory for Sort. &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/plancachingandquerymemory2.htm"&gt;&lt;u&gt;&lt;strong&gt;Plan Caching and Query Memory Part II&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; covers underestimation / overestimation for Hash Match operation. It is important to note that underestimation of memory for Sort and Hash Match operations lead to spill over tempdb and hence negatively impact performance. Overestimation of memory affects the memory needs of other concurrently executing queries. &lt;strong&gt;In addition, it is important to note, with Hash Match operations, overestimation of memory can actually lead to poor performance.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;strong&gt;Summary:&lt;/strong&gt; Cached plan might lead to underestimation or overestimation of memory because the memory is estimated based on first set of execution parameters. It is recommended not to cache the plan if the amount of memory required to execute the stored procedure has a wide range of possibilities. &lt;b style="mso-bidi-font-weight:normal;"&gt;One can mitigate this by using recompile hint, but that will lead to compilation overhead. However, in most cases it might be ok to pay for compilation rather than spilling sort over tempdb which could be very expensive compared to compilation cost.&lt;/b&gt; The other possibility is to use optimize for hint, but in case one sorts more data than hinted by optimize for hint, this will still lead to spill. On the other side there is also the possibility of overestimation leading to unnecessary memory issues for other concurrently executing queries. In case of Hash Match operations, this overestimation of memory might lead to poor performance. When the values used in optimize for hint are archived from the database, the estimation will be wrong leading to worst performance, so one has to exercise caution before using optimize for hint, recompile hint is better in this case.&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;I explain these concepts with detailed examples in my webcasts (&lt;/strong&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;www.sqlworkshops.com/webcasts&lt;/font&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;strong&gt;), I recommend you to watch them. The best way to learn is to practice. To create the above tables and reproduce the behavior, join the mailing list at &lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;&lt;font color="#006bad"&gt;www.sqlworkshops.com/ml&lt;/font&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt; and I will send you the relevant SQL Scripts.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="style6"&gt;
&lt;p class="style21"&gt;Register for the upcoming 3 Day Level 400 Microsoft SQL Server 2008 and SQL Server 2005 Performance Monitoring &amp;amp; Tuning Hands-on Workshop &lt;span&gt;in &lt;/span&gt;&lt;font style="BACKGROUND-COLOR:#d3cd2e;"&gt;&lt;strong&gt;&lt;span class="style4"&gt;London&lt;/span&gt;&lt;/strong&gt;&lt;span class="style4"&gt;, &lt;/span&gt;&lt;strong&gt;&lt;span class="style4"&gt;United Kingdom&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt; during&lt;strong&gt; &lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;&lt;font color="#006bad"&gt;March 15-17, 2011&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;, click &lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;&lt;font color="#006bad"&gt;here&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt; to register&lt;font color="#03664b"&gt; / &lt;u&gt;&lt;a title="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" href="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" target="_blank"&gt;&lt;u&gt;&lt;span class="style1"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;Microsoft UK TechNet&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt;.These are hands-on workshops with a maximum of 12 participants and not lectures. For consulting engagements click &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/consulting.asp"&gt;&lt;u&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;here&lt;/font&gt;&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;span class="style18"&gt;Disclaimer and copyright information:&lt;/span&gt;&lt;/strong&gt;&lt;br class="style18" /&gt;&lt;span class="style18"&gt;This article refers to organizations and products that may be the trademarks or registered trademarks of their various owners.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class="style18"&gt;&lt;font size="2"&gt;Copyright of this article belongs to &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/instructor.htm"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;R Meyyappan&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt; / &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;www.sqlworkshops.com&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;. You may freely use the ideas and concepts discussed in this article with acknowledgement (&lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font color="#006bad" size="2"&gt;&lt;strong&gt;www.sqlworkshops.com&lt;/strong&gt;&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;), but you may not claim any of it as your own work.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style18"&gt;This article is for informational purposes only; you use any of the suggestions given here entirely at your own risk.&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style21"&gt;R Meyyappan &lt;a href="mailto:rmeyyappan@sqlworkshops.com"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;rmeyyappan@sqlworkshops.com&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="style21"&gt;LinkedIn: &lt;a href="http://at.linkedin.com/in/rmeyyappan"&gt;&lt;strong&gt;&lt;font color="#006bad"&gt;http://at.linkedin.com/in/rmeyyappan&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=15359" width="1" height="1"&gt;</description></item><item><title>3 Day Level 400 SQL Tuning Workshop 15 March in London, early bird and referral offer</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/02/3-day-level-400-sql-tuning-workshop-15-march-in-london-early-bird-and-referral-offer.aspx</link><pubDate>Wed, 02 Feb 2011 09:48:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:15328</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=15328</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/02/3-day-level-400-sql-tuning-workshop-15-march-in-london-early-bird-and-referral-offer.aspx#comments</comments><description>&lt;span&gt;I want to inform you that we have organized the &amp;quot;3 Day Level 400 Microsoft SQL Server 2008 and SQL Server 2005 Performance Monitoring &amp;amp; Tuning Hands-on Workshop&amp;quot; in London, United Kingdom during March 15-17, 2011.&lt;br /&gt;&lt;br /&gt;This is a truly level 400 hands-on workshop and you can find the Agenda, Prerequisite, Goal of the Workshop and Registration information at &lt;font color="#1f497d"&gt;&lt;a href="http://www.sqlworkshops.com/ruk"&gt;&lt;strong&gt;www.sqlworkshops.com/ruk&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#1f497d"&gt;&lt;span&gt;. Charges are GBP 1800 (VAT excl.). Early bird discount of GBP 125 until 18 February. We are also introducing a new referral plan. If you refer someone who participates in the workshop you will receive an Amazon gift voucher for GBP 125.&lt;br /&gt;&lt;br /&gt;Feedback from one of the participants who attended our November London workshop:&lt;br /&gt;&lt;strong&gt;Andrew, Senior SQL Server DBA from UBS, UK, &lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;a href="http://www.ubs.com/"&gt;&lt;b&gt;&lt;span&gt;www.ubs.com&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;font color="#1f497d"&gt;&lt;strong&gt;&lt;span&gt;, November 26, 2010:&lt;/strong&gt;&lt;br /&gt;Rating: In a scale of 1 to 5 please rate each item below (1=Poor &amp;amp; 5=Excellent) &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#1f497d"&gt;&lt;span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;table cellspacing="1"&gt;

&lt;tr&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;Overall I was satisfied with the workshop&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;5&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;Instructor maintained the focus of the course&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;5&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;Mix of theory and practice was appropriate&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;5&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;Instructor answered the questions asked&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;5&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;The training facility met the requirement&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;5&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;How confident are you with SQL Server 2008 performance tuning&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;5&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;strong&gt;&lt;span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;
&lt;p dir="ltr" align="left"&gt;Additional comments from Andrew:&lt;/p&gt;
&lt;p dir="ltr" align="left"&gt;&lt;/strong&gt;The course was expertly delivered and backed up with practical examples. At the end of the course I felt my knowledge of SQL Server had been greatly enhanced and was eager to share with my colleagues. I felt there was one prerequisite missing from the course description, an open mind since the course changed some of my core product beliefs.&lt;/p&gt;&lt;font color="#1f497d"&gt;
&lt;p dir="ltr" align="left"&gt;For Additional workshop feedbacks refer to: &lt;/font&gt;&lt;/span&gt;&lt;a href="http://www.sqlworkshops.com/feedbacks"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;&lt;span&gt;www.sqlworkshops.com/feedbacks&lt;/u&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;font color="#1f497d"&gt;&lt;span&gt;.&lt;br /&gt;&lt;br /&gt;I will be delivering the Level 300-400 1 Day Microsoft SQL Server 2008 Performance Monitoring and Tuning Seminar at Istanbul and Ankara, Turkey during March. This event is organized by &lt;strong&gt;Microsoft Turkey&lt;/strong&gt;, let me know if you are in Turkey and would like to attend.&lt;br /&gt;&lt;br /&gt;During September 2010 I delivered this Level 300-400 1 Day Microsoft SQL Server 2008 Performance Monitoring and Tuning Seminar in Zurich, Switzerland organized by &lt;strong&gt;Microsoft Switzerland&lt;/strong&gt; and the feedback was &lt;strong&gt;4.85&lt;/strong&gt; out of &lt;strong&gt;5&lt;/strong&gt;, there were about 100 participants. During November 2010 when I delivered seminar in Lisbon, Portugal organized by &lt;strong&gt;Microsoft Portugal&lt;/strong&gt;, the feedback was &lt;strong&gt;8.30&lt;/strong&gt; out of &lt;strong&gt;9&lt;/strong&gt;, there were 130 participants.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Our Mission&lt;/strong&gt;: Empower customers to fully realize the Performance potential of Microsoft SQL Server without increasing the total cost of ownership (TCO) and achieve high customer satisfaction in every consulting engagement and workshop delivery.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Our Business Plan&lt;/strong&gt;: Provide useful content in webcasts, articles and seminars to get visibility for consulting engagements and workshop delivery opportunity. Help us by forwarding this email to your SQL Server friends and colleagues.&lt;br /&gt;&lt;br /&gt;Looking forward&lt;br /&gt;&lt;br /&gt;R Meyyappan &amp;amp; Team @ &lt;/font&gt;&lt;/span&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;span&gt;&lt;strong&gt;www.SQLWorkshops.com&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;font color="#1f497d"&gt;&lt;span&gt;&lt;br /&gt;LinkedIn: &lt;/font&gt;&lt;/span&gt;&lt;a href="http://at.linkedin.com/in/rmeyyappan"&gt;&lt;span&gt;&lt;strong&gt;http://at.linkedin.com/in/rmeyyappan&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=15328" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Training/default.aspx">Training</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Level+400/default.aspx">Level 400</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Workshop/default.aspx">Workshop</category></item><item><title>More CPU cores may not always lead to better performance – MAXDOP and query memory distribution in spotlight</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/02/more-cpu-cores-may-not-always-lead-to-better-performance-maxdop-and-query-memory-distribution-in-spotlight.aspx</link><pubDate>Wed, 02 Feb 2011 09:19:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:15327</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=15327</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2011/02/02/more-cpu-cores-may-not-always-lead-to-better-performance-maxdop-and-query-memory-distribution-in-spotlight.aspx#comments</comments><description>&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;More hardware normally delivers better performance, but there are exceptions where it can hinder performance. Understanding these exceptions and working around it is a major part of SQL Server performance tuning.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;When a memory allocating query executes in parallel, SQL Server distributes memory to each task that is executing part of the query in parallel. In our example the sort operator that executes in parallel divides the memory across all tasks assuming even distribution of rows. Common memory allocating queries are that perform Sort and do Hash Match operations like Hash Join or Hash Aggregation or Hash Union.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;In reality, how often are column values evenly distributed, think about an example; are employees working for your company distributed evenly across all the Zip codes or mainly concentrated in the headquarters? What happens when you sort result set based on Zip codes? Do all products in the catalog sell equally or are few products hot selling items?&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;One of my customers tested the below example on a 24 core server with various MAXDOP settings and here are the results:&lt;br /&gt;MAXDOP 1: CPU time = 1185 ms, elapsed time = 1188 ms&lt;br /&gt;MAXDOP 4: CPU time = 1981 ms, elapsed time = 1568 ms&lt;br /&gt;MAXDOP 8: CPU time = 1918 ms, elapsed time = 1619 ms&lt;br /&gt;MAXDOP 12: CPU time = 2367 ms, elapsed time = 2258 ms&lt;br /&gt;MAXDOP 16: CPU time = 2540 ms, elapsed time = 2579 ms&lt;br /&gt;MAXDOP 20: CPU time = 2470 ms, elapsed time = 2534 ms&lt;br /&gt;MAXDOP 0: CPU time = 2809 ms, elapsed time = 2721 ms - all 24 cores.&lt;br /&gt;In the above test, when the data was evenly distributed, the elapsed time of parallel query was always lower than serial query.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="style18"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;Why does the query get slower and slower with more CPU cores / higher MAXDOP? Maybe you can answer this question after reading the article; let me know: &lt;font color="#03664b"&gt;&lt;a href="mailto:rmeyyappan@sqlworkshops.com"&gt;&lt;u&gt;&lt;strong&gt;rmeyyappan@sqlworkshops.com&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/font&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;Well you get the point, let’s see an example.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;The best way to learn is to practice. To create the below tables and reproduce the behavior, join the mailing list by using this link: &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;www.sqlworkshops.com/ml&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and I will send you the table creation script.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s update the Employees table with 49 out of 50 employees located in Zip code 2001.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; Employees &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;/&lt;/span&gt; 400 &lt;span style="COLOR:gray;"&gt;+&lt;/span&gt; 1 &lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 50 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; Employees &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 2001 &lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 50 &lt;span style="COLOR:gray;"&gt;!=&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; Employees &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;fullscan&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s create the temporary table #FireDrill with all possible Zip codes.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;drop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;table&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;table&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;primary&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;key&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;insert&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;into&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill &lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;distinct&lt;/span&gt; Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;fullscan&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Let’s execute the query serially with MAXDOP 1.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--First serially with MAXDOP 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 1&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;The query took 1011 ms to complete. 
&lt;p class="style24"&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md1.jpg" width="740" height="500" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The execution plan shows the 77816 KB of memory was granted while the estimated rows were 799624.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md2.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;No Sort Warnings in SQL Server Profiler.&lt;/p&gt;&amp;nbsp;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp1.jpg" width="739" height="499" /&gt; 
&lt;p class="style24"&gt;Now let’s execute the query in parallel with MAXDOP 0.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--In parallel with MAXDOP 0&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 0&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The query took 1912 ms to complete.&lt;/p&gt;&amp;nbsp;&lt;img alt="" src="http://www.sqlworkshops.com/images/md3.jpg" width="740" height="500" /&gt; 
&lt;p class="style24"&gt;The execution plan shows the 79360 KB of memory was granted while the estimated rows were 799624.&lt;/p&gt;&amp;nbsp;&lt;img alt="" src="http://www.sqlworkshops.com/images/md4.jpg" width="740" height="500" /&gt; 
&lt;p class="style24"&gt;The estimated number of rows between serial and parallel plan are the same. The parallel plan has slightly more memory granted due to additional overhead.&lt;/p&gt;
&lt;p class="style24"&gt;Sort properties shows the rows are unevenly distributed over the 4 threads.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md17.jpg" width="740" height="500" /&gt; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Sort Warnings in SQL Server Profiler.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp2.jpg" width="739" height="499" /&gt;&amp;nbsp; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;strong&gt;Intermediate Summary: &lt;/strong&gt;The reason for the higher duration with parallel plan was sort spill. This is due to uneven distribution of employees over Zip codes, especially concentration of 49 out of 50 employees in Zip code 2001. 
&lt;p class="style24"&gt;Now let’s update the Employees table and distribute employees evenly across all Zip codes.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; Employees &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;/&lt;/span&gt; 400 &lt;span style="COLOR:gray;"&gt;+&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; Employees &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;fullscan&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;Let’s execute the query serially with MAXDOP 1. 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Serially with MAXDOP 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 1&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The query took 751 ms to complete.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md5.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;The execution plan shows the 77816 KB of memory was granted while the estimated rows were 784707.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md6.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;No Sort Warnings in SQL Server Profiler.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp1.jpg" width="739" height="499" /&gt;&amp;nbsp;&amp;nbsp; 
&lt;p&gt;Now let’s execute the query in parallel with MAXDOP 0. &lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--In parallel with MAXDOP 0&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 0&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The query took 661 ms to complete.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md7.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;The execution plan shows the 79360 KB of memory was granted while the estimated rows were 784707.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md8.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Sort properties shows the rows are evenly distributed over the 4 threads.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md18.jpg" width="740" height="500" /&gt;&lt;/p&gt;
&lt;p class="style24"&gt;No Sort Warnings in SQL Server Profiler.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp1.jpg" width="739" height="499" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Intermediate Summary: &lt;/b&gt;&lt;span style="mso-bidi-font-weight:normal;"&gt;When employees were distributed unevenly, concentrated on 1 Zip code, parallel sort spilled while serial sort performed well without spilling to tempdb. When the employees were distributed evenly across all Zip codes, parallel sort and serial sort did not spill to tempdb. This shows uneven data distribution may affect the performance of some parallel queries negatively. For detailed discussion of memory allocation, refer to webcasts available at&lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt; &lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;www.sqlworkshops.com/webcasts&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Some of you might conclude from the above execution times that parallel query is not faster even when there is no spill. Below you can see when we are joining limited amount of Zip codes, parallel query will be fasted since it can use Bitmap Filtering.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s update the Employees table with 49 out of 50 employees located in Zip code 2001.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; Employees &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;/&lt;/span&gt; 400 &lt;span style="COLOR:gray;"&gt;+&lt;/span&gt; 1 &lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 50 &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; Employees &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; 2001 &lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;%&lt;/span&gt; 50 &lt;span style="COLOR:gray;"&gt;!=&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; Employees &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;fullscan&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Let’s create the temporary table #FireDrill with limited Zip codes.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;drop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;table&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;create&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;table&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill&lt;span style="COLOR:blue;"&gt; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;primary&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;key&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;insert&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;into&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill &lt;span style="COLOR:blue;"&gt;select&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;distinct&lt;/span&gt; Zip&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees &lt;span style="COLOR:blue;"&gt;where&lt;/span&gt; Zip &lt;span style="COLOR:gray;"&gt;between&lt;/span&gt; 1800 &lt;span style="COLOR:gray;"&gt;and&lt;/span&gt; 2001&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; #FireDrill &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;fullscan&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Let’s execute the query serially with MAXDOP 1.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Serially with MAXDOP 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 1&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The query took 989 ms to complete.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md9.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;The execution plan shows the 77816 KB of memory was granted while the estimated rows were 785594.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md10.jpg" width="740" height="500" /&gt; 
&lt;p class="style24"&gt;No Sort Warnings in SQL Server Profiler.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp1.jpg" width="739" height="499" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Now let’s execute the query in parallel with MAXDOP 0.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--In parallel with MAXDOP 0&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 0&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The query took 1799 ms to complete.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md11.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;The execution plan shows the 79360 KB of memory was granted while the estimated rows were 785594.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md12.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Sort Warnings in SQL Server Profiler.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp2.jpg" width="739" height="499" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;The estimated number of rows between serial and parallel plan are the same. The parallel plan has slightly more memory granted due to additional overhead.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;&lt;strong&gt;Intermediate Summary: &lt;/strong&gt;The reason for the higher duration with parallel plan even with limited amount of Zip codes was sort spill. This is due to uneven distribution of employees over Zip codes, especially concentration of 49 out of 50 employees in Zip code 2001. 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Now let’s update the Employees table and distribute employees evenly across all Zip codes.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; Employees &lt;span style="COLOR:blue;"&gt;set&lt;/span&gt; Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; EmployeeID &lt;span style="COLOR:gray;"&gt;/&lt;/span&gt; 400 &lt;span style="COLOR:gray;"&gt;+&lt;/span&gt; 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;update&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; Employees &lt;span style="COLOR:blue;"&gt;with&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;fullscan&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;Let’s execute the query serially with MAXDOP 1.&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Serially with MAXDOP 1&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 1&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The query took 250 &lt;span style="mso-spacerun:yes;"&gt;&amp;nbsp;&lt;/span&gt;ms to complete.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md13.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;The execution plan shows the 9016 KB of memory was granted while the estimated rows were 79973.8.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md14.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;No Sort Warnings in SQL Server Profiler.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp1.jpg" width="739" height="499" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;Now let’s execute the query in parallel with MAXDOP 0.&lt;/p&gt;&amp;nbsp; 
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Example provided by www.sqlworkshops.com&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--Execute query with uneven Zip code distribution&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:green;mso-no-proof:yes;"&gt;--In parallel with MAXDOP 0&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;set&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="COLOR:blue;"&gt;statistics&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;time&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;on&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;declare&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeID &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @EmployeeName &lt;span style="COLOR:blue;"&gt;varchar&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;48&lt;span style="COLOR:gray;"&gt;),&lt;/span&gt;@zip &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;select&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;" class="style18"&gt; @EmployeeName &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;EmployeeName&lt;span style="COLOR:gray;"&gt;,&lt;/span&gt; @zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:blue;"&gt;from&lt;/span&gt; Employees e&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;inner&lt;/span&gt; &lt;span style="COLOR:gray;"&gt;join&lt;/span&gt; #FireDrill fd &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip &lt;span style="COLOR:gray;"&gt;=&lt;/span&gt; fd&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;order&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;by&lt;/span&gt; e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;Zip&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;option &lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:gray;mso-no-proof:yes;"&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;maxdop&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;mso-no-proof:yes;"&gt; 0&lt;/span&gt;&lt;span style="FONT-FAMILY:&amp;#39;Courier New&amp;#39;;FONT-SIZE:10pt;mso-no-proof:yes;"&gt;&lt;span style="COLOR:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="LINE-HEIGHT:115%;FONT-FAMILY:&amp;#39;Courier New&amp;#39;;COLOR:blue;mso-no-proof:yes;"&gt;go&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;The query took 85 ms to complete.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md15.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;The execution plan shows the 13152 KB of memory was granted while the estimated rows were 784707.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/md16.jpg" width="740" height="500" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;No Sort Warnings in SQL Server Profiler.&lt;/p&gt;&lt;img alt="" src="http://www.sqlworkshops.com/images/mdp1.jpg" width="739" height="499" /&gt;&amp;nbsp; 
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Here you see, parallel query is much faster than serial query since SQL Server is using Bitmap Filtering to eliminate rows before the hash join.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;Parallel queries are very good for performance, but in some cases it can hinder performance. If one identifies the reason for these hindrances, then it is possible to get the best out of parallelism. I covered many aspects of monitoring and tuning parallel queries in webcasts (&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;www.sqlworkshops.com/webcasts&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;) and articles (&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;a href="http://www.sqlworkshops.com/articles.asp"&gt;&lt;u&gt;&lt;strong&gt;www.sqlworkshops.com/articles&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;). I suggest you to watch the webcasts and read the articles to better understand how to identify and tune parallel query performance issues.&lt;/p&gt;
&lt;p class="style24"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;b style="mso-bidi-font-weight:normal;"&gt;Summary: &lt;/b&gt;&lt;span style="mso-bidi-font-weight:normal;"&gt;One has to avoid sort spill over tempdb and the chances of spills are higher when a query executes in parallel with uneven data distribution. Parallel query brings its own advantage, reduced elapsed time and reduced work with Bitmap Filtering. So it is important to understand how to avoid spills over tempdb and when to execute a query in parallel.&lt;/span&gt;&lt;/p&gt;
&lt;p class="style24"&gt;&lt;span style="mso-bidi-font-weight:normal;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;I explain these concepts with detailed examples in my webcasts (&lt;/strong&gt;&lt;a href="http://www.sqlworkshops.com/agenda.asp"&gt;&lt;u&gt;&lt;strong&gt;www.sqlworkshops.com/webcasts&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;&lt;strong&gt;), I recommend you to watch them. The best way to learn is to practice. To create the above tables and reproduce the behavior, join the mailing list at &lt;font color="#03664b"&gt;&lt;u&gt;&lt;a title="http://www.sqlworkshops.com/ml" href="http://visitor.constantcontact.com/d.jsp?m=1102928002407&amp;amp;p=oi" target="_blank"&gt;&lt;u&gt;&lt;span class="style23"&gt;www.sqlworkshops.com/ml&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt; and I will send you the relevant SQL Scripts.&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;span class="style18"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="style6"&gt;
&lt;p class="style21"&gt;Register for the upcoming 3 Day Level 400 Microsoft SQL Server 2008 and SQL Server 2005 Performance Monitoring &amp;amp; Tuning Hands-on Workshop &lt;span&gt;in &lt;/span&gt;&lt;font style="BACKGROUND-COLOR:#d3cd2e;"&gt;&lt;strong&gt;&lt;span class="style4"&gt;London&lt;/span&gt;&lt;/strong&gt;&lt;span class="style4"&gt;, &lt;/span&gt;&lt;strong&gt;&lt;span class="style4"&gt;United Kingdom&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt; during&lt;strong&gt; &lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;March 15-17, 2011&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;, click &lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt; to register&lt;font color="#03664b"&gt; / &lt;u&gt;&lt;a title="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" href="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" target="_blank"&gt;&lt;u&gt;&lt;span class="style1"&gt;&lt;strong&gt;Microsoft UK TechNet&lt;/strong&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt;.These are hands-on workshops with a maximum of 12 participants and not lectures. For consulting engagements click &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/consulting.asp"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;&lt;span class="style18"&gt;Disclaimer and copyright information:&lt;/span&gt;&lt;/strong&gt;&lt;br class="style18" /&gt;&lt;span class="style18"&gt;This article refers to organizations and products that may be the trademarks or registered trademarks of their various owners.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font class="style18"&gt;&lt;font size="2"&gt;Copyright of this article belongs to &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/instructor.htm"&gt;&lt;u&gt;&lt;font size="2"&gt;R Meyyappan&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt; / &lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font size="2"&gt;www.sqlworkshops.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;. You may freely use the ideas and concepts discussed in this article with acknowledgement (&lt;/font&gt;&lt;a href="http://www.sqlworkshops.com/"&gt;&lt;u&gt;&lt;font size="2"&gt;www.sqlworkshops.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;font size="2"&gt;), but you may not claim any of it as your own work.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style18"&gt;This article is for informational purposes only; you use any of the suggestions given here entirely at your own risk.&lt;/p&gt;
&lt;p class="style18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style21"&gt;Register for the upcoming 3 Day Level 400 Microsoft SQL Server 2008 and SQL Server 2005 Performance Monitoring &amp;amp; Tuning Hands-on Workshop &lt;span&gt;in &lt;/span&gt;&lt;font style="BACKGROUND-COLOR:#d3cd2e;"&gt;&lt;strong&gt;&lt;span class="style4"&gt;London&lt;/span&gt;&lt;/strong&gt;&lt;span class="style4"&gt;, &lt;/span&gt;&lt;strong&gt;&lt;span class="style4"&gt;United Kingdom&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt; during&lt;strong&gt; &lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;March 15-17, 2011&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt;, click &lt;strong&gt;&lt;u&gt;&lt;b&gt;&lt;a href="http://www.sqlworkshops.com/registrationuk3.asp"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;&lt;/strong&gt; to register&lt;font color="#03664b"&gt; / &lt;u&gt;&lt;a title="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" href="http://blogs.technet.com/b/andrew/archive/2010/06/02/sql-server-2008-performance-tuning.aspx" target="_blank"&gt;&lt;u&gt;&lt;span class="style1"&gt;&lt;strong&gt;Microsoft UK TechNet&lt;/strong&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;&lt;/font&gt;.These are hands-on workshops with a maximum of 12 participants and not lectures. For consulting engagements click &lt;u&gt;&lt;a href="http://www.sqlworkshops.com/consulting.asp"&gt;&lt;u&gt;here&lt;/u&gt;&lt;/a&gt;&lt;/u&gt;.&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style21"&gt;R Meyyappan &lt;a href="mailto:rmeyyappan@sqlworkshops.com"&gt;&lt;strong&gt;rmeyyappan@sqlworkshops.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="style21"&gt;LinkedIn: &lt;a href="http://at.linkedin.com/in/rmeyyappan"&gt;&lt;strong&gt;http://at.linkedin.com/in/rmeyyappan&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="style21"&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=15327" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/SQLBits/default.aspx">SQLBits</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Performance/default.aspx">Performance</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Training/default.aspx">Training</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Level+400/default.aspx">Level 400</category><category domain="http://sqlblogcasts.com/blogs/sqlworkshops/archive/tags/Workshop/default.aspx">Workshop</category></item><item><title>Parallel Sort and Merge Join – Watch out for unpredictability in performance</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/28/Parallel-Sort-and-Merge-Join-_1320_-Watch-out-for-unpredictability-in-performance.aspx</link><pubDate>Thu, 28 Oct 2010 05:54:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:14979</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=14979</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/28/Parallel-Sort-and-Merge-Join-_1320_-Watch-out-for-unpredictability-in-performance.aspx#comments</comments><description>When SQL Server sorts or does merge join in parallel the query performance highly depends on other concurrent CPU intensive activities taking place on the server.
...(&lt;a href="http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/28/Parallel-Sort-and-Merge-Join-_1320_-Watch-out-for-unpredictability-in-performance.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=14979" width="1" height="1"&gt;</description></item><item><title>In London, during November 17-19, 2010 3 Day Level 400 Microsoft SQL Server 2008 and SQL Server 2005 Performance Monitoring &amp; Tuning Workshop</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/21/In-London_2C00_-during-November-17_2D00_19_2C00_-2010-3-Day-Level-400-Microsoft-SQL-Server-2008-and-SQL-Server-2005-Performance-Monitoring-_2600_-Tuning-Workshop.aspx</link><pubDate>Thu, 21 Oct 2010 05:55:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:14935</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=14935</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/21/In-London_2C00_-during-November-17_2D00_19_2C00_-2010-3-Day-Level-400-Microsoft-SQL-Server-2008-and-SQL-Server-2005-Performance-Monitoring-_2600_-Tuning-Workshop.aspx#comments</comments><description>We are organizing the 3 Day Truly Level 400 Microsoft SQL Server 2008 and SQL Server 2005 Performance Monitoring &amp;amp; Tuning Workshop in London, United Kingdom during November 17-19, 2010.

 Let us know if you or one of your colleagues is interested in participating in the workshop.

 You can register for the workshop with this link: http://www.sqlworkshops.com/ruk. Past workshop feedbacks are available at www.sqlworkshops.com/feedbacks.
...(&lt;a href="http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/21/In-London_2C00_-during-November-17_2D00_19_2C00_-2010-3-Day-Level-400-Microsoft-SQL-Server-2008-and-SQL-Server-2005-Performance-Monitoring-_2600_-Tuning-Workshop.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=14935" width="1" height="1"&gt;</description></item><item><title>Flying with Plan Freezing – Mostly you experience thrust or stay afloat, but rarely this add-on can be a drag</title><link>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/20/Flying-with-Plan-Freezing-_1320_-Mostly-you-experience-thrust-or-stay-afloat_2C00_-but-rarely-this-add_2D00_on-can-be-a-drag.aspx</link><pubDate>Wed, 20 Oct 2010 08:51:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:14928</guid><dc:creator>sqlworkshops</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlworkshops/rsscomments.aspx?PostID=14928</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/20/Flying-with-Plan-Freezing-_1320_-Mostly-you-experience-thrust-or-stay-afloat_2C00_-but-rarely-this-add_2D00_on-can-be-a-drag.aspx#comments</comments><description>Plan freezing is an interesting feature, targeting plan stability, performance predictability. We all want stability, especially during the good times. There are exceptions, there are always exceptions, that’s what software testing is all about, there is no software without flaws, you have to learn to identify and navigate around the flaws. Most of the time these flaws will be eventually corrected (sometimes they do get marked ‘By Design/Feature’!), but a mission critical application can’t wait for the service pack or hotfix, it needs to perform today, now!

...(&lt;a href="http://sqlblogcasts.com/blogs/sqlworkshops/archive/2010/10/20/Flying-with-Plan-Freezing-_1320_-Mostly-you-experience-thrust-or-stay-afloat_2C00_-but-rarely-this-add_2D00_on-can-be-a-drag.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=14928" width="1" height="1"&gt;</description></item></channel></rss>