문제

어떤 효율성의 차이에서 명시적 대 암시적 안 가입?예를 들어:

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:는다는 것을 알 IMPLICIT OUTER JOIN 문법은 사용되지 않기 때문 SQL Server2005.(의 IMPLICIT INNER JOIN 구문에서 사용하는 질문은 여전히 지원)

사용 중단의"옛 스타일의"가입 Syntax:부분만을 일

다른 팁

개인적으로 선호에 가입하는 구문으로 그것을 명확하게 테이블에 가입하는 방법과 그들이 가입했습니다.려고 비교하는 대형 SQL 쿼리를 당신이 선택하는 8 개의 다른 테이블과 당신의 필터링에 위치.하여 가입하세는 구문을 분리하는 부분이 테이블에 가입하는 부분을 필터링합니다.

에 MySQL5.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)

table1 는 166208 행; table2 가 약 1000 행이 있습니다.

이것은 매우 간단하는 경우;지 않는 모든 수단에 의해 증명하는 쿼리를 최적화하지 않을 혼란스러워하고 생성하는 다른 계획에서는 더 복잡한 경우입니다.

두 번째는 구문가는 원치 않는 가능성의 십자가의 참:추가할 수 있습니다 테이블에서부 해당없이는 절이 있습니다.이 유해한 것으로 간주.

첫 번째 대답을 했다는 것을 사용으로 알려져 있 ANSI join,다른 하나는 유효하며 작업에 어떤 관계형 데이터베이스입니다.

동의함으로 grom 사용해야 하는 ANSI 가입문입니다.그들은 말했다,주된 이유입니다.보다는 오히려 where 많은 조건자의 일부는 가입 테이블 및 다른 사람을 제한하는 반환되는 행 ANSI join 당신은 그것을 만드는 눈부시게 분명하는 조건에 사용 되는 가입 당신의 테이블과 사용을 제한하는 결과입니다.

@lomaxx:을 명확히,나쁜 일정을 모두 위한 구문은 SQL 에서 지원 Serv2005.아래의 구문은 그러나 지원

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

구체적으로,외부 조(*=)이 지원되지 않습니다.

성능 현명한,그들은 정확히 동일(최소한 SQL Server)하지만 알고 있는 그들은 그를 비하하는 이에 가입하는 구문 및 그에 의해 지원되지 않 sql server2005 에 있습니다.

나는 당신이 생각하는 사용되지 않*=및=*연산자 대"외부에 가입하".

나는 지금을 테스트하는 두 가지 형식이 주어진,그리고 그들이 제대로 작동하는 SQL Server2008 데이터베이스입니다.내 경우에는 그들이 나왔고 동일한 실행 계획할 수는 없었지만 자신 있게 말할 것이라고는 항상 진실하다.

일부 데이터베이스에서(특히 오라클)조인의 순서 큰 차이를 만들 수 있습을 쿼리 성능을(있을 경우 두 개 이상의 테이블).중 하나에,우리는 그대로 두 가지 주문 크기의 차이는 경우가 있습니다.를 사용하여 내부에 가입한 구문을 제어할이 사용하는 경우 오른쪽에 힌트를 구문입니다.

을 지정하지 않은 데이터베이스를 사용하지만,확률이 건의 SQL 서버 또는 MySQL 있는 곳에 그것이 진짜 차이입니다.

로 리 Caldwell 급 쿼리 최적화 프로그램을 생산할 수 있는 다른 쿼리 계획에 따라 기능적으로 보이는 같은 SQL statement.추가 읽기를 위해 이에 모습을 가지고,다음과 같은 두 블로그 게시물:-

하나의 게시물이 오라클에서 최적화 프로그램 팀

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

나는 당신이 흥미롭습니다.

성능 현명한,그것은 하지 않아야 합니다.명시적 join 보 청소기,전체적으로 깔끔하고 세련된 느낌을 명확하게 정의하는 간의 관계에서 테이블에서 절과하지 않는 아무런 영향도 미치지 않는다.

내 경험에 의 사용하여 십자가 가로디-절 구문을 종종 생산하는 두뇌 손상을 실행 계획,특히 사용하는 경우에는 Microsoft SQL 제품입니다.방법는 SQL Server 시도를 예측 테이블을 줄 수는,예를 들어,게 끔찍하다.를 사용하여 내부에 가입한 구문을 제공합 당신이 몇 가지 제어 방법을 통해 쿼리가 실행된다.그래서 실용적인 관점에서 볼이 주어진 해 버리는 자연의 현재 데이터베이스 기술을 이동으로 내부입니다.

기본적으로,둘 사이의 차이 하나에 기록 된 방법이고,다른 작성에 현대적인 방법입니다.개인적으로,내가 선호하는 현대적인 스크립트를 사용하여 안쪽,왼쪽,외부,오른쪽 정의하기 때문에 그들은 더 설명하고 코드를 읽을 수 있습니다.

을 처리할 때 내부 조인이 진짜 차이가 있에서 가독성도,그러나,그것을 얻을 수 있습니다 복잡한 다룰 경우 왼쪽과 오른쪽 결합으로 이 방법 당신이 무언가를 얻을 것 같다:

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 데이터베이스에서는 많은 사람들을 쓰고 그것으로 모두 장로와 젊은 것들입니다.다시로 귀결하는 방법을 읽을 수 있는 스크립트가 팀은 당신이 개발하고 있다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top