SQL Server:多对多连接的最佳索引策略

Posted

技术标签:

【中文标题】SQL Server:多对多连接的最佳索引策略【英文标题】:SQL Server: optimal indexing strategies for many-to-many join 【发布时间】:2017-10-19 21:32:03 【问题描述】:

假设我有两个表,itemsstores,主键分别为 item_idstore_id。由于这里存在多对多关系,因此我还有一个中间表items_stores,其中包含item_idstore_id 列。因此,我可以执行两种主要类型的查询:(A) 查找商店中的所有商品,以及 (B) 查找拥有商品的所有商店。

到目前为止,一切都很好。现在我想在items_stores 上放置一个或多个索引来加快我的查询速度。考虑到这些类型的查询,我应该创建两个单独的单列索引(item_idstore_id),还是创建一个或多个多列索引?我说的更多是因为我知道 SQL 服务器索引中的列是从左到右访问的,因此可能同时存在 <item_id, store_id><store_id, item_id>

【问题讨论】:

我可以给你一条鱼,但你应该学会钓鱼。检查这个:mysql 索引TIPS 您认为您的任何查询比其他查询更常用吗?或者关于所需性能改进的重要性顺序?通常在这些情况下,我选择 (A,B) + (B) 或 (B,A) + (A) 但这完全取决于你的感受 @JuanCarlosOropeza 该链接适用于 MySQL,此问题已标记为 Sql-Server。 本质上,这完全取决于数据的样子以及您将要运行的查询。例如... store_id, item_id 组合是否唯一(例如,每个商店只能有一个 item_id)或者该表中是否有其他一些唯一组合? store_id 是否比 item_id 更具选择性?您是否会运行更多查询以查找商店中有哪些商品或哪些商店有商品(或两者大致相同)? @SqlZim 索引技术几乎相同。 【参考方案1】:

如果您不熟悉索引(即使您不是),我只会对您的常见查询运行估计的执行计划并创建建议的索引。密切关注磁盘空间和数据插入/更新性能。

我倾向于对所有新查询执行此操作,多次运行执行计划并稍作代码变化,以在查询性能和插入/更新速度之间找到适当的平衡。

加上一点阅读,你会很快掌握它并开始考虑优化。

您还需要考虑碎片和重建索引。这可以通过 T-SQL 存储过程自动完成,因此您几乎可以设置并忘记它。

这里有一些有用的链接:

https://www.red-gate.com/simple-talk/sql/learn-sql-server/sql-server-index-basics/?article=610

https://www.red-gate.com/simple-talk/sql/performance/14-sql-server-indexing-questions-you-were-too-shy-to-ask/

https://docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes#TsqlProcedureFrag

【讨论】:

以上是关于SQL Server:多对多连接的最佳索引策略的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Analysis Services 中的多对多关系;第二个多对多关系不起作用

如何正确索引 MySQL 中多对多连接的链接表?

SQL 多连接多对多

有趣的多对多sql连接

将SQL查询转换为具有多对多关系的Rails查询,最佳实践是什么?

存在匹配时排除不匹配行的 SQL 多对多连接