我有一个带有列的N到N表:
Id(主键)(出于各种原因我需要这个) 客户端Id FEATUREID
查询使用ClientId和FeatureId的所有组合,并且需要快速处理所有情况。 (ClientId + FeatureId,ClientId,FeatureId)
我的想法是在ClientId和FeatureId上创建一个覆盖的clustured索引,并在ClientId和FeatureId上单独创建其他非覆盖索引?这有意义吗?
另外,如果我按照ClientId的顺序创建覆盖索引,我在某处创建,我不需要为FeatureId创建FeatureId吗?
答案 0 :(得分:1)
我假设查询的输出是clientid和featureid - 而不是ID字段。 如果你确实需要这个,我会建议调查'包含列'。
(clientid,featureid)的覆盖索引
create index idx_covering on mytable(clientid,featureid)
将导致针对clientid + featureid和clientid查询的INDEX SEEK,以及针对featureid查询的INDEX SCAN。
即使使用另一个索引,仅针对featureid,将使用覆盖索引,因为查询需要返回clientid和featuredid(根据我的上述假设)。
要获取索引,请创建包含列
的索引create index idx_feature_withincluded on mytable(featureid) include (clientid)
拥有1个或2个索引是否更好取决于您的环境 - 权衡是可维护性和性能。对于每个UPDATE和INSERT,索引都会更新,但如果这对于SELECT的数量来说是一个很小的开销那么那对你有好处。
这是通过实施单一方式,监控和调整才能真正解决的问题之一。即使您达到了最佳解决方案,数据量或应用程序使用的进一步增加也会显着改变数据库的执行方式。