我有2个数据库表:包含包含消息传感器值 SQL服务器:聚集索引慢
我加入他们得到之间传感器值GPS消息
MessageData
Message
表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
那么,什么是你的问题的机会吗? –
@SahanSerasinghe如何改善它,任何建议索引端,查询连接端? –
你的地点*可能*没有做你打算做的事情。 WHERE是在JOIN之后执行的过滤机制。所以你*可能*不限制有多少记录被抓取。我说*可能*是因为优化器最终决定如何处理查询,并且可能会以不同的方式解释它。 – yanman1234