[英]SQL Server : clustered index slow
我有2個數據庫表:
Message
表 MessageData
我加入他們以獲得2個日期之間的傳感器值。
查詢以99%的時間緩慢返回結果,以尋找聚簇索引。
如何改善這個表現? 在索引或查詢方面有什么建議嗎?
我對聯接運行以下查詢:我使用主鍵> 3264353049進行過濾,以防止查找日期與過去幾年的行有關
SELECT
t.MessageId, t.DataSourceId, t.[Value],
DataSource.SourceNameId, DataSource.Name
FROM
[MessageData] t
INNER JOIN
[Message] m ON t.MessageId = m.MessageId
LEFT JOIN
DataSource ON t.DataSourceId = DataSource.DataSourceId
WHERE
t.MessageId > 3264353049
AND m.ObjectId = @objId
AND m.GpsTime BETWEEN @dtFrom AND @dtTo
AND m.Valid = 1;
我有這些索引:
ALTER TABLE [MessageData]
ADD CONSTRAINT [AnalogData_PK]
PRIMARY KEY CLUSTERED ([MessageId] ASC, [DataSourceId] ASC)
CREATE NONCLUSTERED INDEX [MessageData_DataSourceId_IDX]
ON [MessageData] ([DataSourceId] ASC)
GO
CREATE NONCLUSTERED INDEX [IX_gpstime_objectid]
ON [Message] ([GpsTime] ASC)
INCLUDE ([MessageId], [ObjectId])
GO
CREATE UNIQUE CLUSTERED INDEX [Message_Object_UK]
ON [Message] ([ObjectId] ASC, [GpsTime] ASC, [MessageId] ASC)
GO
消息表數據:
MessageId ObjectId VectorAngle VectorSpeed Altitude GpsTime X Y VisibleSatelites
-------------------- ----------- ----------- ----------- ----------- ------------------------------ ---------------------- ---------------------- ----------------
9988600080 192 0 0 0 2017-07-19 00:03:20 0 0 0
9988600082 192 0 0 0 2017-07-19 00:08:20 0 0 0
9988600086 192 0 0 0 2017-07-19 00:13:20 0 0 0
9988600089 192 0 0 0 2017-07-19 00:18:20 0 0 0
9988600092 192 0 0 0 2017-07-19 00:23:20 0 0 0
和MessageData
表數據:
MessageId DataSourceId Value SourceNameId Name
-------------------- ------------ ---------------------- ------------ ------------------------------
9988600080 6364 0 1 Engine
9988600080 6365 0 2 Digital Input Status 2
9988600080 325346 0 179 DOUT 1
9988600080 325347 0 180 DOUT 2
9988600080 334214 0 69 Bettary
9988600082 6364 0 1 Engine
9988600082 6365 0 2 Digital Input Status 2
9988600082 325346 0 179 DOUT 1
9988600082 325347 0 180 DOUT 2
9988600082 334214 0 69 Bettary
9988600086 6364 0 1 Engine
9988600086 6365 0 2 Digital Input Status 2
9988600086 325346 0 179 DOUT 1
9988600086 325347 0 180 DOUT 2
9988600086 334214 0 69 Bettary
9988600089 6364 0 1 Engine
9988600089 6365 0 2 Digital Input Status 2
9988600089 325346 0 179 DOUT 1
9988600089 325347 0 180 DOUT 2
9988600089 334214 0 69 Bettary
9988600092 6364 0 1 Engine
9988600092 6365 0 2 Digital Input Status 2
9988600092 325346 0 179 DOUT 1
9988600092 325347 0 180 DOUT 2
9988600092 334214 0 69 Bettary
就像評論中提到的那樣,我一定會更新我的統計信息。 但是之后,我將查看此索引:
CREATE UNIQUE CLUSTERED INDEX [Message_Object_UK]
ON [Message] ([ObjectId] ASC, [GpsTime] ASC, [MessageId] ASC)
該查詢執行該討厭的嵌套循環連接,因為它必須查找並找到具有特定messageID的記錄,該記錄必須從Message表索引中的EACH記錄中提取。 嘗試將其更改為:
CREATE UNIQUE CLUSTERED INDEX [Message_Object_UK]
ON [Message] ([MessageId] ASC, [ObjectId] ASC, [GpsTime] ASC )
這有可能使您獲得哈希或合並聯接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.