Tsql 基于查找连接两个不同的表

Tsql 基于查找连接两个不同的表,tsql,lookup,Tsql,Lookup,我们有50多个数据字段和多个特定国家/地区的产品代码的大型(2M+行)产品数据表。我希望能够高效地从ProductData连接到基于不同代码字段的不同查找表。我们目前使用单独但非常相似的SP来实现逻辑,这会在它们更改时导致版本问题。SP本身通常有200-500行实现复杂逻辑,95%的逻辑是通用的,但大多数连接语句都是特定于国家的 伪SQL的简化版本如下所示 ProductTable Schema Id, Data1, Data2, .... , ProductCodeUK, ProductCod

我们有50多个数据字段和多个特定国家/地区的产品代码的大型(2M+行)产品数据表。我希望能够高效地从ProductData连接到基于不同代码字段的不同查找表。我们目前使用单独但非常相似的SP来实现逻辑,这会在它们更改时导致版本问题。SP本身通常有200-500行实现复杂逻辑,95%的逻辑是通用的,但大多数连接语句都是特定于国家的

伪SQL的简化版本如下所示

ProductTable Schema
Id, Data1, Data2, .... , ProductCodeUK, ProductCodeUSA, ProductJapan

SP1_USA
select Id, Data, Data, LookupUSA.Price As Price from ProductTable 
join LookupUSA on ProductTable.ProductCodeUSA = LookupUSA.Code


SP2_UK
select Id, Data, Data, LookupUK.Price As Price from ProductTable
join LookupUK on ProductTable.CodeVersion2 = LookupUK.ProductCodeUK

请注意,代码值经常在不同的国家/地区之间重复,因此我们无法轻松地将查找表合并在一起。

您的问题是您的模式设计糟糕。您需要对此进行规范化:

ProductCodeUK, ProductCodeUSA, ProductCodeJapan, ProductCodeGermany, ...
您应该将此数据移动到包含三列的新表中,其中一列是返回原始表的外键:

Product CountryCode ProductCode 
您的查找表应该如下所示:

CountryCode ProductCode Price ....

使用这种新设计,连接总是相同的。要选择不同的国家,您现在只需要修改WHERE子句中的一个参数。

您的问题是您的模式设计得很糟糕。您需要对此进行规范化:

ProductCodeUK, ProductCodeUSA, ProductCodeJapan, ProductCodeGermany, ...
您应该将此数据移动到包含三列的新表中,其中一列是返回原始表的外键:

Product CountryCode ProductCode 
您的查找表应该如下所示:

CountryCode ProductCode Price ....

使用这种新设计,连接总是相同的。要选择不同的国家,您现在只需要修改WHERE子句中的一个参数。

当我们尝试这种方法时,我们获得了巨大的性能冲击,因此使用了现在的模式。由于查找表有不同的列,所以这个问题被排除在外,我们当然也可以对这些列进行规范化处理,但在某些情况下,我们会跨4个表进行连接instances@MrTelly:我怀疑您看到的“性能损失”要么是由于编写的查询效率低下,要么是因为缺少索引。选中“解释”并调整查询和/或索引,直到性能得到改善。至于查找表中的差异,这是一个需要解决的棘手问题。如果不了解这些表格的具体情况,我就无法对此做出评论。除了更改模式之外,我唯一能想到的另一件事是使用视图来封装重复的逻辑-但它似乎对您在示例中提供的查询没有帮助。当我们尝试这种方法时,我们获得了巨大的性能冲击,因此使用了现在的模式。由于查找表有不同的列,所以这个问题被排除在外,我们当然也可以对这些列进行规范化处理,但在某些情况下,我们会跨4个表进行连接instances@MrTelly:我怀疑您看到的“性能损失”要么是由于编写的查询效率低下,要么是因为缺少索引。选中“解释”并调整查询和/或索引,直到性能得到改善。至于查找表中的差异,这是一个需要解决的棘手问题。如果不了解这些表格的具体情况,我就无法对此做出评论。除了更改模式之外,我唯一能想到的另一件事是使用视图来封装重复的逻辑——但它似乎对您在示例中提供的查询没有帮助。