我目前正在使用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
我的问题是......我应该在交易表上创建三个不同的索引
或者如果我在[Division],[SKU]和[StoreCode]字段上创建索引,那么一个索引是否足够?
答案 0 :(得分:4)
对于您的查询,您希望所有表上的索引除 Transactions
外:
Product(Division, SKU)
Location(Division, StoreCode)
CostCenter(StoreCode)
您还可以添加Description
列,具体取决于其类型(或者您可以在索引中包含Description
作为额外的非键列。)
请注意,前两个(至少)是复合索引(多列)。第三个只需要一个列。我建议你改变你的表以使用合成主键,但这完全是另一回事。
Transactions
上的索引不是必需的,因为您正在执行没有过滤器的LEFT JOIN
。因此,无论如何,您需要阅读整个表格。性能的关键是从其他表中获取值。
我应该注意,对具有15亿行的表的这种通用查询不太可能有用。如果你有一个where
子句,那么你可能想要某种过滤器。此外,在设计良好的数据库中,我不明白为什么LEFT JOIN
是必要的。这些维度上的值都应该正确填充。