2010-04-16 4 views
8
SELECT * FROM TableA 
INNER JOIN TableB 
ON TableA.name = TableB.name 

SELECT * FROM TableA, TableB 
where TableA.name = TableB.name 

선호되는 방법은 무엇이며 그 이유는 무엇입니까? JOIN과 같은 키워드를 사용할 때 성능 차이가 발생합니까?INNER JOIN 키워드 | 사용 여부에 관계없이

감사

답변

11

두 번째 방법은 join 키워드가 존재하기 전부터 고전적인 방법입니다.

일반적으로 쿼리 프로세서는 두 쿼리에서 동일한 데이터베이스 작업을 생성하므로 성능에 차이가 없습니다.

join을 사용하면 쿼리에서 수행중인 작업이 더 잘 설명됩니다. 많은 조인이있는 경우 조인 된 테이블과 조건이 서로 가깝기 때문에 한 테이블에 모든 테이블을 넣고 다른 테이블에 모든 조건을 넣는 것이 더 좋습니다.

또 다른면은 실수로 두 번째 방법을 사용하여 무제한 결합을 수행하는 것이 더 쉬워서 두 테이블의 모든 조합을 포함하는 교차 조인이되는 것입니다.

+0

동의 함, 첫 번째는 명확성과 제어면에서 더 좋습니다. 원하는 경우 조인 유형을 변경하는 것이 더 쉽습니다. –

1

테이블에, 키에, 쿼리 최적화에, 그것을 사용하는 엔진에 따라 EXPLAIN SELECT …

를 사용하여 찾을; 그대로 거의 모든에

3

는 첫 번째를 사용

  • 더 명시 적
  • 는 표준 방식으로 성능에 관해서는

인가 -에 차이점이 없습니다.

+2

또한 필터 조건 (WHERE 절에있는)에서 조인 조건 (ON 절에 있음)을 구분할 수 있습니다. –

0

대부분의 현재 데이터베이스는 정확히 동일한 실행 계획으로 두 쿼리를 모두 최적화합니다. 그러나 첫 번째 구문을 사용하면 현재 표준입니다. 이 조인 구문을 배우고 사용하면 LEFT OUTER JOINRIGHT OUTER JOIN을 사용하여 쿼리를 수행 할 때 도움이됩니다. WHERE 절의 조인과 함께 이전 구문을 사용하면 문제가 발생하기 쉽습니다.

+0

제대로 정규화 된 데이터베이스에서 오른쪽 조인이 거의 사용되지 않아야한다는 사실을 알았습니다. 비정규 화 된 데이터베이스에서는 항상 그렇지만은 않습니다. 나는 이것을 정규화/구조를 리팩터링 할 필요성의 한 척도로 사용한다. –

+0

@ 마크 Schultheiss,이 질문을 참조하십시오 : http://stackoverflow.com/questions/689963/does-anyone-use-right-outer-joins –

+0

정확히, 그냥 테이블 시퀀스를 변경하면 종종 오른쪽 조인을 왼쪽 조인, 내 경험에 비추어 볼 때 유지 보수주기가 더 쉬울 것입니다. 특히 중학교 개발자의 경우 –

1

일부 SQL 엔진에서는 두 번째 형식 (결합 조인)이 제거됩니다. 첫 번째 양식을 사용하십시오.

두 번째는 덜 명확하므로 코드를 작성할 때 초보자가 SQL을 일시 중지합니다. 복잡한 SQL에서는 WHERE 절 순서와 일치하는 조인 일치 요구 사항의 순서로 인해 관리하기가 훨씬 더 어렵습니다. 즉 (코드에서 스퀘어) 일치해야하거나 반환 된 결과가 변경되어 반환 된 데이터 집합이 실제로 변경됩니다 동일한 레벨의 요소가 고려 될 때 시퀀스가 ​​결과를 변경해서는 안된다고 생각합니다.

여러 테이블을 포함하는 조인을 만들면 두 번째 형식을 사용하여 코드를 작성하는 것이 매우 어렵습니다.

EDIT : 성능 : 개인 성능의 일부를 쉽게 디버깅 할 수 있으므로 편집/디버그/유지 관리가 쉬우므로 첫 번째 형식을 사용하면 성능이 향상됩니다. 유지 보수주기.

+1

분명히 밝혀 지겠지만 양형 형식은 테이블에서 ANSI 표준 쉼표가 아닌 LEFT 및 RIGHT 형식의 '* ='및 '= *'형식입니다. .. 그 부분에 의해 혼란을 추가하면 죄송합니다 :) –

0

WHERE만을 사용하는 필터링 조인은 일부 일반적인 시나리오에서 매우 비효율적 일 수 있습니다.예를 들어 :

SELECT * FROM people p, companies c WHERE p.companyID = c.id AND p.firstName = 'Daniel' 

대부분의 데이터베이스는 먼저 사람과 회사 테이블의 직교 제품을 복용 한 후 일치하는 회사 ID와 ID 필드를 가지고있는 사람들에 의해 필터링, 말 그대로이 쿼리를 실행합니다. 완전히 제약되지 않은 제품은 메모리가 아닌 어디에도 존재하지 않지만 잠시 동안 만 존재하지만 계산에는 다소 시간이 걸립니다.

더 나은 접근법은 관련성이있는 경우 JOIN으로 제약 조건을 그룹화하는 것입니다. 이것은 주관적으로 읽기가 쉬울뿐만 아니라 훨씬 더 효율적입니다. thusly 히 :

SELECT * FROM people p JOIN companies c ON p.companyID = c.id 
    WHERE p.firstName = 'Daniel' 

그것은 조금 더, 그러나 데이터베이스가 ON 절을 보면 완전히 구속 오히려 모든 것을 시작하고 아래로 제한하는 것보다, 직접 가입 계산하는 데 사용할 수 있습니다. 이것은 (특히 대용량 데이터 세트 및/또는 여러 테이블 조인을 사용하여) 계산 속도가 빠르고 메모리가 덜 필요합니다.

"쉼표 JOIN"구문을 사용하는 모든 쿼리가 변경됩니다. 제 생각에는 그 존재를위한 유일한 목적은 간결성입니다. 성능에 미치는 영향을 고려해 볼 때 이것이 필연적 인 이유라고 생각하지 않습니다.

관련 문제