我有一个包含几亿行数据的表。有一个字段称为EventId
整数字段。
我有许多不同的视图,它们只会返回具有特定 EventId 的数据
如果我运行查询
SELECT TOP 1000 * FROM vw_MyView
返回行需要 5 分钟。我需要向什么添加索引?当前在主表上有索引用于主键(clustered on LogId
)和 non-clustered on EventId
,因为每个视图的 where 子句中都使用了该索引。
我知道可以索引视图 - 我应该在视图中索引哪些字段?我应该只运行 DB Engine Tuning Wizard 并查看它的内容吗?
更新以下反馈
我的包含所有数据的主表符合以下模式
LogId (int) PK
EventId (int)
Param1 varchar(255)
Param2 varchar(255)
..
..
..
Param24 varchar(255)
每种事件类型都有不同的参数,因此主表中的通用字段名称。
我对每种类型的事件都有一个视图,其中主表中的 ParamX 字段通过视图获得了正确的字段名称。
因此,一个事件的视图将类似于
SELECT LogId, Param1 AS Name, Param2 AS Address1, Param3 AS Address2
WHERE EventId = 10
我试过查询
SELECT TOP 1000 LogId from vw_MyView
而且效果很快。其他领域正在减慢速度,我认为这是由于索引不佳?
更新 2 - 更多信息
以前,每个事件的数据都存储在每个事件的表中。这意味着添加新事件需要为每个事件创建一个新表。
我将数据批量导入临时表,然后将其移至我的主表中。批量导入使其速度更快,但我担心拥有如此大的主表可能意味着查询它变得如此缓慢以至于无法使用。
数百万行数据超过 10 年左右,因此我可能会将前 8 年的数据移至另一个数据库以进行存档,以便仅保留最近的 2 年。
所以问题是我是继续使用不需要维护但可能需要大量索引的主表方法,还是回到每个事件都有一个表的原始方法?
感谢各位大侠的反馈,真的很感谢