Sql-Server

有效獲取最後一條記錄

  • August 13, 2016

我有一個包含 OrderId 的表訂單(WarehouseId 和 OrderId 是複合主鍵)。

WarehouseId | OrderId | ItemId | OrderDate
-------------------------------------------
         1 |       1 |      1 | 2016-08-01
         1 |       2 |      2 | 2016-08-02
         1 |       3 |      5 | 2016-08-10
         2 |       1 |      1 | 2016-08-05
         3 |       1 |      6 | 2016-08-06

(表格已簡化,僅顯示必填欄位)

如何有效地選擇特定倉庫的最後一個訂單?我目前這樣做:

SELECT TOP 1 * FROM tblOrder WHERE WarehouseId = 1 ORDER BY OrderId DESC

我擔心的是,當我有一百萬個(或更多)特定倉庫的訂單時,通過排序並選擇第一條記錄,它會太慢(我認為?)。根據我目前得到的建議,這不是一項昂貴的操作,因此應該沒問題。那正確嗎?

或者,有沒有更有效的方法來選擇最後的訂單記錄?

在適當的情況下,數據庫引擎可以進行向後掃描,即直接到索引的末尾並向後工作,這樣既好又高效。您可以在掃描運算符的“掃描方向”屬性下的查詢執行計劃中看到這一點。對於您的範例,使用 WarehouseId,OrderId 上的複合主鍵,這將起作用:

向後掃描

正如您所做select *的那樣,聚集索引已經涵蓋了整個查詢,因此不需要額外的書籤查找。

當你試圖找出哪個語句是最好的(並且仍然返回正確的結果)時,你絕對應該比較執行計劃。

根據您範例中的數據和您提供的範例選擇,這也應該有效

SELECT *
FROM WarehouseTable a
WHERE WarehouseID = 1
   AND OrderID = (
       SELECT MAX(OrderID)
       FROM WarehouseTable
       WHERE WarehouseID = a.WarehouseID
       )

引用自:https://dba.stackexchange.com/questions/146696