SQL Azure 联合和索引 - 性能说明

Posted

技术标签:

【中文标题】SQL Azure 联合和索引 - 性能说明【英文标题】:SQL Azure Federations and Indexes - Clarification on Performance 【发布时间】:2013-12-04 16:39:43 【问题描述】:

我们目前有一个 SQL 联合数据库,将数据分成大致相等的 10 个分片,并按客户端 ID 过滤。

目前,我们在执行过滤查询时遇到性能问题,例如,为特定客户端运行查询可能需要 3 分钟以上才能在某些分片中返回 4000 行。但是,在同一分片上的未过滤连接中运行完全相同的查询会在 4 秒内及时返回。一个值得注意的方面是,经历减速的分片往往包含更多的客户端,尽管数据更少。最可能的性能抑制因素(我相信)是索引以及与过滤/未过滤连接相关的东西。

通过搜索,我没有找到太多关于跨分片查询性能/分片特定索引策略的信息(除了 Azure 显然不支持索引视图)。我的印象(因此需要澄清)是索引应用于分片的所有成员,而不是逐个成员。

如果是前者,那么我们就有点麻烦了,除了重新分片这个没有意义的特定分片,考虑到唯一的区别是客户端的数量,而不是数据的大小。我们将要尝试的几件事是将过滤器显式添加到索引中,甚至将过滤器添加到每个查询中。可以肯定地说,我们不乐意摆脱过滤连接。

有没有其他人遇到过这个问题,或者可能提供一些指导,表明未过滤的连接明显优于过滤的连接?

提前谢谢...

【问题讨论】:

很想知道,你发现了什么,我猜我可能会在某个时候遇到同样的问题,现在一切都很好地为我工作,只有几个客户在 Shard :) 能否提供样例查询?您是否在使用 SELECT * FROM TableName 请看我过去的回答:***.com/questions/17998196/… 【参考方案1】:

联合中的索引按联合成员逐个应用。如果您从单个索引成员开始并执行了 SPLIT 操作,则索引会自动应用于 SPLIT 的产品。但如果在创建多个成员后应用了索引,则需要显式地为每个成员添加索引。

所以希望你没有陷入困境。

由于 4 月宣布的新 SKU 不支持该功能,因此您可能需要考虑未来的联合替代方案。

【讨论】:

以上是关于SQL Azure 联合和索引 - 性能说明的主要内容,如果未能解决你的问题,请参考以下文章

性能测试四十二:sql案例之联合索引最左前缀

性能测试四十二:sql案例之联合索引最左前缀

Azure SQL、聚集列存储索引、“TOP”性能

MySQL联合索引

回表查询的说明

explain结果字段说明