itsource

내부 결합 vs 장소

mycopycode 2023. 2. 26. 09:44
반응형

내부 결합 vs 장소

(오라클의) 퍼포먼스에 차이가 있습니까?

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

쿼리 옵티마이저가 올바르게 기능하고 있는 경우 이들 쿼리 간에 차이가 없습니다.이것들은, 같은 목적의 결과를 특정하기 위한 2개의 방법에 지나지 않습니다.

정확히 일치해야 합니다.그러나 코딩 연습으로서는 Join을 보고 싶습니다.당신의 의도를 명확하게 표현하고 있어요

「」를 사용합니다.JOIN코드를 읽기 쉽게 만들죠. 자기 조절이 가능하기 때문이죠.

속도에는 차이가 없고(시험한 지 얼마 안 됨), 실행 계획도 동일합니다.

[보너스 포인트로...]

JOIN 구문을 사용하면 Join이 한 줄에 모두 포함되므로 보다 쉽게 코멘트를 추가할 수 있습니다.는 복잡한 쿼리를 디버깅할 때 유용합니다.

다른 모든 사람이 말하는 것처럼 기능적으로는 동일하지만 JOIN이 더 명확한 의사표시를 합니다.따라서 특정 경우 현재 Oracle 버전에서 쿼리 최적화에 도움이 될 수 있습니다(잘 모르겠습니다). 향후 Oracle 버전에서 쿼리 최적화에 도움이 될 수 있습니다(아무도 아이디어가 없습니다). 또는 데이터베이스 공급업체를 변경할 경우 도움이 될 수 있습니다.

Oracle에 대해서는 잘 모르지만 SQL Server에서 이전 구문이 사용되지 않으며 결국 사라집니다.새 쿼리에서 이전 구문을 사용하기 전에 Oracle이 이 구문을 사용하여 무엇을 할 계획인지 확인합니다.

필요한 다른 조건과 결합 기준을 혼합하는 것보다 새로운 구문을 선호합니다.새로운 구문에서는 조인을 작성하는 항목과 적용되는 다른 조건이 훨씬 명확합니다.이와 같은 짧은 쿼리에는 큰 문제가 없지만 더 복잡한 쿼리가 있을 경우 훨씬 더 혼란스러워집니다.기본 쿼리에 대해 학습하기 때문에 복잡한 쿼리에 필요하기 전에 조인 구문을 사용하는 방법을 익히는 것이 좋습니다.

다시 한 번 말씀드리지만 Oracle에 대해서는 구체적으로 알 수 없지만 SQL Server 2000에서도 이전 스타일의 왼쪽 조인 버전이 결함이 있고 일관성 없는 결과(때로는 왼쪽 조인, 때로는 크로스 조인)를 제공하므로 절대 사용하지 마십시오.Oracle에서도 같은 문제가 발생하지 않기를 바라지만, 확실히 왼쪽과 오른쪽 조인은 이전 구문에서 적절하게 표현하기 어려울 수 있습니다.

또한 ANSII 표준 조인을 사용하는 개발자는 조인(join)이 무엇인지, 데이터베이스에서 데이터를 꺼내는 것이 어떤 의미인지를 더 잘 이해하는 경향이 있습니다(물론 개인 의견이지만 다른 경험일 수도 있습니다).데이터베이스 이해도가 좋은 대부분의 사람들이 더 복잡한 질문을 쓰는 경향이 있고, 그것들은 예전 스타일보다 훨씬 더 쉽게 ANSII 표준을 사용할 수 있다고 생각하기 때문이라고 생각합니다.

논리적으로는 동일하지만 ANSI 구문을 채택한 이전 버전의 Oracle에서는 더 복잡한 경우에 버그가 발생하는 경우가 많기 때문에 Oracle 개발자의 거부감을 느낄 수 있습니다.

성능은 동일해야 하지만, 외부 조인의 경우 선명도가 향상되었기 때문에 조인 버전을 사용하는 것이 좋습니다.

또한 결합 버전을 사용하여 의도하지 않은 데카르트 곱을 피할 수 있습니다.

세 번째 효과는 SQL을 읽기 쉽고 WHERE 조건도 단순하다는 것입니다.

Oracle에서는 Join 키 속성의 이름이 두 테이블에서 동일한 경우 다음과 같이 작성할 수도 있습니다.

select *
from Table1 inner join Table2 using (ID);

물론 이것 역시 같은 질의 계획을 가지고 있습니다.

테이블이 세 번째 정규 형식인 시나리오에서는 테이블 간의 결합은 변경되지 않습니다.즉, 고객 참여와 지불은 항상 동일하게 유지되어야 합니다.

단, 조인과 필터구별해야 합니다.결합은 관계에 관한 것이고 필터는 전체를 분할하는 것입니다.

