我们得到了93M行的映射表,其中保存了三个表和对应的三个表的映射信息。我们在从映射表访问数据时面临性能问题。
表名 | PK信息 | 行数 |
---|---|---|
卖方 | SellerId 主键 | 3000 行 |
店铺 | StoreId 主键 | 20000 行 |
产品 | ProductId 主键 | 200k 行 |
卖家商店产品映射 | SellerId,ProductId,StoreId 复合非聚集索引。此表中还有一个代理键:SellerStoreProductMappingId,用作集群的主键 | 93M 行 |
我们的查询可以访问以下三种组合中的任何一种:Seller, Product, Store
在 93M 行的表中。
我的实际查询是这样的:
SELECT < many columns from four tables>
FROM SellerStoreProductMapping
INNER JOIN Store
INNER JOIN Seller
INNER JOIN Product ...
WHERE SellerId = 123
但是,正在发生的是非聚集索引:SellerId、ProductId、StoreId 在我们的查询中很少使用,即使我们对 SellerId 进行了过滤。它用于 storeId 的索引扫描。
我们的疑问是,对于这三列组合,
- 我们应该选择单独的非聚集索引(3 个索引)吗?
- 我们应该选择两列非聚集复合索引(4 个索引)吗?
- 我们应该选择三列复合非聚集索引(9 个索引)吗?代替 9,我们将限制在特定的使用场景。?
注意:我们无法创建聚集列存储索引,因为我们将 ROWVERSION 数据类型作为映射表中的数据类型之一。