2.6-1 NULL in Indexes
use-the-index-luke 저자 Markus Winand
---------------------------------------------
Markus Winand는 SQL에 대한 통찰력을 제공하고 다양한 시스템이 SQL을 지원하는 방법을 modern-sql.com 에서 보여줍니다. 이전에 그는 use-the-index-luke.com 을 만들었는데, 지금도 활발하게 유지되고 있습니다. Markus는 winand.at 를 통해 강사, 연사 및 컨설턴트로 고용될 수 있습니다.
---------------------------------------------
You can upload a Korean translation of use-the-index-luke.com on your blog
Thank you from the bottom of my heart to author Makus Winand for allowing me.
These are translations that I use for studying by using a papago (google translate)
The translations may not be correct or there may be a typo.
I'd appreciate it if you could point it out in the comments.
---------------------------------------------
---------------------------------------------
use-the-index-luke.com 의 한글번역본을 블로그에 업로드 해도 된다고
허락해주신 Makus Winand 저자님께 진심으로 감사합니다.
이 번역본들은 제가 공부용도로 번역기(papago, google transrate)를 돌려서
번역한 내용들이라 맞지 않거나, 오타가 있을수 있습니다.
댓글로 지적해주시면 감사하겠습니다.
---------------------------------------------
https://use-the-index-luke.com/sql/where-clause/null/index
ㄴ NULL 에 대한 인덱스
모든 인덱싱된 열이 NULL 이면 Oracle Database는 인덱스에 행을 포함하지 않습니다. 즉, 모든 인덱스는 where 절이 있는 것과 같은 부분 인덱스입니다.
----------------------------------------------------------
CREATE INDEX idx
ON tbl (A, B, C, ...)
WHERE A IS NOT NULL
OR B IS NOT NULL
OR C IS NOT NULL
...
----------------------------------------------------------
EMP_DOB 인덱스를 고려하십시오.
date_of_birth의 열이 하나뿐입니다.
date_of_birth 값이 없는행은 이 INDEX에 추가되 않습니다.
----------------------------------------------------------
INSERT INTO employees ( subsidiary_id, employee_id
, first_name , last_name
, phone_number)
VALUES ( ?, ?, ?, ?, ? )
----------------------------------------------------------
Insert문은 DATE_OF_BIRTH에 대한 값을 지정하지 않으므로, 기본값은 NULL입니다. 따라서 레코드는 EMP_DOB인덱스에 추가되지 않습니다.
따라서 인덱스는 DATE가 NULL인 레코드에 대한 쿼리를 지원할 수 없습니다.
----------------------------------------------------------
SELECT first_name, last_name
FROM employees
WHERE date_of_birth IS NULL
----------------------------------------------------------
그럼에도 불구하고, 적어도 하나의 인덱스 열이 null이 아닌 경우 레코드가 연결된 인덱스에 삽입됩니다.
----------------------------------------------------------
CREATE INDEX demo_null
ON employees (subsidiary_id, date_of_birth)
----------------------------------------------------------
subsidiary_id 가 null이 아니기 때문에 위의 생성된 행이 인덱스에 추가됩니다. 따라서 이 INDEX는 data_of_birth 값이 없는 특정 자회사의 모든 직원에 대한 쿼리를 지원할 수 있습니다.
----------------------------------------------------------
SELECT first_name, last_name
FROM employees
WHERE subsidiary_id = ?
AND date_of_birth IS NULL
----------------------------------------------------------
인덱스는 전체 where 절을 포함하며, 모든 필터는 INDEX RANGE SCAN(인덱스 범위 스캔)동안 access predicate로 사용됩니다.
원본 쿼리에 대한 이 개념을 확장하여 date_of_birth가 NULL인 모든 레코드를 찾을 수 있습니다. 따라서 date_of_birth 열은 인덱스에서 가장 왼쪽 열이어야 access pridicate로 사용할 수 있습니다. 쿼리 자체에 두 번째 인덱스 열이 필요하지는 않지만 인덱스에 모든 행이 있는지 확인하기 위해 NULL일 수 없는 열을 추가합니다. 이를 위해 SUBSIRIBE_ID 와 같이 NULL제약 조건이 아닌 모든열을 사용할 수 있습니다.
또는 NULL일 수 없는 상수 식을 사용할 수 있습니다.
이렇게 하면 DATE가 NULL인 경우에도 인덱스에 모든 행이 포함됩니다.
----------------------------------------------------------
DROP INDEX emp_dob
----------------------------------------------------------
----------------------------------------------------------
CREATE INDEX emp_dob ON employees (date_of_birth, '1')
----------------------------------------------------------
기술적으로 이 인덱스는 함수 기반 인덱스입니다.
이 예시는 또한 오라클 데이터베이스가 NULL을 인덱싱할 수 없다는 미신에 대해 반박할 수 있는 예시입니다..
----------------------------------------------------------
Tip
NULL이 될 수 없는 열을 다른 값처럼 인덱스 NULL에 추가합니다.
----------------------------------------------------------