我有一個叫讀數有> 7600萬行中它是我上運行該查詢表:查詢慢上聚集索引一定的標準
declare @tunnel_id int = 13
SELECT TOP 1 local_time, recorded_time
FROM readings
WHERE tunnel_id = @tunnel_id
ORDER BY id DESC
的id列是一個BIGINT,設置爲主鍵,並且具有聚集索引,並且在tunnel_id字段上還有一個索引。
作品很棒,在我嘗試的20個不同的tunnel_id中,大約有16個返回不到一秒鐘。但是,在最後4個左右,查詢需要40秒,並使用數十萬次讀取。
我試着修改查詢到這一點:
SELECT TOP (1) local_time, recorded_time
FROM readings
where id = (
SELECT TOP 1 id
FROM readings
WHERE tunnel_id = 13
ORDER BY id DESC
)
這再一次只有幾tunnel_id的慢。更讓我更困惑的是內部選擇快速運行緩慢的ID,如果我硬編碼最大的ID而不是子查詢它也快速運行。
我在這裏錯過了什麼讓這個查詢執行得不好?
編輯意見:
Tunnel_id不是唯一的,每個通道都有數以百萬計的行。這是在Sql Server 2012上運行的。
我包含來自快速和慢速運行的實際執行計劃,它們是相同的。
快速:
慢:
但你可以看到,在不到一秒鐘的第一執行而第二個需要51秒。
我猜它的很大一部分是你的'ORDER BY ID DESC' - 默認情況下,你可能在'id ASC'上有聚簇索引,所以有可能在後臺發生排序。 – JNK
爲什麼你首先有一個子查詢? –
建議嘗試使用tunel_id的參數封裝在存儲過程中進行查詢。 otimizer可能會發生一些奇怪的事情,以及如何緩存執行計劃。一般來說,根據Micrsoft Press的Book 70-461,查詢Microsoft SQL Server,與特定查詢相比,查詢計劃對存儲過程的緩存效率更高。只是一個想法。 – Karl