<?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>SQL and the like : Paging</title><link>http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/Paging/default.aspx</link><description>Tags: Paging</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Denali Paging–Key seek lookups</title><link>http://sqlblogcasts.com/blogs/sqlandthelike/archive/2010/11/19/denali-paging-key-seek-lookups.aspx</link><pubDate>Fri, 19 Nov 2010 13:02:10 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:15082</guid><dc:creator>Dave Ballantyne</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlandthelike/rsscomments.aspx?PostID=15082</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlandthelike/archive/2010/11/19/denali-paging-key-seek-lookups.aspx#comments</comments><description>&lt;p&gt;In my previous post “&lt;a href="http://sqlblogcasts.com/blogs/sqlandthelike/archive/2010/11/10/denali-paging-is-it-win-win.aspx"&gt;Denali Paging – is it win.win ?&lt;/a&gt;” I demonstrated the use of using the Paging functionality within Denali.&amp;#160; On reflection,&amp;#160; I think i may of been a little unfair and &lt;strike&gt;should of continued&lt;/strike&gt; always planned to continue my investigations to the next step.&lt;/p&gt;  &lt;p&gt;In Pauls &lt;a href="http://www.sqlservercentral.com/articles/paging/69892/"&gt;article&lt;/a&gt;, he uses a combination of ctes to first scan the ordered keys which is then filtered using TOP and rownumber and then uses those keys to seek the data.&amp;#160; So what happens if we replace the scanning portion of the code with the denali paging functionality.&lt;/p&gt;  &lt;p&gt;Heres the original procedure,&amp;#160; we are going to replace the functionality of the Keys and SelectedKeys ctes :&lt;/p&gt; &lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;CREATE&amp;#160; PROCEDURE &lt;/span&gt;&lt;span style="color:black;"&gt;dbo.FetchPageKeySeek      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageSize&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;BIGINT&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageNumber &lt;/span&gt;&lt;span style="color:black;"&gt;BIGINT      &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;AS      &lt;br /&gt;BEGIN       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;-- Key-Seek algorithm      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WITH&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;Keys      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;-- Step 1 : Number the rows from the non-clustered index      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- Maximum number of rows = @PageNumber * @PageSize       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;#160; TOP &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageNumber &lt;/span&gt;&lt;span style="color:gray;"&gt;* &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageSize&lt;/span&gt;&lt;span style="color:gray;"&gt;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;rn &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;ROW_NUMBER&lt;/span&gt;&lt;span style="color:gray;"&gt;() &lt;/span&gt;&lt;span style="color:blue;"&gt;OVER &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color:black;"&gt;P1.post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P1.post_id      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;dbo.Post P1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&amp;#160;&amp;#160; BY      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P1.post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;ASC      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SelectedKeys      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;-- Step 2 : Get the primary keys for the rows on the page we want      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- Maximum number of rows from this stage = @PageSize       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;#160; TOP &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageSize&lt;/span&gt;&lt;span style="color:gray;"&gt;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SK.rn&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SK.post_id      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;Keys SK      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SK.rn &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;gt; ((&lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageNumber &lt;/span&gt;&lt;span style="color:gray;"&gt;- &lt;/span&gt;&lt;span style="color:black;"&gt;1&lt;/span&gt;&lt;span style="color:gray;"&gt;) * &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageSize&lt;/span&gt;&lt;span style="color:gray;"&gt;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&amp;#160;&amp;#160; BY      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SK.post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;ASC      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;-- Step 3 : Retrieve the off-index data      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -- We will only have @PageSize rows by this stage       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SK.rn&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.post_id&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.thread_id&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.member_id&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.create_dt&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.title&lt;/span&gt;&lt;span style="color:gray;"&gt;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.body      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SelectedKeys SK      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;JOIN&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;dbo.Post P2      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ON&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;SK.post_id      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&amp;#160;&amp;#160; BY      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SK.post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;;      &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;;      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;/code&gt;  &lt;p&gt;and here is the replacement procedure using paging:&lt;/p&gt; &lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;CREATE&amp;#160; PROCEDURE &lt;/span&gt;&lt;span style="color:black;"&gt;dbo.FetchOffsetPageKeySeek     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageSize&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;BIGINT&lt;/span&gt;&lt;span style="color:gray;"&gt;,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageNumber &lt;/span&gt;&lt;span style="color:black;"&gt;BIGINT     &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;AS     &lt;br /&gt;BEGIN      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;-- Key-Seek algorithm     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;WITH&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SelectedKeys     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;AS&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;post_id     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;dbo.Post P1     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&amp;#160;&amp;#160; BY &lt;/span&gt;&lt;span style="color:black;"&gt;post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;ASC     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;OFFSET&amp;#160; &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageSize &lt;/span&gt;&lt;span style="color:gray;"&gt;* (&lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageNumber&lt;/span&gt;&lt;span style="color:gray;"&gt;-&lt;/span&gt;&lt;span style="color:black;"&gt;1&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:black;"&gt;ROWS     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FETCH &lt;/span&gt;&lt;span style="color:black;"&gt;NEXT &lt;/span&gt;&lt;span style="color:#434343;"&gt;@PageSize &lt;/span&gt;&lt;span style="color:black;"&gt;ROWS &lt;/span&gt;&lt;span style="color:blue;"&gt;ONLY     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:gray;"&gt;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.post_id&lt;/span&gt;&lt;span style="color:gray;"&gt;,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.thread_id&lt;/span&gt;&lt;span style="color:gray;"&gt;,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.member_id&lt;/span&gt;&lt;span style="color:gray;"&gt;,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.create_dt&lt;/span&gt;&lt;span style="color:gray;"&gt;,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.title&lt;/span&gt;&lt;span style="color:gray;"&gt;,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.body     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SelectedKeys SK     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;JOIN&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;dbo.Post P2     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ON&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;P2.post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;SK.post_id     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;ORDER&amp;#160;&amp;#160; BY     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:black;"&gt;SK.post_id &lt;/span&gt;&lt;span style="color:blue;"&gt;ASC&lt;/span&gt;&lt;span style="color:gray;"&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;;     &lt;br /&gt;&lt;/span&gt;&lt;/code&gt;  &lt;p&gt;Notice how all i have done is replace the functionality with the Keys and SelectedKeys CTEs with the paging functionality.&lt;/p&gt;  &lt;p&gt;So , what is the comparative performance now ?.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://sqlblogcasts.com/blogs/sqlandthelike/offsetfetch_756BA41B.jpg"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="offsetfetch" border="0" alt="offsetfetch" src="http://sqlblogcasts.com/blogs/sqlandthelike/offsetfetch_thumb_066FD1FF.jpg" width="766" height="271" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Exactly the same amount of IO and memory usage , but its now pretty obvious that in terms of CPU and overall duration we are onto a winner.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=15082" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/TSQL/default.aspx">TSQL</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/Optimizer/default.aspx">Optimizer</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/Denali/default.aspx">Denali</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/Paging/default.aspx">Paging</category></item><item><title>Denali Paging–Is it win/win ?</title><link>http://sqlblogcasts.com/blogs/sqlandthelike/archive/2010/11/10/denali-paging-is-it-win-win.aspx</link><pubDate>Wed, 10 Nov 2010 12:53:00 GMT</pubDate><guid isPermaLink="false">fa8c4e8e-46a3-4193-8264-2c1a9cb3475d:15031</guid><dc:creator>Dave Ballantyne</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://sqlblogcasts.com/blogs/sqlandthelike/rsscomments.aspx?PostID=15031</wfw:commentRss><comments>http://sqlblogcasts.com/blogs/sqlandthelike/archive/2010/11/10/denali-paging-is-it-win-win.aspx#comments</comments><description>&lt;p&gt;UPDATE : 2012-07-26 : My latest commentry of the paging subject can be found here :&amp;nbsp; &lt;a href="http://sqlblogcasts.com/blogs/sqlandthelike/archive/2012/04/26/offset-without-offset.aspx"&gt;http://sqlblogcasts.com/blogs/sqlandthelike/archive/2012/04/26/offset-without-offset.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I&amp;#39;m not one for automatically &lt;a href="http://en.wiktionary.org/wiki/poopoo"&gt;poo-pooing&lt;/a&gt; new ideas, new practices and new technology.&amp;nbsp; Rather I like to take a measured view and try to evaluate based upon merits.&lt;/p&gt;
&lt;p&gt;One of the new features in Denali is paging which is now supported by the FETCH option of the &lt;a href="http://msdn.microsoft.com/en-us/library/ms188385%28SQL.110%29.aspx"&gt;ORDER BY&lt;/a&gt; clause.&amp;nbsp; On the face of it, it does seem like a really neat addition to the product set,&amp;nbsp; but as ever we do need to find out what the real costs associated with a query are.&lt;/p&gt;
&lt;p&gt;So, using Paul Whites (&lt;a href="http://sqlblog.com/blogs/paul_white/default.aspx"&gt;blog&lt;/a&gt;|&lt;a href="http://twitter.com/PaulWhiteNZ/"&gt;twitter&lt;/a&gt;) rather excellent series on&lt;a href="http://www.sqlservercentral.com/articles/paging/69892/"&gt; paging&lt;/a&gt; as a comparison base ive created a simple stored proc using FETCH.&lt;/p&gt;
&lt;p&gt;&lt;code style="FONT-SIZE:12px;"&gt;&lt;span style="COLOR:blue;"&gt;DROP PROCEDURE &lt;/span&gt;&lt;span style="COLOR:black;"&gt;dbo.DenaliPageFetch &lt;br /&gt;GO &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;CREATE PROCEDURE &lt;/span&gt;&lt;span style="COLOR:black;"&gt;dbo.DenaliPageFetch&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;@PageSize&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;BIGINT&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&gt;@PageNumber &lt;/span&gt;&lt;span style="COLOR:black;"&gt;BIGINT &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;AS &lt;br /&gt;&lt;br /&gt;SELECT&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;P2.post_id&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;P2.thread_id&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;P2.member_id&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;P2.create_dt&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;P2.title&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;P2.body &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR:black;"&gt;dbo.Post P2 &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;ORDER&amp;nbsp;&amp;nbsp; BY &lt;/span&gt;&lt;span style="COLOR:black;"&gt;p2.post_id &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;ASC &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:black;"&gt;OFFSET&amp;nbsp; &lt;/span&gt;&lt;span&gt;@PageSize &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;* (&lt;/span&gt;&lt;span&gt;@PageNumber&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;-&lt;/span&gt;&lt;span style="COLOR:black;"&gt;1&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;) &lt;/span&gt;&lt;span style="COLOR:black;"&gt;ROWS &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;FETCH &lt;/span&gt;&lt;span style="COLOR:black;"&gt;NEXT &lt;/span&gt;&lt;span&gt;@PageSize &lt;/span&gt;&lt;span style="COLOR:black;"&gt;ROWS &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;ONLY&lt;/span&gt;&lt;/code&gt; &lt;/p&gt;
&lt;p&gt;and then i’ve compared the performance of Paul’s FetchPageKeySeek procedure to my new DenaliPageFetch.&amp;nbsp; Starting of at a low range , 1st page of 50 rows, the denali option does indeed give better performance , but by jumping to the 200th page of 50 rows we see a rather different picture emerge.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlblogcasts.com/blogs/sqlandthelike/image_2C746AA2.png"&gt;&lt;img style="BACKGROUND-IMAGE:none;BORDER-RIGHT-WIDTH:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;PADDING-TOP:0px;" title="image" border="0" alt="image" src="http://sqlblogcasts.com/blogs/sqlandthelike/image_thumb_0C595DE5.png" width="520" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think those figures speak for themselves,&amp;nbsp; so does the execution plan give a reason for this high cost ?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sqlblogcasts.com/blogs/sqlandthelike/image_60A893E8.png"&gt;&lt;img style="BACKGROUND-IMAGE:none;BORDER-BOTTOM:0px;BORDER-LEFT:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;PADDING-TOP:0px;" title="image" border="0" alt="image" src="http://sqlblogcasts.com/blogs/sqlandthelike/image_thumb_408D872B.png" width="487" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Yup, that’s right is has scanned through the top 10000 rows.&amp;nbsp; Admittedly this is only CTP1 and maybe Microsoft will invest some more time and effort into this area , but right now im not going to.&lt;/p&gt;&lt;img src="http://sqlblogcasts.com/aggbug.aspx?PostID=15031" width="1" height="1"&gt;</description><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/TSQL/default.aspx">TSQL</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/Optimizer/default.aspx">Optimizer</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/Denali/default.aspx">Denali</category><category domain="http://sqlblogcasts.com/blogs/sqlandthelike/archive/tags/Paging/default.aspx">Paging</category></item></channel></rss>