정의
(크다), (크거나 같다), (작다), (작거나 같다) 등의 비교 연산자를 사용하여 데이터를 검색하는 쿼리.
동등 검색 (Equality): WHERE A = 10 결과 값은 특정 값(10)과 일치하는 레코드들이다 (한개일수도 여러개일수도. 어차피 찾는 비용은 같다).
비교 검색 (Comparison): WHERE A >= 10 결과 값은 10보다 크거나 같은 모든 레코드들입니다.따라서 Comparison은 특정 시작점(여기서는 10)부터 데이터가 끝나는 지점까지의 범위를 찾습니다.
그러나 범위를 찾으려면 다 찾아야 하니까 Linear 랑 비슷하겠다 생각하겠지만 아니다.
이 둘의 비용을 가르는 핵심은 "어디서 스캔을 시작하는가"이다.
Linear Search : 디스크에 저장된 테이블의 첫 블록부터 끝 블록까지 무조건 순차적으로 모두 읽음.
Comparison : B-tree 인덱스로 시작점()을 찾은 후, 조건에 맞는 개의 블록만 순차적으로 읽음.
여기서 h 만큼 I/O cost 하고, 거기서 실제 레코드를 찾고(Primary) 그 레코드를 읽고 그뒤로 블록개수 b만큼(블록은 해당 조건에 대해 정렬) I/O Cost 발생
여기서 h 만큼 I/O cost 하고, 거기서 레코드를 포인터를 찾고(Secondary) 그 레코드부터 찾아가 읽어들임 , 그뒤로 찾을때까지 (블록은 해당 조건에 대해 정렬 X) N회 I/O Cost 발생
Cost ≈ Cost=(h + n) × (tT + tS)
인덱스 탐색 (h): 트리의 높이 h
조건을 만족하는 n개의 레코드
데이터베이스 쿼리에서 여러 개의 조건이 모두 참일 때 레코드를 선택하는 방법()을 최적화하는 전략
SQL의 연산으로 연결된 여러 개의 WHERE 절 조건을 처리하는 방법
이 전략은 여러 조건 중 가장 선택도가 좋은(가장 적은 결과를 반환할 것으로 예상되는) 하나의 조건()에 해당하는 인덱스만 사용.
작동 방식
장점: 하나의 인덱스만 사용하므로 디스크 I/O가 비교적 단순하다.
이 전략은 여러 개의 조건이 포함된 인덱스(와 가 모두 키로 포함된 인덱스)가 있을 때 사용.
작동 방식:
장점: 디스크 접근 횟수를 획기적으로 줄여 가장 높은 성능을 제공할 수 있습니다.
이 전략은 여러 조건()에 각각 개별적인 인덱스가 있을 때 사용.
작동 방식:
각 조건()에 해당하는 인덱스를 각각 스캔하여, 해당 조건을 만족하는 레코드 주소(Pointer 또는 Primary Key 값)들의 집합을 얻습니다.
얻어진 모든 주소 집합의 교차점(Intersection)을 계산합니다. 이 교집합은 모든 조건을 동시에 만족하는 레코드들의 주소 목록이 됩니다.
이 교집합 목록을 사용하여 실제 데이터 파일로 접근하여 레코드를 가져옵니다. (랜덤 I/O가 발생할 수 있습니다.)
인덱스가 없는 조건 처리: 만약 일부 조건에 적절한 인덱스가 없다면, 교차점 계산 후 메모리로 가져온 레코드에 대해 메모리 내에서 나머지 조건 테스트를 적용합니다.
장점: 여러 인덱스를 동시에 활용할 수 있어, 각 인덱스의 선택도가 낮더라도 결합하면 매우 효과적일 수 있다.
SQL의 OR 연산으로 연결된 여러 조건(σθ1∨θ2∨⋯∨θn(r))을 처리하는 최적화 전략.
논리합 검색의 주된 전략은 식별자 합집합을 통한 선택(Disjunctive Selection by Union of Identifiers).
이 전략은 OR 조건을 만족하는 모든 레코드를 찾기 위해 개별 인덱스를 활용한 후, 그 결과들을 합치는 방식입니다.
적용 조건: 이 전략은 모든 개별 조건(θ1,θ2,…)에 사용 가능한 인덱스가 있을 때만 효율적. 만약 일부 조건에 인덱스가 없다면, 인덱스를 사용하는 것보다 Full Table Scan (선형 스캔)이 더 빠를 수 있습니다.
작동 방식:
개별 인덱스 스캔: 각 조건(θi)에 해당하는 인덱스를 각각 스캔하여, 해당 조건을 만족하는 레코드들의 주소(Pointer 또는 Primary Key 값) 집합을 얻습니다.
합집합 계산 (Union): 얻어진 모든 주소 집합의 합집합(Union)을 계산합니다. 이 합집합은 하나 이상의 조건을 만족하는 모든 레코드들의 주소 목록이 됩니다.
데이터 인출 (Fetch): 이 합집합 목록에 있는 주소를 사용하여 실제 데이터 파일로 접근하여 레코드를 가져옵니다.
비용 고려: 합집합을 통해 주소 목록을 얻은 후 데이터를 가져오는 과정은 랜덤 I/O를 유발한다. 하지만, 각 조건에 맞는 레코드만 효율적으로 찾기 때문에, Full Table Scan보다 빠를 가능성이 훨씬 높다.
WHERE NOT condition 은 인덱스 사용이 어려운 대표적인 경우다.
NOT condition을 만족하는 레코드가 매우 적고, condition 자체에는 인덱스를 적용할 수 있는 경우에 한해 다음 방법을 사용할 수 있습니다.
θ를 만족하는 레코드를 인덱스로 찾습니다.
전체 레코드에서 이 결과를 제외하는 방식으로 부정 조건을 만족하는 레코드를 간접적으로 찾을 수 있습니다.
여기까지가 Selection Operation 관계 대수 6가지 특징이다.
특징을 요약하자면
조건에 맞는 레코드를 찾아내는 것 (WHERE 절 처리).
주로 디스크 I/O 횟수에 따라 결정됨 ( 등).
AND/OR 조건은 "어떻게 찾을지"를 결정하는 검색 단계이며, 후에 나올 정렬(ORDER BY)은 "찾은 결과를 어떻게 보여줄지"를 결정하는 후처리 연산으로 별개이다.