2013-02-11 4 views
-1

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 코드가 보인다. 그리고 내 진짜 sproc 코드는 실제로이 조회 테이블을 5 번이 아니라 30 번 결합합니다. 나는 또한 임시 테이블을 사용하여 시도했지만 그 중 하나를 최적화하는 것하지 않았다. LEFT JOIN을 모두 교체하는 방법에 대한 권장 사항은 무엇입니까?

좋습니다. 이제이 질문을 업데이트하고 있습니다. 내가 PIVOT 및 UNPIVOT에 기사를 쳐다 보면서, 참고

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 

,하지만 난 집계하지 않으 :

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 행 :이 내 정확한 쿼리입니다 모든 데이터. 대신 나는 incident_header_x의 키 id 값을 user_defined_lut_rv의 varchar 값으로 변환하려고합니다.

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 

내가 달성하기 위해 노력하고 지금의이 메이크업 감각을 수행 incident_header_x에서

샘플 데이터는 같다? 이 id 값을 user_defined_lut_rv 조회 테이블에서 varchar 값으로 변환 하시겠습니까?

+0

당신이 묻는 것을 식별하기가 어렵습니다. 문제가 있습니까? 30 개의 행을 가진 1 개의 조회 테이블 또는 1 개의 행을 가진 30 개의 조회 테이블이 있습니까? 코드가 합법적 인 구문처럼 보이지 않습니다. '123456이 고유 식별자가 아니더라도 B.X = A.X WHERE B.X = 123456'에서'선택 * 왼쪽 결합 B를 선택하면 무엇이 잘못됩니까? –

+0

그냥 왜 값 (123456)에 5 조인을하고 있습니까? – Paparazzi

+0

그래, 위의 TSQL 코드가 수정되었습니다. 제발 자세하게 길을 잃지 마십시오. 요점은 내가 가입 할 하나의 조회 테이블이 있다는 것입니다. varchar 값을 기본 테이블 A에 포함시키는보다 효율적인 방법이 필요합니다. 어떻게해야합니까? 내가 CTE 또는 다른 논리를 사용할 수있는 것처럼? 그리고 예, "123456"은 하나의 고유 식별자입니다. 그래서 현재에는 거기에 합쳐지는 30 개의 다른 uniqueidentifier 값이 있습니다. – salvationishere

답변

1

간단히 말해, 더 효율적이지 않거나 다른 방법이 없습니다. 성능 문제가 있습니까? 아니면 코드를 다루기가 어렵습니다.

어쨌든이 디자인에서 단점과 장점에 대한 아이디어를 얻으려면 이와 유사한 (동일하지는 않음) '진정한 조회 테이블'에 대한 조사를 수행하는 것이 좋습니다.

+0

감사합니다. 나는 더 효율적인 방법이 있기를 바라고 있었지만, 나는 그것에 대한 당신의 말을 들었다.어쨌든 고마워. – salvationishere

+0

더 효율적으로 코드를 줄이거 나 기록을 빨리 반환한다는 의미입니까? 당신은 분명히 코드를 적게 만들 수는 없습니다. 당신이 원하는 것을하기 위해 SQL에서 모든 로직을 제공해야합니다. LEFT JOIN 대신 CROSS APPLY를 사용하고 싶다면 비효율적 일 수 있으며 많은 코드를 저장하지 않을 것이라고 생각합니다. 더 나쁜 것은, 누군가가 당신의 코드를 읽었을 때, 당신은 어떤 다른 이유로 CROSS APPLY를 사용했다고 가정하고, 성능상의 문제가 있더라도 그런 식으로 남겨 둘 것입니다. –

1

조인 조건이 항상 동일하기 때문에, 당신이 피벗을 찾고있는 것 같다 : 이것이 당신이 찾고있는 무엇을하지 않으면 http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

이 더 많은 세부 사항을 제공하십시오. 예제 데이터와 예상 결과가 좋은 시작이 될 것입니다.

+0

업데이트 된 질문을 참조 할 수 있습니까? – salvationishere

관련 문제