내부 조인 대 위치
(오라클에서) 성능에 차이가 있습니까?
Select * from Table1 T1
Inner Join Table2 T2 On T1.ID = T2.ID
과
Select * from Table1 T1, Table2 T2
Where T1.ID = T2.ID
?
아니! 동일한 실행 계획은 다음 두 테이블을보십시오.
CREATE TABLE table1 (
id INT,
name VARCHAR(20)
);
CREATE TABLE table2 (
id INT,
name VARCHAR(20)
);
내부 조인을 사용하는 쿼리의 실행 계획 :
-- with inner join
EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
WHERE 절을 사용한 쿼리 실행 계획.
-- with where clause
EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
쿼리 최적화 프로그램이 올바르게 작동하는 경우 해당 쿼리간에 차이가 없어야합니다. 동일한 원하는 결과를 지정하는 두 가지 방법 일뿐입니다.
그들은 정확히 같아야합니다. 그러나 코딩 연습으로 조인을 참조하십시오. 그것은 분명히 당신의 의도를 분명히 보여줍니다.
를 사용 JOIN
하면 코드를 쉽게 이해할 수 있으므로 코드를보다 쉽게 읽을 수 있습니다.
속도에는 차이가 없으며 ( 방금 테스트했습니다 ) 실행 계획은 동일합니다.
Oracle에 대해서는 모르지만 이전 구문은 SQL Server에서 더 이상 사용되지 않으며 결국 사라질 것입니다. 새 쿼리에서 이전 구문을 사용하기 전에 Oracle에서 수행하려는 작업을 확인했습니다.
결합 기준을 다른 필요한 위치 조건과 혼합하는 것보다 새로운 구문을 선호합니다. 새로운 구문에서는 조인을 만드는 것과 다른 조건이 적용되는 것이 훨씬 명확합니다. 이와 같은 짧은 쿼리에서 큰 문제는 아니지만 더 복잡한 쿼리가 있으면 훨씬 더 혼란스러워집니다. 사람들이 기본 쿼리에 대해 배우기 때문에 복잡한 쿼리에서 조인 구문을 사용하기 전에 사람들이 조인 구문을 사용하는 것을 선호하는 경향이 있습니다.
그리고 다시 한 번 Oracle을 알지 못하지만 SQL Server 2000에서도 이전 스타일의 왼쪽 조인의 SQL Server 버전에 결함이 있으며 일관성이없는 결과 (때로는 왼쪽 조인이 때때로 교차 조인)를 제공한다는 것을 알고 있습니다. 익숙한. 오라클이 같은 문제를 겪지 않기를 바라지 만, 왼쪽 및 오른쪽 조인은 이전 구문으로 올바르게 표현하기가 더 어려울 수 있습니다.
또한 ANSII 표준 조인을 사용하는 개발자가 조인의 의미와 그 의미가 무엇인지에 대해 더 잘 이해하는 경향이 있다는 것은 내 경험이었습니다 (물론 이것은 개인적으로 개인적인 견해이며 다른 경험이있을 수 있습니다). 데이터베이스에서 데이터. 데이터베이스를 잘 이해하는 대부분의 사람들이 더 복잡한 쿼리를 작성하는 경향이 있기 때문에 이전 스타일보다 ANSII 표준을 사용하는 것이 훨씬 쉬운 것으로 보입니다.
[보너스 포인트 ...]
JOIN 구문을 사용하면 한 줄에 모두 포함 된 조인을보다 쉽게 주석 처리 할 수 있습니다. 이 수 는 복잡한 쿼리를 디버깅하는 경우 유용 할 수
다른 사람들이 말했듯이, 기능적으로 동일하지만 JOIN은 의도에 대한 진술이 더 명확합니다. 따라서 수 는, 어떤 경우에는 현재의 오라클 버전 (나는 그것이 않는 경우 아무 생각이 없음)에서 두 쿼리 최적화를 도와 수 있습니다 오라클 (아무도 어떤 생각이 없다)의 향후 버전에서 쿼리 최적화를 도와, 또는 할 수 있다면 도움이 데이터베이스 공급 업체를 변경합니다.
논리적으로 동일하지만 ANSI 구문을 채택한 이전 버전의 Oracle에서는 종종 더 복잡한 경우에 버그가 있었으므로 사용시 Oracle 개발자의 저항을받을 수 있습니다.
성능은 동일해야하지만 외부 조인의 경우 명확성이 향상되어 조인 버전을 사용하는 것이 좋습니다.
또한 결합 버전을 사용하여 의도하지 않은 데카르트 제품을 피할 수 있습니다.
세 번째 효과는 더 간단한 WHERE 조건으로 SQL을보다 쉽게 읽을 수 있다는 것입니다.
Oracle에서 조인 키 속성의 이름이 두 테이블에서 동일하게 지정되면 다음과 같이 작성할 수도 있습니다.
select *
from Table1 inner join Table2 using (ID);
물론 이것은 동일한 쿼리 계획을 가지고 있습니다.
PostgreSQL에는 분명히 차이가 없습니다. 둘 다 동일한 쿼리 계획과 동일합니다. 나는 이것이 오라클의 경우라고 99 % 확신한다.
테이블이 세 번째 정규 형식 인 시나리오에서는 테이블 간의 조인이 변경되지 않아야합니다. 즉, CUSTOMERS 및 PAYMENTS 가입은 항상 동일해야합니다.
그러나 조인 과 필터를 구분해야합니다 . 조인은 관계에 관한 것이고 필터는 전체 파티션에 관한 것입니다.
SQL-92 구문은 두 개념을 분리하도록 권장하며 더 성가신 WHERE 절에 조인과 필터를 둘 다 사용하는 이전 구문보다 선호됩니다.
기능적으로 그들은 말한 것과 같습니다. 조인을 수행하는 것이 원하는 것을 정확하게 설명하는 것이 더 낫다는 데 동의합니다. 여러 번 조인을 시작할 때까지 어떻게 쿼리하고 싶었는지 알고 내 머리 속의 원래 쿼리와 다른 쿼리를 원한다는 것을 깨달았습니다.
둘 다 같은 일을하는 내부 조인입니다. 하나는 단순히 새로운 ANSI 구문을 사용합니다.
기능적으로 두 쿼리 모두 동일한 방식으로 처리되어야합니다. 그러나 새로운 조인 구문을 사용하는 뷰에서 선택하는 경우이를 사용하여 쿼리를 구성하는 것이 중요하다는 경험이 있습니다. 뷰가 "join"문을 사용하는 경우 Oracle 옵티마이 저는 혼란 스러울 수 있지만 뷰에 액세스하는 쿼리는 "where"절에서 전통적인 조인 방법을 사용합니다.
두 쿼리의 정체성이 명백해 보이지만 때때로 이상한 일이 발생합니다. Oracle 10g에서 Join 술어를 JOIN에서 WHERE로 옮길 때 쿼리마다 실행 계획이 다르지만 (WHERE 계획이 더 좋습니다)이 문제를 단순화 된 테이블과 데이터로 재현 할 수는 없습니다. 내 데이터와 통계에 달려 있다고 생각합니다. 옵티마이 저는 매우 복잡한 모듈이며 때로는 마술처럼 행동합니다.
그렇기 때문에 DB 내부에 의존하기 때문에 일반적 으로이 질문에 대답 할 수 없습니다. 그러나 우리는 답이 ' 차이가 없어야 한다'는 것을 알아야합니다 .
프로덕션에서 sp의 시간 초과 중 하나를 검사 할 때 오늘이 수수께끼를 겪었습니다 .xml 피드에서 빌드 된 테이블의 내부 조인을 대신 'where'절로 변경했습니다. 평균 실행 시간이 2.2 초가되기 전에 ... 실행 계획의 주요 차이점은 주요 조회가 사라지는 것입니다. 두 방법을 사용하여 테스트 할 때까지 알 수없는 메시지입니다.
건배.
둘 다 조인하고 같은 일을하는 곳입니다.
한 번 봐주고 사용이 아닌 곳의 가입 이유에서 MySQL의 쿼리를?
kiewik이 말했듯이 실행 계획은 동일합니다.
JOIN 문은 읽기가 더 쉬워서 ON 조건을 잊어 버리지 않고 직교 곱을 얻는 것이 더 쉽습니다. 이러한 오류는 유형이 여러 개인 조인을 사용하여 긴 쿼리에서 감지하기가 매우 어려울 수 있습니다. SELECT * FROM t1, t2 WHERE t1.id = t2.some_field.
하나의 조인 조건 만 잊어 버리면 너무 많은 레코드를 반환하는 쿼리를 실행하는 데 시간이 오래 걸립니다. 일부 사람들은 DISTINCT를 사용하여 쿼리를 패치하지만 여전히 실행 시간이 너무 깁니다.
정확하게 JOIN 문을 사용하는 것이 가장 좋은 방법 인 유지 보수성 및 가독성이 좋은 이유입니다.
더 잘 기억한다면 JOIN은 메모리 사용과 관련하여 최적화됩니다.
참고 URL : https://stackoverflow.com/questions/121631/inner-join-vs-where
'Programing' 카테고리의 다른 글
NTFS의 최대 파일 이름 길이 (Windows XP 및 Windows Vista)? (0) | 2020.04.06 |
---|---|
Xcode 5에 iOS 6 SDK를 설치할 수 있습니까? (0) | 2020.04.06 |
파이썬에서 값을 할당하지 않고 변수를 선언하는 것이 가능합니까? (0) | 2020.04.06 |
Eclipse 템플리트에서 사용되는 $ {user} 변수의 값을 변경하는 방법 (0) | 2020.04.06 |
안드로이드 앱을 개발하기위한 최고의 IDE는 무엇입니까? (0) | 2020.04.06 |