복붙노트

[SQL] 내부의 성능은 가입 교차 비교 조인

SQL

내부의 성능은 가입 교차 비교 조인

내부 조인 실행의 효과는이 WHERE 절에 조인 조건 크로스 함께 조인라는 것과 동일하다. 내 회사의 사용 나는 내부 조인을 사용하는 것이 어디 십자가, 조인에 많은 사람들이 나타났습니다. 이러한 쿼리의 일부를 변경하고 그냥 우연의 일치 또는 DBMS가 투명하게 이러한 문제를 최적화하는 경우 (우리의 경우 MySQL은)이었다 궁금 후 나는 상당한 성능 향상을 통보하지 않았다. 그리고 여기에 토론을위한 구체적인 예 :

SELECT User.*
FROM User, Address
WHERE User.addressId = Address.id;

SELECT User.*
FROM User
INNER JOIN Address ON (User.addressId = Address.id);

해결법

  1. ==============================

    1.십자가는 두 개 이상의 테이블에서 행의 모든 ​​조합으로 구성 생산 결과를 결합합니다. 크로스 18 행 될 것이다 조인 것을 의미하는 경우 표 A 6 개 행을 가지며, 테이블 B는 3 개의 행을 갖는다. 두 테이블 사이에 설정된 아무 관계가 없습니다 - 당신은 말 그대로 그냥 가능한 모든 조합을 생산하고 있습니다.

    십자가는 두 개 이상의 테이블에서 행의 모든 ​​조합으로 구성 생산 결과를 결합합니다. 크로스 18 행 될 것이다 조인 것을 의미하는 경우 표 A 6 개 행을 가지며, 테이블 B는 3 개의 행을 갖는다. 두 테이블 사이에 설정된 아무 관계가 없습니다 - 당신은 말 그대로 그냥 가능한 모든 조합을 생산하고 있습니다.

    내부 조인으로 테이블의 하나의 행에서 열 값은 하나의 데이터 열을 형성하도록 서로 다른 행 (또는 동일한) 테이블 열 값과 결합된다.

    절 십자에 추가 WHERE 조인 경우에는 내부가 WHERE 강요하며로 제한 요인으로 가입 동작.

    한 쿼리 상식 및 공급 업체의 특정 성능 가이드 라인을 준수으로, 내가 사용하는 조인의 종류는 취향의 간단한 문제가 될 수있는 결정으로 생각하고 싶다.

  2. ==============================

    2.차이는 내부가이 절은 실제 제한 조건이 될 곳을 떠나, 조인을 정의하기 때문에 많은 명확 결합 이외 없습니다.

    차이는 내부가이 절은 실제 제한 조건이 될 곳을 떠나, 조인을 정의하기 때문에 많은 명확 결합 이외 없습니다.

  3. ==============================

    3.사용은 두 쿼리에 대한 쿼리 계획을보고, 어떤 차이가 있는지 설명한다. 아마도 MySQL은 두 경우 모두 동일한 실행 계획을 사용합니다. 나는 INNER이 많이 명확입니다 주로하기 때문에 구문 JOIN 사용합니다.

    사용은 두 쿼리에 대한 쿼리 계획을보고, 어떤 차이가 있는지 설명한다. 아마도 MySQL은 두 경우 모두 동일한 실행 계획을 사용합니다. 나는 INNER이 많이 명확입니다 주로하기 때문에 구문 JOIN 사용합니다.

  4. ==============================

    4.내가 처음 구문 (쉼표로 테이블을 분리) 할 수 그 작업 장소 상당한 시간이보다 많은 행이 의도 한 것보다 반환되는 경우 디버깅을 채택하는 경향이 찾을 수 있습니다. 의도하지 않은 크로스는 시스템의 파멸이다 조인과의 무릎에도 가장 잘 조정 된 데이터베이스를 가져올 수 있습니다. 그것은 작년에 적어도 두 차례에 비명을 지르는 정지에 우리의 사전 자극 시스템을 가져왔다.

    내가 처음 구문 (쉼표로 테이블을 분리) 할 수 그 작업 장소 상당한 시간이보다 많은 행이 의도 한 것보다 반환되는 경우 디버깅을 채택하는 경향이 찾을 수 있습니다. 의도하지 않은 크로스는 시스템의 파멸이다 조인과의 무릎에도 가장 잘 조정 된 데이터베이스를 가져올 수 있습니다. 그것은 작년에 적어도 두 차례에 비명을 지르는 정지에 우리의 사전 자극 시스템을 가져왔다.

    두 번째 구문 (구문을 가입) 테이블이 처음으로 함께 결합하고 단지 흥미로운 행을 반환하는 방법에 대해 생각하는 작가를 강제로. 실수로 크로스가이 구문을 사용하여 가입 할 수 없다, 따라서 실수로 실적이 저조 쿼리의 위험이 감소한다.

    그러나, 문제는 제쳐두고, 내가 가진 한 모든 시스템에서 두 구문 사이의 속도 차이를 발견 적이 없다.

  5. ==============================

    5.첫번째 예는 기능적으로 두 번째 예와 동일하다. 그러나,이 구문은 여러 가지 이유로 피해야한다. 첫째는 배수 값이 테이블에 조인있다 특히이 구문을 사용하는 경우 크로스 조인을 실수로 얻을에 훨씬 더 쉽습니다. 당신이 키워드 별개로 이러한 유형의 쿼리를 많이 볼 경우, 당신은 아마 크로스 조인을 해결하기 위해 노력하는 사람이있다.

    첫번째 예는 기능적으로 두 번째 예와 동일하다. 그러나,이 구문은 여러 가지 이유로 피해야한다. 첫째는 배수 값이 테이블에 조인있다 특히이 구문을 사용하는 경우 크로스 조인을 실수로 얻을에 훨씬 더 쉽습니다. 당신이 키워드 별개로 이러한 유형의 쿼리를 많이 볼 경우, 당신은 아마 크로스 조인을 해결하기 위해 노력하는 사람이있다.

    다음으로, 왼쪽과 오른쪽 이전 스타일이 더 이상 사용되지 않으며 지원됩니다 사용하여 구문을 가입 할 수 있습니다. 또한, 지금은 어쨌든 제대로 작동하지 않습니다. 가끔은 외부 조인을 잘못 해석하고 다시 잘못된 결과 세트를 전송합니다. 어떤 쿼리 그래서 당신은 사용했다 = 또는 = where 절에 즉시 교체해야합니다.

    셋째, ANSI 표준을 이해하고 유지하기 쉽게되어 결합한다. 조인에 대한 이해는 관계형 데이터베이스의 요구를 조회하는 사람이 가질 수있는 가장 중요한 기본적인 기술 중 하나입니다. 정말 이해하지 못하는 기존의 스타일을 사용하는 일부 사람들이 조인 나의 경험이었다 실제로 그들이 의도 작동 방법에 따라서 쓰기 쿼리를하지 않는.

  6. ==============================

    6.순서가있는 당신은 테이블을 조인 또는 당신이 당신의 ON을 넣어 / WHERE 조건이 문제가 안된다.

    순서가있는 당신은 테이블을 조인 또는 당신이 당신의 ON을 넣어 / WHERE 조건이 문제가 안된다.

    쿼리 최적화 프로그램은 최적화하고 어쨌든 최선의 순서를 사용 (그리고 선택하는 최선의 방법 필터 등 시작하는 데이터)한다

    이 일을 훨씬 더 쉽게 읽을 이후하지만, 나는 INNER를 사용하는 것이 좋습니다 많은 사람들이 그것 LEFT의 구문을보다 투명 또는 FULL뿐만 아니라 조인 구문을 가입하세요.

    그것에 대해 좀 더 거주하는 텍스트가 여기에있다 : http://linus.brimstedt.se/?/article/articleview/SQL 구문

    /비

  7. ==============================

    7.첫 번째 구문 중 하나 추가적인 이점은 당신이 당신의 제한 조건보다 일반적인 될 수 있습니다. 다만 평등.

    첫 번째 구문 중 하나 추가적인 이점은 당신이 당신의 제한 조건보다 일반적인 될 수 있습니다. 다만 평등.

    당신은 평등을 사용하는 경우에, 왜 최적화를 신뢰? 확실히 처음 가입 십자가를 생성하지 않습니다 확인하고 행을 제거. 두 번째 하나를 사용하십시오.

  8. ==============================

    8.SQL Server는 "십자가를집니다 WHERE 조인 할 때 내부 조인에"말했다 그렇게 차이가 없습니다. http://msdn.microsoft.com/en-us/library/ms190690.aspx

    SQL Server는 "십자가를집니다 WHERE 조인 할 때 내부 조인에"말했다 그렇게 차이가 없습니다. http://msdn.microsoft.com/en-us/library/ms190690.aspx

    나는 SQL 서버 "실시 계획"성능은 동일했다.

  9. ==============================

    9.두 쿼리를 설명하는 것은 동일한 출력을 제공

    두 쿼리를 설명하는 것은 동일한 출력을 제공

    mysql> explain select * from t T1, t T2 where T1.ID=T2.ID;
    +----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
    | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                          |
    +----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
    |  1 | SIMPLE      | T1    | ALL  | PRIMARY       | NULL | NULL    | NULL |    3 |                                |
    |  1 | SIMPLE      | T2    | ALL  | PRIMARY       | NULL | NULL    | NULL |    3 | Using where; Using join buffer |
    +----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
    2 rows in set (0.00 sec)
    
    mysql> explain select * from t T1  join t T2 on T1.ID=T2.ID;
    +----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
    | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                          |
    +----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
    |  1 | SIMPLE      | T1    | ALL  | PRIMARY       | NULL | NULL    | NULL |    3 |                                |
    |  1 | SIMPLE      | T2    | ALL  | PRIMARY       | NULL | NULL    | NULL |    3 | Using where; Using join buffer |
    +----+-------------+-------+------+---------------+------+---------+------+------+--------------------------------+
    2 rows in set (0.00 sec)
    

    그러나 가입 내부 신택스를 사용하여 그보다 명확하고보다 정확한로서 바람직하다. 십자가에 비해 MySQL은 조정 왼쪽과 오른쪽 가입 적은 데이터를 선택하는 쿼리에 가입 내부적 수 있습니다.

  10. ==============================

    10.시간 최적화의 시작 주위에 고전 건설되고있다 때문에 제한-프로젝트 직교 제품 구문. 거의 모든 업체는 시스템 R.에 의해 개척 디자인 그리고, 마지 못해, "최신 - 및 - 최고의"ANSI 구문을 채택 납품업자 복사하여 자신의 SQL 실행 엔진을 개조. 마케팅 브로셔 ( "최신 구문을 사용합니다") 말할 수있는 것과는 달리,별로 물리적 구현 수준이 변경되었습니다 : 그것은 여전히 ​​[색인] 중첩 루프, 또는 해시 또는 정렬 병합 조인. 따라서, 다른 이상 한 구문의 우수성을 가정 할 근거가 없다.

    시간 최적화의 시작 주위에 고전 건설되고있다 때문에 제한-프로젝트 직교 제품 구문. 거의 모든 업체는 시스템 R.에 의해 개척 디자인 그리고, 마지 못해, "최신 - 및 - 최고의"ANSI 구문을 채택 납품업자 복사하여 자신의 SQL 실행 엔진을 개조. 마케팅 브로셔 ( "최신 구문을 사용합니다") 말할 수있는 것과는 달리,별로 물리적 구현 수준이 변경되었습니다 : 그것은 여전히 ​​[색인] 중첩 루프, 또는 해시 또는 정렬 병합 조인. 따라서, 다른 이상 한 구문의 우수성을 가정 할 근거가 없다.

    내 개인적인 취향에 새로운 구문은 중복, 소음, 그리고 일치하지 않습니다. 위원회에 의해 제재를 받고으로, "모든 도시에있는 공원으로 걸어 당신은위원회의 어떤 동상을 찾을 것입니다."

  11. from https://stackoverflow.com/questions/670980/performance-of-inner-join-compared-to-cross-join by cc-by-sa and MIT license