한 리터럴 값으로 동일한(=)과 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는 비표준 인덱스(이 경우 외부 키)를 사용하고 있음을 나타냅니다.ref
row는 일정 값을 이 인덱스와 비교하여 쿼리가 실행되었음을 나타냅니다.
다른 관점을 덧붙이자면, 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
'source' 카테고리의 다른 글
python MySQLDB IN 절에서 사용할 목록 삽입 (0) | 2022.09.18 |
---|---|
휴지 상태 JPA 시퀀스(비ID) (0) | 2022.09.18 |
window.close 및 self.close는 Chrome에서 창을 닫지 않습니다. (0) | 2022.09.18 |
JavaScript 개체를 빠르게 지우려면 어떻게 해야 합니까? (0) | 2022.09.18 |
cron 작업으로 mySQL 쿼리를 실행하시겠습니까? (0) | 2022.09.18 |