Henrik,
Many thanks for your response.
I've played around with indexing strategies with my "Latest Edition" example using the dbo.Books table, and nothing is really helping.
The strange thing is that from an IO point of view, the ROW_NUMBER() solution does show a smaller scan and logical read count. However, the CPU time is very high.
For example:
SET STATISTICS IO ON
SET STATISTICS TIME ON
;WITH BookCTE (RowNumber, BookTitle, BookEdition, BookPublishDate, BookAuthor)
AS
(
SELECT
ROW_NUMBER()OVER (PARTITION BY BookTitle ORDER BY BookEdition DESC),
BookTitle, BookEdition, BookPublishDate, BookAuthor
FROM dbo.Books
)
SELECT BookTitle, BookEdition, BookPublishDate, BookAuthor
FROM BookCTE
WHERE RowNumber=1
ORDER BY BookTitle
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 28 ms.
(10 row(s) affected)
Table 'Books'. Scan count 1, logical reads 10132, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 18297 ms, elapsed time = 18295 ms.
select b.BookTitle, b.BookEdition, b.BookPublishDate, b.BookAuthor
from books b
inner join
(select booktitle, max(bookedition) as bookedition from books group by booktitle)q
on b.booktitle = q.booktitle and b.bookedition = q.bookedition;
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
(10 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Books'. Scan count 2, logical reads 20264, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 3609 ms, elapsed time = 3741 ms.
I think I may need Itzik to take a look at this. 😉
Will carry on with research, as time allows.
Regards,
Lawrence.