programing

명시적 SQL 조인과 암시적 SQL 조인

topblog 2023. 5. 13. 08:41
반응형

명시적 SQL 조인과 암시적 SQL 조인

명시적 내부 결합과 암묵적 내부 결합에 효율성 차이가 있습니까?예:

SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;

대.

SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;

성능 면에서는 동일합니다(최소한 SQL Server에서는 동일).

PS: "암묵적인 것"에 유의하십시오.OUTER JOIN "---" 사용*=또는=*순식간에WHERE 사용 후 --는 2005되지 않습니다.(implicit SQL Server 2005" ("SQL Server 2005).CROSS)JOIN질문에 사용된 쉼표를 사용하는 구문은 여전히 지원됩니다.)

"오래된 스타일" JOIN 구문의 사용 금지: 오직 부분적인 것.

개인적으로 저는 조인 구문을 선호합니다. 테이블이 조인되고 테이블이 조인되는 방식이 명확하기 때문입니다.8개의 서로 다른 테이블에서 선택한 경우 더 큰 SQL 쿼리를 비교해 보십시오. 여기에는 많은 필터링이 있습니다.조인 구문을 사용하면 테이블이 결합된 부분을 행을 필터링하는 부분으로 구분할 수 있습니다.

MySQL 5.1.51에서는 두 쿼리의 실행 계획이 동일합니다.

mysql> explain select * from table1 a inner join table2 b on a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.02 sec)

mysql> explain select * from table1 a, table2 b where a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.00 sec)

table1166208개의 행이 있습니다.table2약 1000개의 행이 있습니다.

이것은 매우 간단한 경우입니다. 이것은 쿼리 최적화 프로그램이 더 복잡한 경우에 혼동되지 않고 다른 계획을 생성하지 않는다는 것을 결코 증명하지 않습니다.

두 번째 구문은 교차 조인의 원하지 않는 가능성이 있습니다. 즉, 해당 WHERE 절 없이 FROM 부분에 테이블을 추가할 수 있습니다.이는 유해한 것으로 간주됩니다.

첫 번째 답변은 ANSI 조인 구문으로 알려진 것을 사용하고, 다른 답변은 유효하며 관계형 데이터베이스에서 작동합니다.

저는 당신이 ANSI 조인 구문을 사용해야 한다는 grom에 동의합니다.그들이 말했듯이, 주된 이유는 명확성 때문입니다.많은 술어가 포함된 where 절을 갖는 대신, 일부는 조인 테이블을, 다른 일부는 ANSI 조인 구문으로 반환되는 행을 제한하는 대신, 테이블 조인에 사용되는 조건과 결과를 제한하는 데 사용되는 조건을 눈이 멀도록 명확하게 합니다.

@lomaxx: 분명히 말씀드리자면, 위의 두 구문이 모두 SQL Server 2005에서 지원된다고 확신합니다.그러나 아래 구문은 지원되지 않습니다.

select a.*, b.*  
from table a, table b  
where a.id *= b.id;

특히 외부 조인(*=)은 지원되지 않습니다.

성능 면에서는 동일하지만(적어도 SQL Server에서는) 이 조인 구문을 사용하지 않으며 SQL server 2005에서는 즉시 지원되지 않습니다.

제 생각에 당신은 더 이상 사용되지 않는 *= 및 =* 연산자와"병렬 결합".

지금까지 주어진 두 가지 형식을 테스트했는데 SQL Server 2008 데이터베이스에서 올바르게 작동합니다.저의 경우, 그들은 동일한 실행 계획을 제시했지만, 저는 이것이 항상 사실이라고 확신할 수 없었습니다.

일부 데이터베이스(특히 Oracle)에서는 조인 순서가 쿼리 성능에 큰 영향을 미칠 수 있습니다(테이블이 두 개 이상인 경우).한 응용 프로그램에서, 우리는 말 그대로 어떤 경우에는 두 가지 정도의 차이가 있었습니다.내부 조인 구문을 사용하면 올바른 힌트 구문을 사용할 경우 이를 제어할 수 있습니다.

사용 중인 데이터베이스를 지정하지는 않았지만 SQL Server 또는 MySQL에서 실질적인 차이가 없을 가능성이 높습니다.

Leigh Caldwell이 말했듯이, 쿼리 최적화 프로그램은 기능적으로 동일한 SQL 문처럼 보이는 것을 기반으로 다양한 쿼리 계획을 생성할 수 있습니다.이에 대한 자세한 내용은 다음 두 개의 블로그 게시물을 참조하십시오.

Oracle Optimizer 팀의 게시물 1건

"구조화된 데이터" 블로그의 다른 게시물

이것이 흥미롭기를 바랍니다.

기본적으로 둘 사이의 차이점은 하나는 옛날 방식으로 쓰여진 반면 다른 하나는 현대식으로 쓰여진다는 것입니다.개인적으로, 저는 내부, 왼쪽, 외부, 오른쪽 정의를 사용하는 현대적인 스크립트를 선호합니다. 왜냐하면 그것들은 더 설명적이고 코드를 더 쉽게 읽을 수 있게 하기 때문입니다.

내부 조인을 다룰 때 가독성에 실질적인 차이는 없지만 기존 방법처럼 왼쪽 조인과 오른쪽 조인을 다룰 때 복잡해질 수 있습니다.

SELECT * 
FROM table a, table b
WHERE a.id = b.id (+);

위의 방법은 왼쪽 조인을 쓰는 기존 방식과 반대입니다.

SELECT * 
FROM table a 
LEFT JOIN table b ON a.id = b.id;

시각적으로 볼 수 있듯이, 스크립트가 작성되는 현대적인 방법은 쿼리를 더 쉽게 읽을 수 있게 합니다.(그런데 오른쪽 조인도 마찬가지이고 바깥쪽 조인도 조금 더 복잡합니다.)

다시 보일러 플레이트로 돌아가서 SQL 컴파일러가 쿼리를 동일한 방식으로 처리할 때 쿼리가 어떻게 작성되는지는 문제가 되지 않습니다.Oracle 데이터베이스에서 두 가지가 혼합되어 있는 것을 보았습니다. Oracle 데이터베이스에는 많은 사람들이 기록되어 있습니다. 나이든 사람들과 젊은 사람들이 모두 기록되어 있습니다.다시 한 번, 스크립트가 얼마나 읽기 쉬운지와 함께 개발 중인 팀으로 요약됩니다.

성능 면에서는 차이가 없어야 합니다.명시적 조인 구문은 from 절에 있는 테이블 간의 관계를 명확하게 정의하고 where 절을 혼란스럽게 하지 않기 때문에 더 깨끗해 보입니다.

제 경험에 따르면, 절과 교차 결합 구문을 사용하면 특히 Microsoft SQL 제품을 사용하는 경우 뇌 손상 실행 계획이 생성되는 경우가 많습니다.예를 들어 SQL Server가 테이블 행 수를 추정하는 방식은 매우 끔찍합니다.내부 조인 구문을 사용하면 쿼리가 실행되는 방법을 제어할 수 있습니다.따라서 실용적인 관점에서 볼 때, 현재 데이터베이스 기술의 파괴적인 특성을 고려할 때, 당신은 내부 결합에 따라야 합니다.

언급URL : https://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins

반응형