如何优化查找表?

时间:2013-02-11 18:47:39

标签: tsql sql-server-2008-r2 left-join lookup-tables

我正在使用SSMS 2008 R2开发TSQL查询,我想优化当前使用许多左连接的此sproc。有一个包含一行/查找值的查找表。所以我的TSQL代码如下所示:

Table A = main record table
Table B = Lookup Table
  row1 x unique_identifier, y varchar(100)
  row2 x unique_identifier, y varchar(100)
  row3 x unique_identifier, y varchar(100)
  row4 x unique_identifier, y varchar(100)

因此,此查找表中的每一行都有两个值:一个unique_identifier,另一个值是varchar。所以目前我的代码如下:

select *
FROM A
LEFT JOIN B ON B.X = A.X WHERE B.X = 123456
LEFT JOIN B2 ON B2.X = A.X WHERE B2.X = 123457
LEFT JOIN B3 ON B3.X = A.X WHERE B3.X = 123458
LEFT JOIN B4 ON B4.X = A.X WHERE B4.X = 123459
LEFT JOIN B5 ON B5.X = A.X WHERE B5.X = 123451

我确信必须有更有效的方法来做到这一点。而我真正的sproc代码实际上连接了这个查找表30次而不是5次。我也试过使用临时表,但似乎也没有优化它。有关如何更换所有LEFT JOIN的任何建议吗?

好的,我现在正在更新这个问题。这是我的确切查询:

SELECT DISTINCT 
    lut.[description] as UDT_Injuries,  
    lut2.[description] as abduction, 
    lut3.[description] as ARREST_PARENT
FROM evolv_cs.dbo.incident_header_x x with (nolock)
LEFT JOIN user_defined_lut_rv lut on lut.user_defined_lut_id = x.UDT_Injuries
LEFT JOIN user_defined_lut_rv lut2 on lut2.user_defined_lut_id = x.ABDUCTION
LEFT JOIN user_defined_lut_rv lut3 on lut3.user_defined_lut_id = x.ARREST_PARENT
WHERE lut.[description] IS NOT NULL OR lut2.[description] IS NOT NULL OR lut3.[description] IS NOT NULL 

以及此查询的前10行输出:

UDT_Injuries    abduction   ARREST_PARENT
NULL    NULL    Outside of facility
Client  NULL    NULL
Client  NULL    Outside of facility
None    NULL    NULL
None    NULL    Outside of facility
Other adult NULL    NULL
Other adult NULL    Outside of facility
Parent  NULL    NULL
Peer    NULL    NULL
Sibling NULL    NULL

仅供参考,我查看有关PIVOT和UNPIVOT的文章,但我不想汇总任何数据。相反,我想将来自incident_header_x的关键id值转换为user_defined_lut_rv中的varchar值。

来自incident_header_x的示例数据如下所示:

UDT_Injuries    ABDUCTION   ARREST_PARENT
5B84773B-99BF-4EB9-8545-EFC06A35FE29    NULL    NULL
NULL    4F18EDE9-BBBA-4430-9EF4-4E28EAC1E6D4    NULL
5B84773B-99BF-4EB9-8545-EFC06A35FE29    NULL    NULL
NULL    NULL    4F18EDE9-BBBA-4430-9EF4-4E28EAC1E6D4
NULL    NULL    5B84773B-99BF-4EB9-8545-EFC06A35FE29

现在我想要实现的目标是否有意义?要将这些id值从user_defined_lut_rv查找表转换为varchar值吗?

2 个答案:

答案 0 :(得分:1)

由于连接条件始终相同,您似乎正在寻找一个支点:http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

如果这不是您想要的,请提供更多详细信息。示例数据和预期结果将是一个很好的开始。

答案 1 :(得分:1)

简而言之,不 - 没有更有效或不同的方式来做到这一点。您是否遇到性能问题,或者您发现代码难以处理?

无论如何,您可能希望对“一个真正的查找表”进行一些研究,这看起来类似(不完全相同),以便在此设计中获得一些缺点和优势的想法。