2017-07-20 220 views
2

我有2个数据库表:包含包含消息传感器值 SQL服务器:聚集索引慢

我加入他们得到之间传感器值GPS消息

  • MessageData

    1. 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; 
      

      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 
      
  • +0

    那么,什么是你的问题的机会吗? –

    +0

    @SahanSerasinghe如何改善它,任何建议索引端,查询连接端? –

    +0

    你的地点*可能*没有做你打算做的事情。 WHERE是在JOIN之后执行的过滤机制。所以你*可能*不限制有多少记录被抓取。我说*可能*是因为优化器最终决定如何处理查询,并且可能会以不同的方式解释它。 – yanman1234

    回答

    0

    以及在评论我肯定会更新我的统计提及。但在那之后我会看这个指数:

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

    查询做那个讨厌的嵌套循环连接,因为它寻求和发现与特定MESSAGEID是具有拉出每个记录在记录消息表索引。尝试将其更改为:

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

    这有让你一个散列或合并联接

    +0

    但MessageId是这里的主键吗?它会在这种情况下寻找主要关键指标? –

    +0

    从您的脚本MessageID是MessageData表的主键。我不知道你的消息表上有什么PK。 –

    +0

    否,MessageID是消息的主键,而MessageData键是聚簇索引[MessageId,DatasourceId],该索引占据查询时间的99% –