問:為了從查詢中返回指定數量的行,使用 TOPN 子句比使用SET ROWCOUNTN 語句要快嗎?
答:在正確進行了索引的情況下,TOP N 子句和SET ROWCOUNT N 語句是一樣快的,但是如果數據未經過排序,TOP N 要快一些。在輸入未排序的情況下,TOP N 操作時使用一個經過排序的小的中間臨時表,而且操作時僅僅替換該表的最後一行。如果輸入是近似排序的,TOP N 引擎必須刪除或插入最後行,但只需幾次操作即可。近似排序意味著您正在處理的堆集在初始構建時可進行有序的插入操作,並且不需要進行很多的更新、刪除、向前移動指針等操作。
排序一個近似排序的堆集比排序一個巨大的表要更有效率。在一次測試中,使用TOP N 來對一個由無序插入操作構建的並且含有同樣的行數的表進行排序,發現TOP N 的效率也不高。通常,在進行過索引和未進行過索引的情況下,I/O時間都是一樣的;但是如果沒有進行過索引,SQL Server 必須要進行一次全表掃描。處理器時間和實耗時間說明近似排序的堆集要更有效率一些。但I/O時間是相同的,因為不管怎樣SQL Server都要讀取所有的行。