더북(TheBook)

BETTER WAY 10 인덱스를 만들 때는 널을 고려하자

관계형 데이터베이스에서 널은 ‘미지의 값’, 달리 말하면 컬럼에 데이터가 들어 있지 않음을 나타내는 특별한 값이다. 널은 다른 값, 심지어 또 다른 널과도 동등이나 비동등 연산자로 비교가 불가능하다. 널 값이 있는지 알아내려면 IS NULL 연산자를 사용해야 한다.

대개 WHERE 절의 조건에 자주 사용되는 컬럼 또는 컬럼의 조합에 인덱스를 만들어서 쿼리 성능을 향상시킨다. 컬럼에 인덱스를 만들 때 해당 컬럼 값이 널인지, 데이터베이스 시스템이 인덱스로 생성된 컬럼의 널 값을 어떻게 처리하는지 고려해야 한다.

인덱스로 생성된 컬럼 값이 대부분 널이라면 항상 NULL이 아닌 값을 조회하지 않는 한 해당 인덱스는 많이 사용하지 않을 것이다. 데이터베이스 시스템이 인덱스에서 널을 제외하는 방법을 제공하지 않는다면 인덱스는 저장 공간만 심각하게 낭비할 뿐이다. 일부 데이터베이스 시스템은 빈 문자열을 널로 처리하므로(이런 시스템은 컬럼 값으로 들어온 빈 문자열을 NULL로 변경해 버린다), 컬럼에 인덱스를 만들지 여부를 결정하기가 더 어렵다.

데이터베이스 시스템마다 인덱스에 있는 널 값을 처리하는 방식이 다르다. 모든 주요 데이터베이스 시스템의 공통적인 특성은 기본키에 속한 컬럼에 널 값을 허용하지 않는다는 것이다. 이것은 ISO SQL 표준이라면 당연하다. 지금부터는 각 데이터베이스 시스템과 관련된 내용, 각 인덱스에 있는 널 값과 길이가 0인(Zero-length) 문자열(빈 문자열)을 처리하는 방식을 살펴본다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.