표준을 언급하는 일부 저자(예: Jim Melton; Alan R).사이먼(1993)새로운 SQL의 개요: 완전한 가이드.모건 카우프만, 페이지 11~12ISBN 978-1-55860-245-8)에서는 FROM 절에 쉼표로 구분된 테이블보다 JOIN 구문을 채택할 경우의 이점에 대해 기술하고 있습니다.

나는 이 관점에 전적으로 동의한다.

SQL을 작성하고 동일한 결과를 얻는 방법은 여러 가지가 있지만 팀워크를 수행하는 대부분의 사용자에게 소스 코드 판독성은 중요한 측면이며, 테이블이 특정 필터와 어떻게 관련되어 있는지를 구분하는 것은 확실히 소스 코드를 명확히 하는 데 큰 비약이었습니다.

포스트그레SQL은 전혀 차이가 없습니다.두 가지 모두 동일한 쿼리 계획에 해당합니다.Oracle도 마찬가지라고 99% 확신하고 있습니다.

둘 다 동일한 작업을 수행하는 내부 조인입니다. 하나는 단순히 새로운 ANSI 구문을 사용합니다.

기능적으로 그들은 말한 것과 같다.하지만 참여를 하는 것이 당신이 하고 싶은 일을 정확하게 표현하기 위해 더 낫다는 것에 동의합니다.조인을 시작하고 머릿속으로 처음과 다른 질문을 하고 싶다는 것을 깨닫기 전까지 저는 제가 어떤 질문을 어떻게 하고 싶은지 잘 알고 있다고 여러 번 생각했습니다.

기능적으로는 두 쿼리가 동일한 방식으로 처리되어야 합니다.단, 새로운 join 구문을 사용하는 뷰에서 선택하는 경우에는 이를 사용하여 쿼리를 구성하는 것도 중요합니다.보기에서 "join" 문을 사용하는 경우 Oracle의 최적화 도구에서 혼동할 수 있지만 보기에 액세스하는 쿼리는 "where" 절에 가입하는 기존 방법을 사용합니다.

두 개의 쿼리의 정체가 분명해 보이지만 가끔 이상한 일이 발생합니다.Oracle 10g에서 JOIN에서 WHERE로 Join 술어를 이동할 때 실행 계획이 다른 쿼리(WHERE 플랜이 더 좋음)가 있는데, 이 문제를 단순화된 테이블과 데이터로 재현할 수 없습니다.제 데이터와 통계에 따라 다르다고 생각합니다.Optimizer는 매우 복잡한 모듈이며 때로는 마법처럼 동작합니다.

DB 내부 사정에 따라 달라지기 때문에 일반적으로 답변할 수 없습니다.그러나 우리는 그 대답이 '이질성 없음'이어야 한다는 것을 알아야 한다.

오늘 sp의 타임아웃을 조사했을 때 이 난제를 겪었습니다.xml 피드에서 작성된 테이블의 내부 조인을 대신 'where' 절로 변경했습니다.현재 평균 실행 시간은 1000회 실행 중 80ms인데 반해, 이전 평균 실행 시간은 2.2초였습니다.실행 계획의 주요 차이점은 키 검색의 소실입니다.이 메시지는 두 가지 방법을 모두 사용하여 테스트해야 알 수 있습니다.

건배.

둘 다 같은 역할을 하고 있습니다.

MySQL에서 쿼리를 살펴보십시오. 어디서가 아니라join을 사용합니까?

Kiewik의 말처럼 실행 계획은 동일합니다.

JOIN 문장은 읽기 쉬울 뿐이므로 ON 조건을 잊지 않고 데카르트 곱을 얻을 수 있습니다.이러한 오류는 SELECT * FROM t1, t2 WHERE t1.id=t2.some_field 유형의 여러 조인을 사용하는 긴 쿼리에서 검출하기가 매우 어려울 수 있습니다.

가입 조건을 하나만 잊어버린 경우 너무 많은 레코드를 반환하는 쿼리를 실행하는 데 시간이 오래 걸립니다.너무 많아요.일부 Poeple은 DISTINT를 사용하여 쿼리를 패치하지만 실행에는 아직 시간이 많이 걸립니다.

그렇기 때문에 JOIN 스테이트먼트를 사용하는 것이 확실히 베스트 프랙티스입니다.유지보수성과 가독성이 향상됩니다.

또한 JOIN은 메모리 사용량에 최적화되어 있는 것으로 기억합니다.

그 좋은 답변에 덧붙일 것이 있습니다.

이것이 각각 SQL92와 SQL89로 정의되어 있는 것입니다.단, INSER라는 단어를 생략할 수 있지만 성능 차이는 없습니다(JOIN만 사용하는 것은 충분히 명확합니다.가장 간단한 쿼리에서 5개의 키보드 스트로크를 저장할 수 있는 것은 큰 글자에 몇 개의 스트로크가 있는지 상상해 보십시오).

언급URL : https://stackoverflow.com/questions/121631/inner-join-vs-where

반응형