<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.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>Search results matching tags 'T-SQL', 'performance', and 'SQL Server 2008 R2'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=T-SQL,performance,SQL+Server+2008+R2&amp;orTags=0</link><description>Search results matching tags 'T-SQL', 'performance', and 'SQL Server 2008 R2'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>OUTPUT clause and windowing functions</title><link>http://sqlblog.com/blogs/piotr_rodak/archive/2011/07/31/output-clause-and-windowing-functions.aspx</link><pubDate>Sun, 31 Jul 2011 20:55:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:37412</guid><dc:creator>rodak.p@gmail.com</dc:creator><description>&lt;p&gt;A few days ago I was asked a question how to remove duplicates from a table. As usually in such cases, the duplicate values were related only to several columns, not all of them. So classical approach, to copy distinct data into temp table, truncate the table with duplicates and then copy the data back wouldn’t work. In such cases I find one of the windowing functions, row_number() to be the easiest to use. You just define criteria of numbering of rows and then you remove all rows are &lt;b&gt;not first&lt;/b&gt; in their partition. Let’s have a look how it works.&lt;/p&gt;  &lt;p&gt;First, let’s create and populate sample table:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2f67f1dc-cbef-4da3-874d-71e3fdf24d4b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;object_id&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'tempdb..#t'&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#808080;"&gt;is&lt;/span&gt; &lt;span style="color:#808080;"&gt;not&lt;/span&gt; &lt;span style="color:#808080;"&gt;null&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;drop&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; #t&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; #t&lt;span style="color:#808080;"&gt;(&lt;/span&gt;Id &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;3&lt;span style="color:#808080;"&gt;),&lt;/span&gt; randomData &lt;span style="color:#0000ff;"&gt;uniqueidentifier&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;default&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;newid&lt;/span&gt;&lt;span style="color:#808080;"&gt;()))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; #t&lt;span style="color:#808080;"&gt;(&lt;/span&gt;Id&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;values&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'123'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'124'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'141'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'141'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'121'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'121'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'145'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'145'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'152'&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#808080;"&gt;*&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; #t&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;When you run the query, you should see result similar to the following illustration:&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1pkh0KvDICqyCFedz7gczEQRDf7ojUtHJQW-A5OdMS-LAXaVgX97gmcR_Khw0eg6eZidjedokWxKE/ScreenShot011.jpg?psid=1" height="373" width="508"&gt;&lt;/p&gt;  &lt;p&gt;Deleting duplicates is pretty straightforward. You define partitioned row numbering and then you delete all rows that have row number bigger than 1:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:af71ae57-84a9-45f9-8bae-5b9be429541e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; dupes &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#808080;"&gt;*,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;row_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;over&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;partition&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; Id &lt;span style="color:#0000ff;"&gt;order&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; Id&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; rn&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; #t&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;delete&lt;/span&gt; dupes&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; rn &lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt; 1&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#808080;"&gt;*&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; #t&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;As you see, the duplicates were removed.&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1pkh0KvDICqyBYYSqzCp1DfiGTKrV9_zK1MfMEm4uMpRuGJaPYfmX73bEgz7YMTzPmiK36r-_wxe4/ScreenShot012.jpg?psid=1" height="247" width="471"&gt;&lt;/p&gt;  &lt;p&gt;The execution plan for the above statement is pretty straightforward:&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1pL9tMjPVX5yM_uC4gMszdezTLey0oRr6WvjUdva6BhEf7AMKFtIP3jfYHMJ_aKQRXLHsH18f_2_4/Deleteplan1.jpg?psid=1" height="113" width="1017"&gt;&lt;/p&gt;  &lt;p&gt;The most interesting operator in this plan is the Sequence Project operator. It adds the calculated row number to the output, based on the criteria that you pass to the row_number() OVER clause. Here we partitioned the input by column Id which causes the row number to be restarted from 1 whenever new Id is encountered in the input. The row number is returned as result of internal function &lt;b&gt;row_number&lt;/b&gt;, which you can see in the following picture:&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1p56Zr99vHyQDjwBoBGaFiKx_q46OKAuhT6QsW3O3w4UocnK0he-CDy_k27q6_oGDqnLDKBYL_vhM/ScreenShot014.jpg?psid=1" height="182" width="565"&gt;&lt;/p&gt;  &lt;p&gt;On the left to the Sequence Project operator you can see Filter operator. This operator filters the input based on the certain predicate. You can see in&amp;nbsp; the picture below, that Filter operator allows to pass though only rows that have Expr1004 &amp;gt; 1.&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1pA682Ra77WVcobDGDPIbgTQ1rZD5L4HmVf7AIE7R4-aGmQI7vZVijfX6-IkkFqxaCsl6wRLCumus/ScreenShot013.jpg?psid=1" height="451" width="435"&gt;&lt;/p&gt;  &lt;p&gt;You can check that in this particular case only five rows were let through and subsequently deleted. Two with Id 133, one 141, one 121 and one 145.&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1pcFdwy4t1ecIWfUoq_fwzY3PfoRY1pJ7do4hYQJCTr7rrLh1c3E6ck0ULFnDa9x1ZuoKCdQ4_4OA/ScreenShot015.jpg?psid=1" height="169" width="294"&gt;&lt;/p&gt;  &lt;p&gt;What if you want to look at the rows that are deleted? Let’s repopulate the table and run the delete statement, this time with the &lt;a href="http://msdn.microsoft.com/en-us/library/ms177564%28v=SQL.105%29.aspx"&gt;OUTPUT&lt;/a&gt; clause:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6a78ce14-907a-4e35-9882-cf02c50511e0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;truncate&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; #t&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; #t&lt;span style="color:#808080;"&gt;(&lt;/span&gt;Id&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'123'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'124'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'141'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'141'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'121'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'121'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'145'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'145'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'152'&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; dupes &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#808080;"&gt;*,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;row_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;over&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;partition&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; Id &lt;span style="color:#0000ff;"&gt;order&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; Id&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; rn&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; #t&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;delete&lt;/span&gt; dupes&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;output&lt;/span&gt; deleted&lt;span style="color:#808080;"&gt;.*&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; rn &lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt; 1&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The OUTPUT clause allows you to return rows from pseudo-tables &lt;i&gt;inserted&lt;/i&gt; and &lt;i&gt;deleted&lt;/i&gt;, the same that you have access to in triggers. You can return these rows to the client or to a temporary table or table variable for further processing, or audit. Let’s have a look at the execution plan.&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1p9E5oiHJWJ6TpUpLRiumhQ4NmVdFhODUkItdrnZoe4F_p5MYplIRklWY9Na6QuJHP9yMjZZf6KL4/Deleteplan2.jpg?psid=1" height="79" width="1004"&gt;&lt;/p&gt;  &lt;p&gt;What’s this?! The Sort, Segment and Sequence Project operators where added &lt;b&gt;second time&lt;/b&gt; to the plan! When you look at their details you will see that they have exactly the same predicates and conditions as the set on the right-hand side of the Filter operator. &lt;b&gt;The difference is that they are applied to the data stream returned by the output clause&lt;/b&gt;. You can verify this looking at the results returned by the statement:&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1p70stiSP7weX2HUXcQ9YJ2WTG6ITFRTbF0MXCyybp61ZRpJeR-OHFhf4KqS58rhs9AhEn7V7-HVc/ScreenShot016.jpg?psid=1" height="176" width="507"&gt;&lt;/p&gt;  &lt;p&gt;Have you noticed something? the &lt;b&gt;rn&lt;/b&gt; column contains values 1 and 2, while it should contain only values 2 and 3, because this is what the Filter operator allowed to flow through. This is the evidence that the new operators work on the output data stream. You can see that they work on 5 rows, the ones that were deleted:&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1ptxdbW28wSRjYGuIdlJIFGbcxdKHalb9wAPhbdEG8VZT3ggJ-HGPsLCFTXNeSMtIK-MPrlZeW5Fw/ScreenShot017.jpg?psid=1" height="189" width="649"&gt;&lt;/p&gt;  &lt;p&gt;It is obvious that if you use output clause on queries that otherwise perform very well, you may run into problems. When you have many rows, the Sort operator can become a bottleneck when it is executed twice. The example also shows that the row number identifier of the row is not reliable within boundaries of single query. This may become an issue for you, if you want to identify rows based on the output from an update or delete statement.&lt;/p&gt;  &lt;p&gt;From purely performance point of view, what can you do to avoid these additional operators? The answer is simple – don’t return the row_number() column in the OUTPUT clause.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:353b40d0-e044-4ff1-9093-83b6c60dcb6e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;truncate&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; #t&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; #t&lt;span style="color:#808080;"&gt;(&lt;/span&gt;Id&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;values&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'123'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'124'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'133'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'141'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'141'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'121'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'121'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'145'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'145'&lt;/span&gt;&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'152'&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; dupes &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#808080;"&gt;*,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;row_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;over&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;partition&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; Id &lt;span style="color:#0000ff;"&gt;order&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; Id&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; rn&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; #t&lt;/li&gt; &lt;li&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;delete&lt;/span&gt; dupes&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;output&lt;/span&gt; deleted&lt;span style="color:#808080;"&gt;.&lt;/span&gt;Id&lt;span style="color:#808080;"&gt;,&lt;/span&gt; deleted&lt;span style="color:#808080;"&gt;.&lt;/span&gt;randomData&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; rn &lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt; 1&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As you see in the snippet above, I explicitly return columns from the &lt;i&gt;deleted&lt;/i&gt; table and I don’t return the &lt;b&gt;rn&lt;/b&gt; column. The optimizer realized that the column is not needed and removed the additional operators from the plan, so looks exactly the same as the first plan we saw in this post.&lt;/p&gt;  &lt;p&gt;&lt;img src="https://blufiles.storage.live.com/y1pRls7C8Yu96mPO67Hew3oiDzHp4LcmAXUysQExS4Lrza_83G_ieyQ630GkZ5YMFtCjzXwkScO3hs/Deleteplan3.jpg?psid=1" height="102" width="918"&gt;&lt;/p&gt;  &lt;p&gt;Well, if someone asked me what I think about this behavior, I would say it is a bug in the SQL Server engine. The windowing functions shouldn’t be applied to the results of the OUTPUT clause because they affect performance and potentially affect the logic of the application. &lt;/p&gt;  &lt;p&gt;This is the link to the &lt;a href="https://q5doxa.blu.livefilestore.com/y1pZuZi8Mvj5-xHwUPO1rGu6OPy7jbflS-HIHuNxez27jg4A8kcu6ctkXi3PUoBeQZmDsXeCVSB3IEIb5m4Js3jtkgIf_MKX05A/OUTPUT-testing_duplicates.sql?download&amp;amp;psid=1"&gt;test script&lt;/a&gt;, so you can run your own investigations.&lt;/p&gt;</description></item></channel></rss>