2017-04-06 65 views
0

選擇我有2代真正的大SQL Server數據庫表的物聯網項目SQL Server的慢,從大表

第一個表是消息(行計數7423889085行)

CREATE TABLE [aymax].[Message](
    [MessageId] [bigint] IDENTITY(1,1) NOT NULL, 
    [ObjectId] [int] NOT NULL, 
    [TimeStamp] [datetime] NOT NULL CONSTRAINT [DF__Message__TimeSta__3B75D760] DEFAULT (getdate()), 
    [GpsTime] [datetime] NOT NULL, 
    [VisibleSatelites] [int] NOT NULL, 
    [X] [float] NOT NULL, 
    [Y] [float] NOT NULL, 
CONSTRAINT [Message_PK] PRIMARY KEY NONCLUSTERED 
(
    [MessageId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

第二個表是MessageSensors,行數(26359568037行),該表具有值在消息表的每個傳感器

CREATE TABLE [aymax].[MessageSensors](
    [MessageId] [bigint] NOT NULL, 
    [DataSourceId] [int] NOT NULL, 
    [Value] [float] NOT NULL CONSTRAINT [DF__AnalogDat__Value__5812160E] DEFAULT ((0)), 
CONSTRAINT [AnalogData_PK] PRIMARY KEY CLUSTERED 
(
    [MessageId] ASC, 
    [DataSourceId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

我的問題,即由時間間隔2日期時間之間求是很慢,一個如果我選擇與消息傳感器數據LSO它變得更慢,也當我使用sp_BlitzIndex檢查從brentozar.com它說我有

「Indexaphobia:高價值的缺失索引」

  1. [aymax ] [MessageSensors](等式:[DataSourceID的],[值],包括:[的MessageId])
  2. [aymax] [MessageSensors]平等:[數值]包括:[的MessageId],[的DataSourceID]

我相信創造這個2指數是將增加存儲了很多,也將花費太多時間被創建,我需要你的意見針對表有關指數

我目前的指標

1-

CREATE NONCLUSTERED INDEX [IX_gpstime_objectid] ON [aymax].[Message] 
(
    [GpsTime] ASC 
) 
INCLUDE ( [MessageId], 
    [ObjectId]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
GO 

2-

alter TABLE [aymax].[Message] ADD CONSTRAINT [Message_PK] PRIMARY KEY NONCLUSTERED 
    (
     [MessageId] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
    GO 

3rd-

ALTER TABLE [aymax].[MessageSensors] ADD CONSTRAINT [AnalogData_PK] PRIMARY KEY CLUSTERED 
(
    [MessageId] ASC, 
    [DataSourceId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
GO 

4-

CREATE NONCLUSTERED INDEX [MessageData_DataSourceId_IDX] ON [aymax].[MessageSensors] 
(
    [DataSourceId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
GO 

任何幫助,請,我需要做一個快速的信息檢索和信息傳感器

更新 而做了一些調查,我發現選擇浮點值將放緩結果太多,從1秒到3分鐘

SELECT m.messageid, 
       m.objectid, 
       m.gpstime, 
       m.x, 
       m.y, 
       -- slow is here if i replace md.value with md.messageId will return fast , md.value is float 
       md.Value , 
       0 
     FROM aymax.[message] m WITH (nolock) 
       left JOIN aymax.MessageSensors md WITH (nolock) 
         ON m.messageid = md.messageid 
         AND md.datasourceid = 425732 


     WHERE m.objectid = 14099 
       AND m.gpstime BETWEEN '2017-04-01 19:46:18.607' AND '2017-04-10 19:05:18.607' 
+0

如何爲此表和索引構建數據文件? –

+0

什麼是瓶頸? IO /內存/網絡? –

+0

有了這麼大的表格,我假設你正在使用分區。你如何劃分表中的數據?什麼是分區密鑰?你是否在查詢中包含它? (如果你不*分區數據,我*高*建議你這樣做。) – Siyual

回答