복붙노트

[SQL] 내가 사용이 가입 또는 EXISTS 사용하여 더 나은 성능을 얻을 수 있습니까?

SQL

내가 사용이 가입 또는 EXISTS 사용하여 더 나은 성능을 얻을 수 있습니까?

나는 두 테이블의 기관 및 결과를하고 난 방법 나는 결과가없는 사람을 제외 할 수있는 기관에 대한 어떤 결과가 있는지 확인합니다.

내가 사용이 가입 또는 EXISTS 사용하여 더 나은 성능을 얻을 수 있습니까?

감사합니다, -Nimesh

해결법

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

    1.같은 최적화 된 쿼리 계획이 생성 될 수있다 - 진술에 따라, 통계 및 DB 서버는 어떤 차이를 만들 수 없습니다.

    같은 최적화 된 쿼리 계획이 생성 될 수있다 - 진술에 따라, 통계 및 DB 서버는 어떤 차이를 만들 수 없습니다.

    데시벨은 후드 아래 테이블을 조인 3 가지 방법이 기본적으로 있습니다 :

    사용하여 효과적으로 중첩 루프를 수행 할 쿼리 계획을 강제 할 수 존재한다. 이것은 가장 빠른 방법이 될 수 있지만, 정말 당신은 쿼리 계획을 결정합니다.

    난 당신이 쿼리 계획을 모두 SQL 문을 작성하고 비교할 필요가 있음을 말할 것입니다. 당신은 그들이 꽤 당신이 가지고있는 데이터에 따라 변경 될 경우가 있습니다.

    예를 들어 만약 [기관]과 [결과] 비슷한 크기이며, 모두 병합은 빠른 될 것이라고 가입 InstitutionID에 클러스터된다. [결과]보다 훨씬 더 큰 경우 [기관]은 중첩 루프 빨리 할 수있다.

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

    2.때에 따라 다르지.

    때에 따라 다르지.

    궁극적으로 둘은 완전히 다른 목적을 제공합니다.

    당신은 액세스 관련 기록에 두 테이블을 조인. 당신은 관련 기록의 데이터에 액세스 할 필요가없는 경우에 당신은 그들과 합류 할 필요가 없습니다.

    존재하는 토큰이 지정된 데이터 세트에 존재하는지 확인하는 데 사용할 수 있지만 관련 기록에 액세스 할 수 없습니다.

    당신이 생각하고있는이 방법의 예를 게시하고 난 당신에게 더 나은 아이디어를 줄 수 있습니다.

    당신이 개 테이블 기관 및 결과는 결과가 기관의 목록을 원하는 경우로,이 쿼리는 가장 효율적입니다 :

    select Institutions.institution_name 
    from Institutions
    inner join Results on (Institutions.institution_id = Results.institution_id)
    

    당신이 institution_id을 가지고 그냥 결과가 있는지 알고 싶다면, 사용이 빠를 수도 존재합니다

    if exists(select 1 from Results where institution_id = 2)
      print "institution_id 2 has results"
    else
      print "institution_id 2 does not have results"
    
  3. ==============================

    3.성능 차이가의 여부에 상관없이, 당신은 당신의 목적에 더 적합한는 무엇을 사용해야합니다. 당신의 목적은 기관의 목록을 얻는 것입니다 (안 결과 - 당신이 필요로하지 않는 추가 데이터). 그래서 어떤 결과가없는 기관을 선택 ... 번역 - 사용이 있습니다.

    성능 차이가의 여부에 상관없이, 당신은 당신의 목적에 더 적합한는 무엇을 사용해야합니다. 당신의 목적은 기관의 목록을 얻는 것입니다 (안 결과 - 당신이 필요로하지 않는 추가 데이터). 그래서 어떤 결과가없는 기관을 선택 ... 번역 - 사용이 있습니다.

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

    4.그것은 당신의 최적화에 따라 달라집니다. 나는 오라클 10g와 11g의 두 아래를 시도했다. 10g에서는 두 번째는 약간 빠른했다. 11g, 그들은 동일했다.

    그것은 당신의 최적화에 따라 달라집니다. 나는 오라클 10g와 11g의 두 아래를 시도했다. 10g에서는 두 번째는 약간 빠른했다. 11g, 그들은 동일했다.

    그러나 # 1 절 존재의 오용 정말입니다. 사용은 상대를 만나 합류했다.

    select *
    from
      table_one t1
    where exists (
                 select *
                 from table_two t2
                 where t2.id_field = t1.id_field
                 )
    order by t1.id_field desc
    
    
    select t1.*
    from 
      table_one t1
     ,table_two t2
    where t1.id_field = t2.id_field
    order by t1.id_field desc 
    
  5. ==============================

    5.나는 당신의 쿼리 실행하는 즉시 통화의 발견 뭔가 존재로 정지하기 때문에이 끝날 때까지 계속 가입하면서, 느린 가입 말하고 싶지만.

    나는 당신의 쿼리 실행하는 즉시 통화의 발견 뭔가 존재로 정지하기 때문에이 끝날 때까지 계속 가입하면서, 느린 가입 말하고 싶지만.

    편집 :하지만 쿼리에 따라 달라집니다. 이 사례별로 판단해야한다 무언가이다.

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

    6.당신이 사용하고는 상관 서브 쿼리의 일부로서 존재? 그렇다면, 거의 항상 빨라집니다 가입 할 수 있습니다.

    당신이 사용하고는 상관 서브 쿼리의 일부로서 존재? 그렇다면, 거의 항상 빨라집니다 가입 할 수 있습니다.

    데이터베이스 쿼리를 벤치마킹하는 방법이 있어야합니다. 빠른 쿼리 실행을 볼을 사용합니다.

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

    7.NOT IN 쿼리 코드 그것에 가장 확실한 방법입니다 같은 사실 문제의 당신의 막연한 설명에서, 그것은 나에게 소리 :

    NOT IN 쿼리 코드 그것에 가장 확실한 방법입니다 같은 사실 문제의 당신의 막연한 설명에서, 그것은 나에게 소리 :

    SELECT *
      FROM Institutions
      WHERE InstitutionID NOT IN (
         SELECT DISTINCT InstitutionID
           FROM Results
         )
    
  8. ==============================

    8.왼쪽 외부가 아닌 ** EXISTS보다 더 나은 수행하는 경향이 가입,하지만 경우에 당신이 존재하고 INNER 정확하게 행동 존재 복제하지 않습니다 가입하기 간단한을 사용하고 싶어. 당신이하고, 기관에 대해 여러 결과가있는 경우 INNER 그 기관에 대해 여러 행을 반환합니다 가입. 당신은 그 DISTINCT 사용하여 주위를 얻을 수 있지만, 다음은 아마 어쨌든 더 나은 성능을위한 것입니다 존재한다.

    왼쪽 외부가 아닌 ** EXISTS보다 더 나은 수행하는 경향이 가입,하지만 경우에 당신이 존재하고 INNER 정확하게 행동 존재 복제하지 않습니다 가입하기 간단한을 사용하고 싶어. 당신이하고, 기관에 대해 여러 결과가있는 경우 INNER 그 기관에 대해 여러 행을 반환합니다 가입. 당신은 그 DISTINCT 사용하여 주위를 얻을 수 있지만, 다음은 아마 어쨌든 더 나은 성능을위한 것입니다 존재한다.

    **이 방법에 익숙하지 않은 분들을 위해 :

    SELECT
         MyTable.MyTableID
    FROM
         dbo.MyTable T1
    LEFT OUTER JOIN dbo.MyOtherTable T2 ON
         T2.MyTableID = T1.MyTableID
    WHERE
         T2.MyOtherTableID IS NULL
    

    동등

    SELECT
         MyTable.MyTableID
    FROM
         dbo.MyTable T1
    WHERE NOT EXISTS (SELECT * FROM MyOtherTable T2 WHERE T2.MyTableID = T1.MyTableID)
    

    그 MyOtherTableID을 가정하는 것은 NOT NULL 열입니다. 첫 번째 방법은 일반적으로 NOT이 있지만 방법이 존재보다 빠르게 수행합니다.

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

    9.위의 같은 경우에 문은 빠르게의 조인 이상의 것을 작동 존재한다. 당신에게 하나의 기록을 제공하고 또한 시간을 절약 할 수 있음. 경우의 레코드의 수가 더있을 것 조인 모든 레코드를 사용해야합니다.

    위의 같은 경우에 문은 빠르게의 조인 이상의 것을 작동 존재한다. 당신에게 하나의 기록을 제공하고 또한 시간을 절약 할 수 있음. 경우의 레코드의 수가 더있을 것 조인 모든 레코드를 사용해야합니다.

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

    10.결과 테이블 기관별 둘 이상의 행이있는 경우, () EXISTS는 별개의 기관을 선택할 수 없어도 사용할 수 있다는 이점이 있습니다.

    결과 테이블 기관별 둘 이상의 행이있는 경우, () EXISTS는 별개의 기관을 선택할 수 없어도 사용할 수 있다는 이점이 있습니다.

    성능에 관해서는, 내가 본은), 인디애나을 (조인하고, 각각의 다양한 용도에 가장 빠른) (존재한다. 테스트해야합니다 목적을위한 최선의 방법을 찾을 수 있습니다.

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

    11.당신이 왼쪽을 사용하여 (또는 오른쪽)를 참조하는 경우 외부 조인하거나하지 하위 쿼리 존재, 나는 왼쪽 외부 승리 성능 현명한 가입 상당히 확실 해요. 예를 들면 :

    당신이 왼쪽을 사용하여 (또는 오른쪽)를 참조하는 경우 외부 조인하거나하지 하위 쿼리 존재, 나는 왼쪽 외부 승리 성능 현명한 가입 상당히 확실 해요. 예를 들면 :

    LEFT OUTER 조인 T1 표 FROM T1 SELECT. 표 2 * T2 = ON t1.id t2.id t2.id가 NULL이고

    위는 해당하는 하위 쿼리보다 더 빨리해야하고, 당신이 구체적으로 언급하는 경우 존재 - 물론, 구조가 허용하는 경우, 내부 항상 선호하는 옵션이 될 것입니다 가입 할 수 있습니다.

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

    12.당신이 결과를 가지고 있지 않은 기관을 원한다면이 결과를 가지고 그 사람들을 위해 하나의 결과를 발견로 즉시 중지로, 다음 '하지 않음 존재'하위 쿼리가 빨라집니다 ...

    당신이 결과를 가지고 있지 않은 기관을 원한다면이 결과를 가지고 그 사람들을 위해 하나의 결과를 발견로 즉시 중지로, 다음 '하지 않음 존재'하위 쿼리가 빨라집니다 ...

    당신은 결과와 기관을 원하지만, 실제로 결과, 같은 일을하지 않으려면. 하위 쿼리를 '존재하는'이 하나의 결과를 발견로는 .. 그것은 즉시 중지됩니다 사용 ... 이것은 또한 당신은을 사용하여 여러 결과 기관이 있다면 반면, 결과 세트는, 기관 당 하나 개의 기록을 가지고 것을 보장 단일 insitution 일치하는 여러 결과 기록에서 prodcued 될 것이다 중복 cartesion 제품 행을 제거하기 위해 '별개'키워드 또는 '그룹에 의해'조항을 추가하는 것이 필요 접근을 가입 할 수 있습니다.

    당신이 결과없이 insitutions를 표시하지 않으려면 내부 조인, 당신이 어떤 결과로 사람을 포함한 모든 기관을보고 싶다면 외부 조인 - 당신이 결과를해야하는 경우, 다음이 가입 할.

  13. from https://stackoverflow.com/questions/227037/can-i-get-better-performance-using-a-join-or-using-exists by cc-by-sa and MIT license