2013-02-11 60 views
-1

我正在開發使用SSMS 2008 R2的TSQL查詢,我想優化這個存儲過程,目前使用了很多左聯接。有一個包含一個行/查找值的查找表。所以,我的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值?

+0

這是難以辨別你的要求。有問題嗎?你有1行30查找表或30行查找表1行?您的代碼看起來不像法律語法。 「select * FROM A LEFT JOIN B ON B.X = A.X WHERE B.X = 123456'(即使123456不是唯一標識符)有什麼問題? – 2013-02-11 18:57:08

+0

你爲什麼要在值(123456)上做5個連接? – Paparazzi 2013-02-11 18:59:18

+0

好吧,我修復了上面的TSQL代碼。請不要迷失在細節中。主要的一點是我有一個查詢表,我正在加入。我想要一個更有效的方法將varchar值包含到我的主表A中。我該怎麼做?就像我可以使用CTE或其他邏輯?是的,「123456」是唯一標識符。所以目前有30個不同的uniqueidentifier值它加入。 – salvationishere 2013-02-11 19:10:38

回答

1

總之,沒有 - 沒有更多要做到這一點有效的或不同的方式。你是否遇到性能問題,或者你覺得代碼笨拙?

反正你不妨做一些研究「的一個真正的查詢表」,此類似於(不相同),以獲得缺點和優點的一些想法在這個設計中。

+0

好的謝謝。我希望有一種更有效的方法,但我會爲此付諸行動。不管怎麼說,多謝拉。 – salvationishere 2013-02-11 23:18:52

+0

通過更高效的方式,您是指更少的代碼或更快的記錄返回?你絕對不能將它歸結爲更少的代碼 - 你需要提供該SQL中的所有邏輯來做你想做的事。你可以,如果你希望使用CROSS APPLY而不是LEFT JOIN,但它可能效率低下,我認爲你不會節省太多的代碼。更糟糕的是,當有人讀取你的代碼後,他們可能會認爲你使用了CROSS APPLY是因爲其他原因,即使存在性能問題也是如此。 – 2013-02-12 00:33:53