当我将三个其他表连接到同一个表时,我应该在同一个表上使用多个索引

时间:2016-04-06 11:54:44

标签: sql sql-server join indexing

我目前正在使用SQL Server 2014,我必须将三个表连接到另一个表。

包含15亿条记录的交易表
包含150万条记录的产品表
包含1万条记录的位置表
成本中心表包含5000条记录
SELECT [Transaction].* ,[Product].[Product_Description] ,[Location].[Location_Description] ,[Cost Centre].[Cost_Centre_Description] INTO [Transaction_Master] FROM Transaction LEFT JOIN [Product] on [Transaction].[Division] = [Product].[Division] AND [Transaction].[SKU] = [Product].[SKU] LEFT JOIN [Location] on [Transaction].[Division] = [Product].[Division] AND [Transaction].[StoreCode] = [Product].[StoreCode] LEFT JOIN [Cost Centre] on [Transaction].[StoreCode] = [Cost Centre].[StoreCode] GO

我的问题是......我应该在交易表上创建三个不同的索引

  1. 在[Division],[SKU]字段上加入产品表
  2. 在[Division],[StoreCode]字段上加入位置表
  3. 在[StoreCode]字段上
  4. 以加入成本中心表
  5. 或者如果我在[Division],[SKU]和[StoreCode]字段上创建索引,那么一个索引是否足够?

1 个答案:

答案 0 :(得分:4)

对于您的查询,您希望所有表上的索引除 Transactions外:

  • Product(Division, SKU)
  • Location(Division, StoreCode)
  • CostCenter(StoreCode)

您还可以添加Description列,具体取决于其类型(或者您可以在索引中包含Description作为额外的非键列。)

请注意,前两个(至少)是复合索引(多列)。第三个只需要一个列。我建议你改变你的表以使用合成主键,但这完全是另一回事。

Transactions上的索引不是必需的,因为您正在执行没有过滤器的LEFT JOIN。因此,无论如何,您需要阅读整个表格。性能的关键是从其他表中获取值。

我应该注意,对具有15亿行的表的这种通用查询不太可能有用。如果你有一个where子句,那么你可能想要某种过滤器。此外,在设计良好的数据库中,我不明白为什么LEFT JOIN是必要的。这些维度上的值都应该正确填充。