我是一个完整的索引dummie,但我已阅读并观看了很多关于索引的视频,但我似乎无法弄明白。
该表如下所示:
ID int
ComponentId int
Value float
TimeStamp datetime
想象这个数据库有大约200万条记录,我想做类似以下的事情:
SELECT Value
FROM Log
WHERE ComponentId = X
AND TimeStamp >= SELECT CONVERT(VARCHAR(8),DATEADD(day, -1, getdate()),112)
这应该可以获得过去24小时内所选组件的所有值
我真的想知道我是否应该在ComponentId,Timestamp或两者
上对此进行索引提前致谢!
答案 0 :(得分:2)
您应该使用ComponentId, Timestamp
添加复合以及覆盖索引。
create index ix_Log_ComponentId_Timestamp on log(ComponentId, Timestamp) include (value)
此外,无需在CONVERT(VARCHAR(8),DATEADD(day, -1, getdate()),112)
答案 1 :(得分:1)
我建议你在桌子上创建covering index
,如:
CREATE UNIQUE NONCLUSTERED INDEX IDX_IndexName ON dbo.TableName(ComponentId, TimeStamp)
INCLUDE(Value)
这可以通过索引搜索提高查询的性能。此外,Value
将存储在索引的叶子中,因此您可以删除lookups
,因为您选择的数据已经在索引中。