use-the-index-luke

2.6-1 NULL in Indexes

kim-jiyoung 2023. 8. 4. 20:33

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 추가합니다.

----------------------------------------------------------