복붙노트

[SQL] 내부는 어디 대 가입

SQL

내부는 어디 대 가입

(오라클) 성능의 차이 사이가 있습니까

Select * from Table1 T1 
Inner Join Table2 T2 On T1.ID = T2.ID

Select * from Table1 T1, Table2 T2 
Where T1.ID = T2.ID

?

해결법

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

    1.아니! 같은 실행 계획이 두 테이블을 보면 :

    아니! 같은 실행 계획이 두 테이블을 보면 :

    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. ==============================

    2.쿼리 최적화 프로그램이 그것의 일 권리를하고있는 경우 해당 쿼리 사이에 차이점이 없습니다. 그들은 같은 원하는 결과를 지정하는 두 가지 방법입니다.

    쿼리 최적화 프로그램이 그것의 일 권리를하고있는 경우 해당 쿼리 사이에 차이점이 없습니다. 그들은 같은 원하는 결과를 지정하는 두 가지 방법입니다.

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

    3.그들은 정확히 동일해야합니다. 그러나, 코딩 연습으로, 차라리 가입 볼 것입니다. 그것은 분명, 당신의 의도를 분명히

    그들은 정확히 동일해야합니다. 그러나, 코딩 연습으로, 차라리 가입 볼 것입니다. 그것은 분명, 당신의 의도를 분명히

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

    4.가입은, 코드를 읽기 쉽게하기 때문에 사용 그것의 자기 설명.

    가입은, 코드를 읽기 쉽게하기 때문에 사용 그것의 자기 설명.

    이 속도에는 차이가 없다 (난 그냥 그것을 테스트 한)과 실행 계획은 동일합니다.

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

    5.나는 오라클에 대해 알고하지 않습니다하지만 난 오래된 구문은 SQL 서버에서 더 이상 사용되지되고 결국 사라질 것이라는 점을 알고있다. 나는 새로운 쿼리에서 오래된 구문을 사용하기 전에 나는 그것과 어떤 오라클 계획을 확인합니다.

    나는 오라클에 대해 알고하지 않습니다하지만 난 오래된 구문은 SQL 서버에서 더 이상 사용되지되고 결국 사라질 것이라는 점을 알고있다. 나는 새로운 쿼리에서 오래된 구문을 사용하기 전에 나는 그것과 어떤 오라클 계획을 확인합니다.

    나는 새로운 문법보다는의 혼합 다른 필요 조건과 기준을 가입 선호합니다. 새로운 구문에서는 다른 조건이 적용되고 무엇을 만들어 조인 무엇을 훨씬 명확하다. 이 같은 짧은 쿼리에별로 큰 문제지만, 좀 더 복잡한 쿼리가있을 때 훨씬 더 혼란됩니다. 사람들이 기본적인 쿼리에 배울 수 있기 때문에, 나는 사람들이 복잡한 쿼리에 필요한 전에이 조인 구문을 사용하는 방법을 배우게 선호하는 경향이있다.

    그것은 않을 것입니다, 그래서 다시, (때때로 교차 가입 때때로 왼쪽 가입) 내가 특별히 오라클 모르겠지만, 왼쪽 SQL 서버 2000에서도 결함이 조인 이전 스타일의 SQL Server 버전을 알고 일관성없는 결과를 제공 익숙한. 희망 오라클은 동일한 문제가 고통, 그러나 확실하게 좌우 mcuh 열심히 제대로하는 오래된 구문으로 표현할 수 조인하지 않습니다.

    게다가 그것은 내 경험이었다 (물론 이것은 당신이 differnt 한 경험이 있습니다 엄격하게 개인적인 의견입니다)를 ANSII 표준을 사용하는 개발자는이 조인 무엇을 이해하고 무엇을 점점 측면에서 의미 더 나은하는 경향이 조인 것을 데이터베이스의 밖으로 데이터입니다. 나는 좋은 데이터베이스 이해 대부분의 사람들은 더 복잡한 쿼리를 작성하는 경향이 그 이전 스타일보다 ANSII 표준을 사용하여 유지하는 것이 훨씬 쉬울 나에게 보인다 변경할 수 없기 즉 보라.

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

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

    [보너스 포인트 ...]

    (가) JOIN 구문을 사용하면 더 쉽게 그 한 줄에 모두 포함으로 가입 주석 할 수 있습니다. 당신이 복잡한 쿼리를 디버깅 할 경우에 유용 할 수 있습니다

    다른 사람들이 말했듯이 (가) 의도의 문을 더 명확 가입하지만, 그들은 기능적으로 동일합니다. 따라서이 오라클 (아무도 어떤 생각이 없다)의 향후 버전에서 쿼리 최적화를 도움이 될 수 있습니다, 어떤 경우에는 현재의 오라클 버전 (나는 그것이 않는 경우 아무 생각이 없음)에서 두 쿼리 최적화 도움이 될 수 있습니다, 또는 경우에 도움이 될 수 있습니다 당신은 데이터베이스 공급 업체를 변경합니다.

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

    7.그들은 논리적으로 동일,하지만 ANSI을 채택 오라클의 이전 버전에서 그래서 당신이 그것을 오라클 개발자 때로는 만남 저항을 사용하는 것입니다 때, 더 복잡한 경우에 그것과 버그가 종종 있었다 구문.

    그들은 논리적으로 동일,하지만 ANSI을 채택 오라클의 이전 버전에서 그래서 당신이 그것을 오라클 개발자 때로는 만남 저항을 사용하는 것입니다 때, 더 복잡한 경우에 그것과 버그가 종종 있었다 구문.

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

    8.성능은 동일해야하지만 외부 조인에 올 때 나는 인해 향상된 선명도에 가입 버전을 사용하는 것이 좋습니다 것입니다.

    성능은 동일해야하지만 외부 조인에 올 때 나는 인해 향상된 선명도에 가입 버전을 사용하는 것이 좋습니다 것입니다.

    또한 의도하지 않은 직교 제품은 가입 버전을 사용하여 피할 수 있습니다.

    세 번째 효과는 단순한 WHERE 조건으로 SQL을 읽기 쉬운 것입니다.

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

    9.오라클에서, 당신은이를 같이 쓸 수, 키 속성이 두 테이블에서 같은 이름 조인 한 것으로 잊지 마세요 :

    오라클에서, 당신은이를 같이 쓸 수, 키 속성이 두 테이블에서 같은 이름 조인 한 것으로 잊지 마세요 :

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

    이것은 또한 물론, 같은 쿼리 계획을 가지고있다.

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

    10.테이블이 3 정규형에있는 시나리오에서, 변경해서는 안됩니다 테이블 사이에 조인. 즉 가입 고객 및 지불은 항상 동일하게 유지해야한다.

    테이블이 3 정규형에있는 시나리오에서, 변경해서는 안됩니다 테이블 사이에 조인. 즉 가입 고객 및 지불은 항상 동일하게 유지해야한다.

    그러나 우리가 구별해야하는 것은 필터의 결합. 조인 관계에 대해 그리고 필터는 전체를 분할하려고합니다.

    SQL-92 구문이 두 개념을 분리하기 위해 우리를 격려하고 모두 넣어 이전 구문 선호 것, 더 복잡 WHERE 절에 조인 및 필터.

  11. ==============================

    11.PostgreSQL의에서 확실히 차이가 없다 - 그들은 같은 쿼리 계획에 모두 EQUATE. 또한 오라클의 경우 확신 99 %입니다.

    PostgreSQL의에서 확실히 차이가 없다 - 그들은 같은 쿼리 계획에 모두 EQUATE. 또한 오라클의 경우 확신 99 %입니다.

  12. ==============================

    12.그들은 하나가 단순히 새로운 ANSI 구문을 사용, 모두 내부가이 같은 일을 조인입니다.

    그들은 하나가 단순히 새로운 ANSI 구문을 사용, 모두 내부가이 같은 일을 조인입니다.

  13. ==============================

    13.기능적으로 그들은 말했다되었습니다 동일합니다. 나도 동의하지만 조인하고 정확하게 수행 할 작업을 설명하는 더 나은입니다. 나는 내가 조인 일을 시작하고 내 머리에 원래는 다른 쿼리를하고 싶어 실현 때까지 쿼리 뭔가 싶어 방법을 알고 생각했습니다 시간을 많이합니다.

    기능적으로 그들은 말했다되었습니다 동일합니다. 나도 동의하지만 조인하고 정확하게 수행 할 작업을 설명하는 더 나은입니다. 나는 내가 조인 일을 시작하고 내 머리에 원래는 다른 쿼리를하고 싶어 실현 때까지 쿼리 뭔가 싶어 방법을 알고 생각했습니다 시간을 많이합니다.

  14. ==============================

    14.기능적으로, 두 쿼리는 동일한 방식으로 처리되어야한다는 사실이다. 그러나 경험은 새가 조인 구문을 사용하는 뷰에서 선택하는 경우,뿐만 아니라 그것을 사용하여 쿼리를 구성하는 것이 중요 것으로 나타났습니다. 뷰는 "가입"문을 사용하는 경우 오라클의 최적화 혼란 얻을 수 있지만,보기에 액세스하는 쿼리는 "여기서"절에 합류의 전통적인 방법을 사용합니다.

    기능적으로, 두 쿼리는 동일한 방식으로 처리되어야한다는 사실이다. 그러나 경험은 새가 조인 구문을 사용하는 뷰에서 선택하는 경우,뿐만 아니라 그것을 사용하여 쿼리를 구성하는 것이 중요 것으로 나타났습니다. 뷰는 "가입"문을 사용하는 경우 오라클의 최적화 혼란 얻을 수 있지만,보기에 액세스하는 쿼리는 "여기서"절에 합류의 전통적인 방법을 사용합니다.

  15. ==============================

    15.두 쿼리의 신원이 확실한 것 같습니다 있지만 가끔 이상한 일들이 발생합니다. 나는에 가입에서 술어에 가입 이동할 때 다른 실행 계획을 가지고 느릅 나무 쿼리 accros 온 WHERE 오라클 10g (대한 계획이 더 WHERE),하지만 난 단순화 된 테이블 및 데이터에서이 문제를 재현 할 수 있습니다. 나는 내 데이터와 통계에 의존 생각합니다. 최적화는 매우 복잡 모듈 때로는 마술 동작합니다.

    두 쿼리의 신원이 확실한 것 같습니다 있지만 가끔 이상한 일들이 발생합니다. 나는에 가입에서 술어에 가입 이동할 때 다른 실행 계획을 가지고 느릅 나무 쿼리 accros 온 WHERE 오라클 10g (대한 계획이 더 WHERE),하지만 난 단순화 된 테이블 및 데이터에서이 문제를 재현 할 수 있습니다. 나는 내 데이터와 통계에 의존 생각합니다. 최적화는 매우 복잡 모듈 때로는 마술 동작합니다.

    이 DB 내부에 의존하기 때문에 그게 왜 우리는 일반적으로이 질문에 대답 할 수 있습니다. 그러나 우리는 대답은 '차이'수 없습니다한다는 것을 알아야한다.

  16. ==============================

    16.내부 대신 '어디에'조항에 XML 피드에서 만들어진 테이블에 가입 변경, 생산에서 우리의 SP의 타이밍 중 하나를 검사 할 때 오늘이 수수께끼를했다 .... 평균 간부 시간 반면, 지금 이상 1000 실행을 평균 80ms 평균 임원은 2.2 초 ... 전에 실행 계획의 주요 차이가 키 조회의 dissapearance입니다 ... youve를이 두 가지 방법을 사용하여 테스트 할 때까지 당신이 알고 실 거예요되는 메시지.

    내부 대신 '어디에'조항에 XML 피드에서 만들어진 테이블에 가입 변경, 생산에서 우리의 SP의 타이밍 중 하나를 검사 할 때 오늘이 수수께끼를했다 .... 평균 간부 시간 반면, 지금 이상 1000 실행을 평균 80ms 평균 임원은 2.2 초 ... 전에 실행 계획의 주요 차이가 키 조회의 dissapearance입니다 ... youve를이 두 가지 방법을 사용하여 테스트 할 때까지 당신이 알고 실 거예요되는 메시지.

    건배.

  17. ==============================

    17.그들은 둘 다 조인있어 어디 그 같은 일을.

    그들은 둘 다 조인있어 어디 그 같은 일을.

    사용이 아닌 곳의 가입 이유에서 MySQL의 쿼리를 한 번 봐주세요?

  18. ==============================

    18.kiewik 말했듯이, 실행 계획은 동일합니다.

    kiewik 말했듯이, 실행 계획은 동일합니다.

    서술문은 더 쉽게 ON 상태를 잊지 않도록주의하면서와 카티 제품을 받고, 읽기 전용 더 쉽게 가입. T1, T2 WHERE t1.id = t2.some_field SELECT * FROM : 이러한 오류 유형의 조인 다중를 사용하여 긴 쿼리에서 감지하기 매우 어려울 수 있습니다.

    당신은 단지 하나의 조인 조건을 잊은 경우, 당신은 ... 너무 많은 레코드를 반환하는 쿼리를 실행하는 데 매우 긴 정말 너무 많은를 얻을. 일부의 poeple 쿼리를 패치하는 DISTINCT를 사용하지만, 그것은 여전히 ​​매우 긴 실행하려면입니다.

    더 나은 유지 보수성 및 가독성 : JOIN 문을 사용하는 것이 반드시 최선의 방법입니다 이유는 정확하게이다.

    내가 잘 기억한다면 더욱 더, 관련된 메모리 사용을 최적화 JOIN.

  19. ==============================

    19.나는 좋은 답변에 추가 있습니다 :

    나는 좋은 답변에 추가 있습니다 :

    당신이 단어 INNER을 생략 할 수 있지만 각각 SQL92 및 SQL89로 정의됩니다 무엇의는, 그들 사이에 성능 차이가 없다는 것을 (단지는 조인을 사용하는 것은 분명 충분히하고 간단한 쿼리에서 당신은 지금 큰에 얼마나 많은 스트로크 상상 5 키보드 스트로크를 저장 사람).

  20. from https://stackoverflow.com/questions/121631/inner-join-vs-where by cc-by-sa and MIT license