2012-02-25 3 views
0

한 행의 표를 만들지 만 동일한 행이없는 데카르트 곱을 수행해야합니다. 지금 가지고 있습니다 :데카르트 곱을 최적화하는 방법

select * 
From T_Car C1 
Join T_Car C2 On C1.CarID <> C2.CarID 

그러나 1300 개의 행이있는 T_Car 테이블의 경우 거의 2 분이 걸립니다. OPTION (HASH JOIN) 및 OPTION (MERGE JOIN)을 사용하려고 시도했지만 오류가 발생했습니다.

이 쿼리에 정의 된 힌트로 인해 쿼리 프로세서에서 쿼리 계획을 생성 할 수 없습니다. 힌트를 지정하지 않고 SET FORCEPLAN을 사용하지 않고 조회를 다시 제출하십시오.

이 쿼리를 최적화 할 수 있습니까?

+3

반환 할 결과가 얼마나 괴롭히는 지 알고 계십니까? (내가 잘못하지 않는다면 행 수가 169 만개가된다.) 확실한 최적화는 다음과 같다. – delnan

+0

@delnan, where 절이 있는데, 나는 그것이 단지 1,687,400 일 것이라고 믿습니다 :-). 왜 카티 전 곱 (Cartesian product)을하고 싶습니까? 아마 당신의 문제에 대한 더 나은 해결책이있을 것입니다. – Ben

+0

@Ben 나는 원래 그것을 설명했다. 그러나 대부분의 반올림 방법으로 결과는 그대로 유지된다.) – delnan

답변

0

모든 행에 참여하지 않으려면 내부 결합 또는 왼쪽 결합을 사용할 수 있습니다. Inner JOIN은 일치하는 행만 반환하고 Left Join은 왼쪽 테이블의 빈 행을 반환합니다. Right Join은 오른쪽 테이블의 빈 행을 반환합니다.

1

이유에 대해 자세히 설명해 주실 수 있습니까? 귀하가 언급 한 쿼리는 일반적인 경험이 아니며 값 비싼 쿼리 계획이 필요합니다. 쿼리의 컨텍스트를보다 잘 이해할 수있게되면 성능이 향상되고 여러 단계를 수행하여 관련 데이터를 검색하는 저장 프로 시저를 쿼리하는 다른 방법을 취할 수 있지만 각각에 대해 효율적인 방식으로 수행합니다 단계.

시나리오를 사용하여 적절한 ID를 임시 테이블로 분리 한 다음 결과를 얻기 위해 '<'대신 '='를 사용하여 조인하는 절차를 만드는 것이 좋습니다.

+0

T_Car 테이블에서 비슷한 행을 찾고 싶다. 그래서 나는 다른 사람들과 한 줄을 비교할 필요가있다. – PsCraft

+0

비슷한 말을 할 때 테이블의 다른 열을 비교하고 싶다고 말한 것 같습니까? 그럴까요? – itayw

+0

@ user927524 "유사"를 정의하십시오 - 다른 사람이 여기에 아무런 의미가 없습니다. –

0

전체 Cartesian 제품을 생산하는 데 걸리는 시간은 1,690,000 행입니까?

상당한 시간이라면 MINUS 연산자를 사용하여 기본 키가 일치하는 행을 제거하는 것을 고려하십시오. 뭔가.

select * From T_Car C1, T_Car C2 
MINUS 
select * From T_Car C1 Join T_Car C2 On C1.CarID = C2.CarID 

전체 데카르트 제품이 생산하는 데 너무 오래 걸릴 수 있습니다. 어쨌든 그런 결과가 필요한 이유는 무엇입니까? 아마도 데이터를 모델링하는 더 좋은 방법이있을 것입니다.

+1

오인되지 않은 경우 SQL Server는 MINUS (오라클 제공) 대신 EXCEPT를 사용합니다. – itayw