【问题标题】:SQL Server: How to best index an N-N Table?SQL Server:如何最好地索引 N-N 表?
【发布时间】:2023-03-23 06:39:01
【问题描述】:

我有一个包含列的 N 到 N 表:

Id(主键)(出于各种原因我需要这个) 客户 ID 特征ID

查询使用 ClientId 和 FeatureId 的所有组合,并且需要快速处理所有情况。 (ClientId+FeatureId, ClientId, FeatureId)

我的想法是在 ClientId 和 FeatureId 上创建一个涵盖的聚集索引,并在 ClientId 和 FeatureId 上分别创建其他非涵盖索引?这有意义吗?

另外,如果我按照 ClientId、FeatureId 我不必创建的顺序创建涵盖索引以及为 FeatureId 创建单独索引,我已经在某处阅读过?

【问题讨论】:

    标签: sql-server indexing


    【解决方案1】:

    我假设查询的输出是 clientid 和 featureid - 而不是 ID 字段。 如果您也确实需要这个,我建议您调查“包含的列”。

    (clientid,featureid)上的覆盖索引

    create index idx_covering on mytable(clientid,featureid)
    

    将导致 clientid+featureid 和 clientid 查询的 INDEX SEEK 以及 featureid 查询的 INDEX SCAN。

    即使使用另一个索引,仅针对 featureid,也会使用覆盖索引,因为查询需要返回 clientid 和 featuresid(根据我的上述假设)。

    要获得索引查找,请创建包含列的索引

    create index idx_feature_withincluded on mytable(featureid) include (clientid)
    

    拥有 1 个或 2 个索引是否更好取决于您的环境 - 权衡是在可维护性和性能之间。对于每个 UPDATE 和 INSERT,索引都会更新,但如果这对于 SELECT 的数量来说是一个很小的开销,那么这对你有好处。

    这是只能通过实施一种方法、监控和调整才能真正解决的问题之一。即使您找到了最佳解决方案,数据量或应用程序使用的进一步增加也会显着改变数据库的执行方式。

    【讨论】:

      猜你喜欢
      • 2017-08-11
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多