[SQL] 명시 대 암시 SQL 조인
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;
해결법
-
==============================
1.성능 현명, 그들은 정확히 (적어도 SQL Server의) 동일합니다.
성능 현명, 그들은 정확히 (적어도 SQL Server의) 동일합니다.
추신 : SQL 서버부터 사용되지 않습니다 암시 OUTER JOIN 구문을주의하십시오 2005 년 (질문에서 사용되는 IMPLICIT INNER는 계속 지원됩니다 구문을 가입)
"올드 스타일"의 중단 구문을 가입 : 부분적으로 만 살아라
-
==============================
2.개인적으로 나는 그것이 테이블이 결합되어 있음을 명확하고 그들이 어떻게 참여하고있는이 차종으로 조인 구문을 선호합니다. 당신은 8 개 개의 다른 테이블에서 선택 어디 비교 큰 SQL 쿼리를 시도하고 당신은 어디에서 필터링 많이 있습니다. 당신이 행을 필터링하는 부분에, 테이블이 결합되는 부분을 분리 조인 구문을 사용하여.
개인적으로 나는 그것이 테이블이 결합되어 있음을 명확하고 그들이 어떻게 참여하고있는이 차종으로 조인 구문을 선호합니다. 당신은 8 개 개의 다른 테이블에서 선택 어디 비교 큰 SQL 쿼리를 시도하고 당신은 어디에서 필터링 많이 있습니다. 당신이 행을 필터링하는 부분에, 테이블이 결합되는 부분을 분리 조인 구문을 사용하여.
-
==============================
3.MySQL은 5.1.51에서 두 쿼리는 동일한 실행 계획을 가지고 :
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)
표 1은 166,208 행을 갖는다 표 2는 1000 행에 대해이있다.
이것은 매우 간단한 경우이다; 그것은 어떤 방법으로 쿼리 최적화 프로그램이 혼동하고보다 복잡한 경우에 다른 계획이 생성되지 것을 증명하지 않습니다.
-
==============================
4.당신이 WHERE 절에 해당하지 않고 부분에서에 테이블을 추가 할 수 있습니다 : 두 번째 구문은 십자가의 원치 않는 가능성이 참여 있습니다. 이것은 유해한 것으로 간주됩니다.
당신이 WHERE 절에 해당하지 않고 부분에서에 테이블을 추가 할 수 있습니다 : 두 번째 구문은 십자가의 원치 않는 가능성이 참여 있습니다. 이것은 유해한 것으로 간주됩니다.
-
==============================
5.첫 번째 대답은 당신이 다른이 유효하고 어떤 관계형 데이터베이스에서 작동, ANSI으로 알려진 사용하는 구문에 가입했다.
첫 번째 대답은 당신이 다른이 유효하고 어떤 관계형 데이터베이스에서 작동, ANSI으로 알려진 사용하는 구문에 가입했다.
난 당신이 ANSI JOIN 구문을 사용해야 그롬에 동의합니다. 그들이 말했듯이, 주된 이유는 명료하다. 오히려 ANSI 반환 테이블을 조인 일부 조건을 많이하고 행을 제한하는 다른 사람들과 where 절을하는 것보다 당신이를 제한하는 데 사용되는이 눈부시게 당신의 테이블을 조인하는 데 사용되고있는 조건을 취소하게되어 조인 구문을 결과.
-
==============================
6.난 당신이 사용되지 않는 * = 및 = *이 대 사업자 "외부 조인"생각하고 생각합니다.
난 당신이 사용되지 않는 * = 및 = *이 대 사업자 "외부 조인"생각하고 생각합니다.
난 그냥 지금 주어진 두 가지 형식을 테스트했으며, 그들은 SQL 서버 2008 데이터베이스에서 제대로 작동합니다. 내 경우에는 그들은 동일한 실행 계획을 나왔고,하지만 난 자신이 항상 참이 될 것이라고 말할 수있다.
-
==============================
7.@lomaxx : 그냥 내가 구문 위의 두 아래 구문은 그러나 지원되지 않습니다 SQL SERV 2005에서 지원하는 것을 꽤 확신, 명확하게
@lomaxx : 그냥 내가 구문 위의 두 아래 구문은 그러나 지원되지 않습니다 SQL SERV 2005에서 지원하는 것을 꽤 확신, 명확하게
select a.*, b.* from table a, table b where a.id *= b.id;
즉, 외부 지원되지 않는 (* =) 조인.
-
==============================
8.일부 데이터베이스 (특히 오라클)에서의 순서는 (두 개 이상의 테이블이있는 경우) 쿼리 성능에 큰 차이를 만들 수 있습니다 조인. 하나의 응용 프로그램에, 우리는 어떤 경우에 크기 차이 말 그대로 두 개의 주문을했다. 당신이 바로 힌트 구문을 사용하는 경우 - 내부가 조인 구문을 사용하면이 제어 할 수 있습니다.
일부 데이터베이스 (특히 오라클)에서의 순서는 (두 개 이상의 테이블이있는 경우) 쿼리 성능에 큰 차이를 만들 수 있습니다 조인. 하나의 응용 프로그램에, 우리는 어떤 경우에 크기 차이 말 그대로 두 개의 주문을했다. 당신이 바로 힌트 구문을 사용하는 경우 - 내부가 조인 구문을 사용하면이 제어 할 수 있습니다.
당신은 당신이 사용중인 데이터베이스를 지정하지 않은,하지만 진짜 차이가 있습니다없는 경우 확률은 SQL Server 또는 MySQL을 제안합니다.
-
==============================
9.리 대령은 언급 한 바와 같이, 쿼리 최적화 프로그램은 기능적으로 동일한 SQL 문을 어떻게 생겼는지에 따라 서로 다른 쿼리 계획을 생성 할 수 있습니다. 이에 대한 자세한 독서를 들어, 다음 두 블로그 게시물을 살펴 가지고있다 -
리 대령은 언급 한 바와 같이, 쿼리 최적화 프로그램은 기능적으로 동일한 SQL 문을 어떻게 생겼는지에 따라 서로 다른 쿼리 계획을 생성 할 수 있습니다. 이에 대한 자세한 독서를 들어, 다음 두 블로그 게시물을 살펴 가지고있다 -
오라클 최적화 팀에서 하나 개의 게시물
은 "구조화 된 데이터"블로그의 또 다른 게시물
난 당신이 흥미를 찾을 수 있기를 바랍니다.
-
==============================
10.성능 현명, 어떤 차이가 안된다. 명시 적은 명확 절에서의 테이블 간의 관계를 정의하고 where 절을 혼란하지 않는 구문은 나에게 청소기를 보인다 가입 할 수 있습니다.
성능 현명, 어떤 차이가 안된다. 명시 적은 명확 절에서의 테이블 간의 관계를 정의하고 where 절을 혼란하지 않는 구문은 나에게 청소기를 보인다 가입 할 수 있습니다.
-
==============================
11.기본적으로, 둘 사이의 차이는 다른 하나는 현대적인 방식으로 작성되는 동안 하나, 기존의 방식으로 작성된다는 점이다. 개인적으로, 나는 그들이 더 설명이 필요하고, 코드를 읽기 쉽게 만들기 때문에 내부, 왼쪽, 외부, 바로 정의를 사용하여 현대적인 스크립트를 선호합니다.
기본적으로, 둘 사이의 차이는 다른 하나는 현대적인 방식으로 작성되는 동안 하나, 기존의 방식으로 작성된다는 점이다. 개인적으로, 나는 그들이 더 설명이 필요하고, 코드를 읽기 쉽게 만들기 때문에 내부, 왼쪽, 외부, 바로 정의를 사용하여 현대적인 스크립트를 선호합니다.
내부 조인을 처리 할 때 가독성에 진짜 차이가 없습니다도, 왼쪽 취급과 오른쪽이 뭔가를 얻을 것입니다 기존의 방법으로 조인하는 경우 그러나, 그것은 복잡 얻을 수 있습니다 :
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 컴파일러에 차이를 만들지 않습니다. 나는 많은 사람들이 그것으로 쓰기 모두 노인과 젊은 사람이 있었다 오라클 데이터베이스 모두의 혼합을 보았다. 다시, 스크립트가 얼마나 읽을 수 아래로 비등하고 팀이 함께 개발하고있다.
-
==============================
12.내 경험에 의하면, 사용하여 크로스 조인과-A-절의 위치를 마이크로 소프트 SQL 제품을 사용하는 경우 특히 구문은 종종 뇌 손상 실행 계획을 생성합니다. SQL 서버 시도가 테이블 행 수를 추정하는 방법은, 예를 들어, 잔혹 끔찍하다. 내부 구문 조인을 사용하면 쿼리가 실행되는 방식을 일부 제어 할 수 있습니다. 현재 데이터베이스 기술의 격세 유전 특성상 실용적인 관점에서 그래서, 당신은 내부 조인과 함께 가야 해요.
내 경험에 의하면, 사용하여 크로스 조인과-A-절의 위치를 마이크로 소프트 SQL 제품을 사용하는 경우 특히 구문은 종종 뇌 손상 실행 계획을 생성합니다. SQL 서버 시도가 테이블 행 수를 추정하는 방법은, 예를 들어, 잔혹 끔찍하다. 내부 구문 조인을 사용하면 쿼리가 실행되는 방식을 일부 제어 할 수 있습니다. 현재 데이터베이스 기술의 격세 유전 특성상 실용적인 관점에서 그래서, 당신은 내부 조인과 함께 가야 해요.
from https://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] INNER가, 왼쪽, 오른쪽 조인 및 FULL은 조인의 차이점은 무엇입니까? [복제] (0) | 2020.03.05 |
---|---|
[SQL] 분류 결과 각 그룹에 대해 상위 N 레코드를 가져 오기 (0) | 2020.03.05 |
[SQL] PostgreSQL의 크로스 탭 쿼리 (0) | 2020.03.05 |
[SQL] INNER는 WHERE 절 대 ON 가입 (0) | 2020.03.05 |
[SQL] MySQL의에서 ROW_NUMBER () (0) | 2020.03.05 |