복붙노트

[SQL] SQL 성능 UNION 대 또는

SQL

SQL 성능 UNION 대 또는

난 그냥 최적화 기사의 일부를 읽고 다음과 같은 성명을시키고 말았다 :

빠른에서 EXPLAIN :

사용 OR :

UNION을 사용 :

하지 않습니다이 평균 UNION은 두 번 일을합니까?

내가 UNION 더 특정 RDBMS에서 특정 테이블 스키마에 대한 성능이 좋은 수 있습니다 감사 드리며,이 저자의 제안으로 절대적으로 사실이 아니다.

내가 잘못?

해결법

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

    1.어느 기사에는 나쁜 예를 사용하여 읽기, 또는 당신은 자신의 포인트를 잘못 해석.

    어느 기사에는 나쁜 예를 사용하여 읽기, 또는 당신은 자신의 포인트를 잘못 해석.

    select username from users where company = 'bbc' or company = 'itv';
    

    이것은 동일합니다 :

    select username from users where company IN ('bbc', 'itv');
    

    MySQL은 잘이 쿼리에 대해 회사에 인덱스를 사용할 수 있습니다. 어떤 UNION을 할 필요가 없습니다.

    당신이 두 개의 서로 다른 열을 포함은 OR 조건이 곳 더 까다로운 경우이다.

    select username from users where company = 'bbc' or city = 'London';
    

    기업에 대한 인덱스 및 도시에 대한 별도의 인덱스가있다 가정하자. MySQL은 보통 어떤 인덱스를 사용한다, 주어진 쿼리에 테이블 당 하나의 인덱스를 사용하는 감안할 때? 이 회사에 인덱스를 사용하는 경우, 그것은 여전히 ​​도시 런던입니다 행을 찾기 위해 테이블 ​​스캔을해야 할 것입니다. 이 도시에 인덱스를 사용하는 경우,이 회사는 영국 BBC 인 행에 대해 테이블 ​​스캔을해야 할 것입니다.

    연합 용액이 케이스의 유형이다.

    select username from users where company = 'bbc' 
    union
    select username from users where city = 'London';
    

    이제 각 하위 쿼리는 검색 인덱스를 사용할 수 있으며, 서브 쿼리의 결과는 UNION에 의해 ​​결합된다.

    익명 사용자가 위의 내 대답에 편집을 제안하지만, 사회자는 편집을 거부했다. 그것은 주석이 아닌 편집되어 있어야합니다. 제안 된 편집의 주장은 UNION 중복 행을 제거하는 결과 세트를 정렬하는 것이 었습니다. 이 느리게 실행 쿼리를 만들고, 인덱스 최적화 그러므로 씻어입니다.

    내 반응은 UNION이 발생하기 전에 색인 도움이 행의 작은 숫자로 결과 집합을 줄일 수 있다는 점이다. UNION 사실 중복을 제거 않지만, 그것은 단지 작은 결과 세트를 정렬하는 것을 할 수 있습니다. 이 조항은 테이블의 상당 부분 일치하는 경우, 그리고 UNION 동안 정렬 단순히 테이블 스캔하고 비싸다입니다 수 있습니다. 정렬이 훨씬 적은 비용이 많이 드는 테이블 스캔보다 있도록하지만, 결과 집합이 인덱스 검색에 의해 감소 ​​될 더 일반적입니다.

    차이는 테이블의 데이터에 따라, 상기 용어가 검색된다. 주어진 쿼리에 가장 적합한 솔루션을 결정하는 유일한 방법은 MySQL의 쿼리 프로파일 러의 두 가지 방법을 시도하고 성능을 비교하는 것입니다.

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

    2.사람들은 동일한 쿼리하지 않습니다.

    사람들은 동일한 쿼리하지 않습니다.

    나는 확실히 쿼리 최적화 프로그램이 수행하거나하지 않는 것 아니다, 그래서 MySQL과 많은 경험을 가지고 있지만 여기 내 일반적인 배경 (주로 MS SQL 서버)에서 내 생각이다하지 않습니다.

    일반적으로 그렇게 문제가되지 것, 쿼리 분석기는 두 개의 쿼리 위를 취할 수 있으며, (그들은 같은라면) 그들에게 동일한 계획을합니다. 나는 이러한 쿼리 사이의 성능 차이가 (이 동일)가 없음을 의심 것

    select distinct username from users where company = ‘bbc’ or company = ‘itv’;
    

    select username from users where company = ‘bbc’ 
    union
    select username from users where company = ‘itv’;
    

    자, 문제는, 내가 실제로 모르고있는 다음과 같은 쿼리 사이에 차이가있을 것입니다,하지만 난 최적화가 더 첫 번째 쿼리처럼 만들 것이라고 생각 것

    select username from users where company = ‘bbc’ or company = ‘itv’;
    

    select username from users where company = ‘bbc’ 
    union all
    select username from users where company = ‘itv’;
    
  3. ==============================

    3.이에 따라 어떤 데이터, 인덱스, 소프트웨어 버전 등의 크기에 따라 일까지 최적화 끝

    이에 따라 어떤 데이터, 인덱스, 소프트웨어 버전 등의 크기에 따라 일까지 최적화 끝

    내가 사용 또는 모든 단일 논리 문에 있기 때문에, 최적화에게 약간의 효율성을 찾는에서 더 나은 기회를 줄 것이라고 생각합니다.

    이 리 세트 (중복 없음)을 생성 이후 또한, UNION 일부 오버 헤드를 갖는다. 연합의 각 문은하지 않도록 정말 두 배의 일을 할 것 ... 꽤 빨리 회사가 색인 경우 실행해야합니다.

    당신이 정말로 당신의 쿼리에서 속도의 모든 비트를 집어 넣은 불타는 필요가 없다면, 그냥 가장 ... 수술실 당신의 의도를 전달하는 양식 이동에 아마 더 낫다

    또한 IN을 언급 의미했다. 나는 다음과 같은 쿼리 (그것은 또한 내가 선호하는 형태의)이보다 나은 성능을 제공 OR 것으로 예상 :

    사용자의 사용자 이름을 선택 곳의 기업 ( 'BBC', 'ITV');

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

    4.대부분의 경우, 노동 조합 또는 노동 조합의 모든 버전은 사용자 테이블의 두 전체 테이블 스캔을 할 것입니다.

    대부분의 경우, 노동 조합 또는 노동 조합의 모든 버전은 사용자 테이블의 두 전체 테이블 스캔을 할 것입니다.

    그것은 단지 한 번 테이블을 스캔하기 때문에 또는 버전은 실제로는 훨씬 낫다. 또한 한 번만 사용 가능한 경우 인덱스를 사용합니다.

    다만 어떤 데이터베이스와 모든 상황에 대해 원래 문은 잘못된 것 같다.

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

    5.빌 Karwin의 대답은 꽤 권리입니다. 수술실 문의 부분 모두가 자신의 색인이 때 결과의 작은 부분 집합이되면, 그들을 정렬하고 중복을 제거하기 쉽게 때문에, 그것은 더 나은 조합을하고있어. 총 비용은 거의 이하 다른 열 및 테이블 검색 (열 중 하나) 단지 하나의 인덱스 (MySQL이 하나의 열에 대해 하나의 인덱스를 사용하기 때문에)보다 사용된다.

    빌 Karwin의 대답은 꽤 권리입니다. 수술실 문의 부분 모두가 자신의 색인이 때 결과의 작은 부분 집합이되면, 그들을 정렬하고 중복을 제거하기 쉽게 때문에, 그것은 더 나은 조합을하고있어. 총 비용은 거의 이하 다른 열 및 테이블 검색 (열 중 하나) 단지 하나의 인덱스 (MySQL이 하나의 열에 대해 하나의 인덱스를 사용하기 때문에)보다 사용된다.

    이 테이블의 구조를 따라 일반적으로 필요하지만 큰 테이블에서 노조 나에게 더 나은 결과를 주었다.

  6. from https://stackoverflow.com/questions/13750475/sql-performance-union-vs-or by cc-by-sa and MIT license