sql-server - SQL 服务器 : clustered index slow

标签 sql-server tsql sql-server-2012

我有 2 个数据库表:

  1. Message 包含 gps 消息的表
  2. 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;

Query plan time ?

query plan screen2

我有这些索引:

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 表索引中的每条记录中提取出来。尝试将其更改为:

CREATE UNIQUE CLUSTERED INDEX [Message_Object_UK] 
ON [Message] ([MessageId] ASC, [ObjectId] ASC, [GpsTime] ASC )

这有机会让您获得散列或合并联接

关于sql-server - SQL 服务器 : clustered index slow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45203718/

相关文章:

sql - 在SQL Server中创建枚举

sql-server - T-SQL 不同的截止日期

sql - 获取两个日期之间每天 24 小时的最小值/最大值

excel - Excel Slicer 中的 SSAS 维度安全结果

sql-server - 如何使用包内 Excel 文件第一行中指定的列名称?

sql-server - 为什么我会收到错误 "Cannot drop the database ' test' 因为它正在用于复制。错误 : 3724"?

SQL Server 使用 LIKE 在名字列中搜索 ""个字符

sql-server - 仅当最近时才从暂存插入到最终

asp.net - 根据 SQL Server 列或行更新将数据传输到特定页面上的客户端

reporting-services - SSRS 设置 HTML 背景颜色