SQL服务器:多对多连接的最佳索引策略
SQL Server: optimal indexing strategies for many-to-many join
假设我有两个 table,items
和 stores
,主键分别为 item_id
和 store_id
。由于此处存在多对多关系,因此我还有一个中间 table、items_stores
,同时包含 item_id
和 store_id
列。因此,我可以执行两种主要类型的查询:(A) 查找商店中的所有商品,以及 (B) 查找所有有商品的商店。
到目前为止,还不错。现在我想在 items_stores
上放置一个或多个索引来加速我的查询。鉴于这些类型的查询,我应该创建两个单独的单列索引(item_id
和 store_id
),还是一个或多个多列索引?我说更多是因为我知道 SQL 服务器索引中的列是从左到右访问的,因此可能同时存在 <item_id, store_id>
和 <store_id, item_id>
.
如果您是索引新手(见鬼,即使您不是)我只会 运行 对您的常见查询的估计执行计划并创建建议的索引。密切关注磁盘 space 和您的数据 insert/update 性能。
我倾向于对所有新查询执行此操作,运行多次调整执行计划,代码略有变化,以在查询性能和 insert/update 速度之间找到适当的平衡。
结合阅读一些内容,您将很快掌握它并开始考虑优化。
您还需要考虑分片和重建索引。这可以通过 T-SQL 存储过程自动完成,因此您几乎可以设置并忘记它。
以下是一些有用的链接:
https://www.red-gate.com/simple-talk/sql/learn-sql-server/sql-server-index-basics/?article=610
假设我有两个 table,items
和 stores
,主键分别为 item_id
和 store_id
。由于此处存在多对多关系,因此我还有一个中间 table、items_stores
,同时包含 item_id
和 store_id
列。因此,我可以执行两种主要类型的查询:(A) 查找商店中的所有商品,以及 (B) 查找所有有商品的商店。
到目前为止,还不错。现在我想在 items_stores
上放置一个或多个索引来加速我的查询。鉴于这些类型的查询,我应该创建两个单独的单列索引(item_id
和 store_id
),还是一个或多个多列索引?我说更多是因为我知道 SQL 服务器索引中的列是从左到右访问的,因此可能同时存在 <item_id, store_id>
和 <store_id, item_id>
.
如果您是索引新手(见鬼,即使您不是)我只会 运行 对您的常见查询的估计执行计划并创建建议的索引。密切关注磁盘 space 和您的数据 insert/update 性能。
我倾向于对所有新查询执行此操作,运行多次调整执行计划,代码略有变化,以在查询性能和 insert/update 速度之间找到适当的平衡。
结合阅读一些内容,您将很快掌握它并开始考虑优化。
您还需要考虑分片和重建索引。这可以通过 T-SQL 存储过程自动完成,因此您几乎可以设置并忘记它。
以下是一些有用的链接:
https://www.red-gate.com/simple-talk/sql/learn-sql-server/sql-server-index-basics/?article=610