source

한 리터럴 값으로 동일한(=)과 IN 사이의 성능 차이

factcode 2022. 9. 18. 09:54
반응형

한 리터럴 값으로 동일한(=)과 IN 사이의 성능 차이

등호를 사용하는 경우와 IN 연산자의 값이 같을 경우 SQL 엔진은 어떻게 달라집니까?실행 시간이 변경됩니까?

등식 검사 연산자를 사용한 첫 번째 항목

WHERE column_value = 'All'

를 사용하다IN single (단일값)

WHERE column_value IN ('All')

은 SQL을 변경합니까?IN로로 합니다.=단단면면면면면면면면면면면?

MySQL과 PostgreSQL은 같은 차이가 있습니까?

두, 이합니다.IN=IN한 가지 요소밖에 없어요.

그러나 이와 같은 질문이 있을 때는 두 문장을 모두 실행하고 실행 계획을 실행한 후 차이를 확인하십시오.여기 - 아무것도 못 찾을 거야.

온라인으로 큰 검색을 한 후 이를 지원하는 문서를 SQL에서 찾았습니다(모든 DBMS에 해당한다고 가정합니다).

괄호 안에 값이 하나만 있는 경우, 이 주석 [sic]은 다음과 같다.

WHERE "column_name" = 'value1

다음은 Oracle에서 두 쿼리의 실행 계획입니다(대부분의 DBMS는 이를 동일하게 처리합니다).

EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number = '123456789'

Plan hash value: 2312174735
-----------------------------------------------------
| Id  | Operation                   | Name          |
-----------------------------------------------------
|   0 | SELECT STATEMENT            |               |
|   1 |  TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
|   2 |   INDEX UNIQUE SCAN         | SYS_C0029838  |
-----------------------------------------------------

★★★★★★★★★★★★★★★★IN():

EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number in('123456789');

Plan hash value: 2312174735
-----------------------------------------------------
| Id  | Operation                   | Name          |
-----------------------------------------------------
|   0 | SELECT STATEMENT            |               |
|   1 |  TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
|   2 |   INDEX UNIQUE SCAN         | SYS_C0029838  |
-----------------------------------------------------

보시다시피 둘 다 똑같아요.이것은 색인화된 열에 있습니다.색인화되지 않은 열(전체 테이블 검색만 해당)도 마찬가지입니다.

큰 차이는 없지만 column_value가 인덱스화 되어 있으면IN을 사용법

이 문제는 한 번 발생했으므로 주의해 주십시오.

단일 값으로 사용해도 아무런 차이가 없습니다.위의 두 쿼리에 대해 테이블 스캔, 인덱스 스캔 또는 인덱스 검색을 검사하면 두 쿼리 간에 차이가 없음을 알 수 있습니다.

Mysql과 PostgresSQL의 차이가 있습니까?

아니요, 2개의 엔진에서는 차이가 없습니다(SQL Server, Oracle대부분의 데이터베이스에서는 동일합니다).두 엔진이 모두 변환됩니다.IN로로 합니다.=

낚시 등을 가르치다다음은 쿼리에 어떤 변화가 있는지 직접 확인하는 방법입니다.

mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id = "AMH"\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sentence
         type: ref
possible_keys: sentence_lang_id
          key: sentence_lang_id
      key_len: 153
          ref: const
         rows: 442
        Extra: Using where

다른 방법으로 시도해 보겠습니다.

mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id in ("AMH")\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sentence
         type: ref
possible_keys: sentence_lang_id
          key: sentence_lang_id
      key_len: 153
          ref: const
         rows: 442
        Extra: Using where

여기서 mysql 결과를 해석하는 방법을 읽을 수 있습니다.EXPLAIN부한다 에 대해 즉, 동일한 계획이 생성됩니다.현현 쪽쪽즉력즉즉즉 、 그즉즉즉즉즉즉즉 、 type 인덱스경우 키)를 row는 비표준 인덱스(이 경우 외부 키)를 사용하고 있음을 나타냅니다.refrow는 일정 값을 이 인덱스와 비교하여 쿼리가 실행되었음을 나타냅니다.

다른 관점을 덧붙이자면, rdbms 시스템의 주요 포인트 중 하나는 쿼리를 다시 작성하고 해당 쿼리와 동등한 모든 쿼리에 대한 최적의 실행 계획을 선택하는 것입니다.즉, 2개의 쿼리가 논리적으로 동일한 한는 소정의 rdbms 상에서 항상 같은 실행 계획을 생성해야 합니다.

즉, 많은 쿼리가 동등(같은 결과 세트)하지만 데이터베이스 자체가 인식하지 못하는 제약 때문에 이러한 경우에 주의하십시오(예를 들어 1~6의 플래그 필드의 경우 DB는 알 수 없습니다).<3와 같다in (1,2)하지만, 결국, 당신이 단지 읽기 쉽다고 생각한다면,and그리고.or어떤 식으로 쓰든 성능에는 차이가 없습니다.

단일 IN 절의 경우 차이가 없습니다.아래는 EMPS 테이블을 사용한 데모입니다.

select * from emps where empid in (1)
select * from emps where empid=1

실행 계획의 첫 번째 쿼리에 대한 술어:

[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)

실행 계획의 두 번째 쿼리에 대한 술어:

[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)

IN 절에 값이 여러 개 있는 경우 결합으로 변환하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/37828398/performance-differences-between-equal-and-in-with-one-literal-value

반응형