왜 NULL을 허용해서는 안됩니까?


125

데이터베이스 디자인에 대한이 기사를 읽은 것을 기억하고 NOT NULL의 필드 속성이 있어야한다고 기억합니다. 나는 이것이 왜 그런지 기억하지 못한다.

내가 생각할 수있는 것은 응용 프로그램 개발자로서 NULL 존재하지 않는 데이터 값 (예 : 문자열의 빈 문자열) 을 테스트 할 필요가 없다는 것 입니다.

그러나 날짜, 날짜 시간 및 시간 (SQL Server 2008)의 경우 어떻게합니까? 과거 또는 최저 날짜를 사용해야합니다.

이것에 대한 아이디어가 있습니까?


4
이 답변은 널 (NULL)의 사용에 대한 통찰력이 dba.stackexchange.com/questions/5176/...을
데릭 다우니에게

10
정말? RDBMS에서 NULL을 사용해서는 안되는 이유는 무엇입니까? NULL을 다루는 방법을 알고 있다면 NULL에는 아무런 문제가 없습니다.
Fr0zenFyr

3
이것이 BI 데이터 모델링입니까? 일반적으로 팩트 테이블에서 널 (null)을 허용해서는 안됩니다. =)
sam yi

2
@ Fr0zenFyr, RDBMS가 무언가를 할 수 있기 때문에 반드시 좋은 생각은 아닙니다. 테이블에서 기본 키 또는 고유 키를 선언하도록 강요하는 것은 없지만 예외는 거의 없습니다.
Lennart

3
이 주제를 완전히 처리하려면 RDBMS가 누락 된 데이터를 체계적으로 처리해야한다는 Codd의 원래 요구 사항을 참조해야한다고 생각합니다. 실제로는 데이터의 위치가 만들어 지지만 데이터를 넣을 데이터가없는 상황이 있습니다. 데이터 아키텍트는 데이터베이스 설계, 애플리케이션 프로그래밍 또는 두 가지 모두를 포함하여 이에 대한 응답을 제시해야합니다. SQL NULL은이 요구 사항을 충족시키는 데 완벽하지는 않지만 아무것도 아닌 것보다 낫습니다.
Walter Mitty

답변:


229

나는 그 단어가 이미 NULL을 잘못 결정했다고 암시하기 때문에 질문이 잘못 표현되었다고 생각합니다. 아마도 "NULL을 허용해야합니까?"라는 의미 일 것입니다.

어쨌든, 여기에 내가 취하는 것이 있습니다 : NULL은 좋은 것 같습니다. "NULLs bad"또는 "NULLs hard"로 인해 NULL을 막기 시작하면 데이터를 만들기 시작합니다. 예를 들어, 생년월일을 모른다면 어떻게해야합니까? 알 때까지 란에 무엇을 넣을 것인가? NULL이 아닌 많은 사람들과 같은 사람이라면 1900-01-01을 입력하십시오. 이제 노인 병동에 갇히게 될 것입니다. 아마도 지역 뉴스 방송국에서 전화를 받아 장수를 축하하며 저의 긴 생애 등에 대한 비밀을 묻습니다.

열의 값을 모르는 곳에 행을 입력 할 수 있다면 NULL은 알 수없는 사실을 나타내는 임의의 토큰 값을 선택하는 것보다 훨씬 의미가 있다고 생각합니다. 이미 알고 있거나, 리버스 엔지니어링하거나, 그 의미를 파악하도록 요구해야합니다.

그러나 데이터 모델의 모든 열이 널 입력 가능하지는 않아야합니다. 폼에는 선택적인 필드가 있거나 행을 만들 때 수집되지 않은 정보가 종종 있습니다. 그렇다고해서 모든 데이터를 채우는 것을 연기 할 수있는 것은 아닙니다 . :-)

또한 NULL을 사용하는 기능은 실제 생활에서 중요한 요구 사항에 의해 제한 될 수 있습니다. 예를 들어, 의료 분야에서 가치를 알 수없는 이유 를 아는 것은 생명과 죽음의 문제 일 수 있습니다. 맥박이 없었거나 아직 측정하지 않았기 때문에 심박수가 NULL입니까? 그러한 경우, 우리는 심박수 열에 NULL을 넣을 수 있고, NULL이기 때문에 메모 또는 다른 열을 가질 수 있습니까?

NULL을 두려워하지 말고 언제 어디서 사용해야하는지, 언제 어디서 사용하지 않아야하는지 배우거나 지시하십시오.


3
"알 수없는 사실을 나타내는 임의의 토큰 값"이것은 센티넬 값으로
Alexander

4
그러나 birth_date생년월일을 저장 하는 별도의 테이블을 만들지 못하는 이유는 무엇 입니까? 생년월일을 알 수없는 경우에 생년월일을 삽입하지 마십시오 birth_date. 널은 재앙입니다.
Eldar Agalarov

6
@EldarAgalarov 그것은 트럼프 추론처럼 들립니다 (“재해”왜? 어떻게? 누구를 위해? 어떤 것이“재해”라는 당신의 의견은 그렇게하지 않습니다). 어쨌든 생년월일은 하나의 예일뿐입니다. 잠재적으로 널 입력 가능 열이 15 명인 직원이나 구성원 또는 고객이있는 경우 15 개의 2 차 테이블을 작성 하시겠습니까? 50 명이 있다면? DW 팩트 테이블에 500이 있으면 어떻게됩니까? 데이터베이스에서 크고 무서운 NULL을 유지하기위한 유지 보수는 두려운 "재해"만큼 10 배 나빠집니다.
Aaron Bertrand

3
@AaronBertrand 테이블에 잠재적으로 nullable 열이 15 개 있으면 실제로 나쁜 냄새가납니다 ^^ 많은 수의 열이 본질적으로 나쁘지는 않지만 디자인이 잘못되었거나 비정규 화가 필요하다는 것을 나타낼 수 있습니다. 그러나 그것은 질문을 제기 할 것입니다.
programaths

2
@Wildcard 그래서 사람들 1900-01-01이 NULL 날짜 / 시간 값을 피하기 위해 저장 하는 것을 본 적이 있습니까? 그래 그리고 나서. 또한 NULL = 알 수 없음 및 알 수 없음 = false입니다. 복잡한 RDBMS에 내재 된 많은 것들을 알고 태어나지 않은 것처럼 사람들이 아닌 다른 사람들이 어떤 문제를 일으킬 수 있는지 잘 모르겠습니다. 다시, 손을 흔들며 "문제! 재난!" 그렇게하지 않습니다.
Aaron Bertrand

57

확립 된 이유는 다음과 같습니다.

  • NULL은 값이 아니므로 고유 한 데이터 유형이 없습니다. 널 (null) 은 실제 유형에 의존하는 코드가 유형화되지 않은 널 (NULL)을 수신 할 때 모든 곳에서 특별한 처리 가 필요 합니다.

  • NULL은 2 값 (친숙한 True 또는 False) 논리를 위반하며 3 값 논리가 필요합니다. 이것은 심지어 올바르게 구현하기에는 훨씬 더 복잡하며, 대부분의 DBA와 거의 모든 비 DBA에 의해 잘 이해되지 않습니다. 결과적으로 응용 프로그램에서 많은 미묘한 버그 를 적극적으로 초대 합니다.

  • 특정 NULL의미 적 의미 는 실제 값과 달리 응용 프로그램에 남겨집니다 .

    "해당 사항 없음"및 "알 수 없음"및 "감시자"와 같은 의미론이 일반적이며 다른 사항도 있습니다. 동일한 관계 내에서도 동일한 데이터베이스 내에서 동시에 자주 사용됩니다. 물론 명백 하고 구별 할 수없고 양립 할 수없는 의미입니다.

  • 그들은 관계형 데이터베이스에 필요하지 않습니다 에 주장으로, "널 (null)없이 정보를 누락 처리하는 방법" . 추가 정규화는 NULL 테이블을 제거하는 명백한 첫 번째 단계입니다.

이것은 NULL이 절대 허용되지 않아야한다는 의미는 아닙니다. 그것은 않습니다 어디든지 가능 NULL을 허용하는 많은 좋은 이유가 있다고 주장한다.

중요한 것은 더 나은 스키마 디자인, 더 나은 데이터베이스 엔진 및 더 나은 데이터베이스 언어 를 통해 NULL을 더 자주 피할 수 있도록 노력 하는 것입니다.

Fabian Pascal은 “Nulls Nullified” 에서 여러 가지 인수에 응답합니다 .


3
"널 (NULL)없이 누락 된 정보를 처리하는 방법"에 대한 링크는 우리가 널 (null) 없이는 할 수없는 이유를 아주 잘 보여줍니다. 주요 RDBMS가 현재있는 것처럼 합리적으로 구현할 수없는 몇 가지 제안이 있습니다.
잭 더글러스

7
Jack :
그렇습니다.

17
비행기가 완벽하지 않기 때문에 날지 말아야한다는 말입니까?
Aaron Bertrand

11
아니요, 벤더는 40 년 전에는 유효했지만 합리적 보유 기간보다 오래 지속 된 null에 대한 변명을 중지해야한다고 말합니다. I / O 시간은 더 이상 80ms 크기가 아닙니다. 단일 CPU주기는 더 이상 마이크로 초 크기가 아닙니다. 메모리 한계는 더 이상 몇 Megs 정도의 크기가 아닙니다. 40 년 전과 달리, 널 (null)없이 작업하는 데 필요한 하드웨어 속도와 용량은 엄청나게 비싼 비용으로 존재합니다. 그는 이제 나아갈 시간이라고 말합니다.
Erwin Smout

2
"NULL 혼란"링크가 종료되었습니다.
jpmc26

32

동의하지 않습니다. null은 데이터베이스 디자인의 필수 요소입니다. 대안은 당신이 언급 한 바와 같이, 누락되거나 알려지지 않은 알려진 값의 확산 일 것입니다. 문제는 널 (null)이 너무 널리 오해되어 부적절하게 사용되는 것입니다.

IIRC, Codd는 현재 존재하지 않는 (현재 존재하지 않거나 누락 된) 구현은 "존재하지 않지만 적용 가능하지 않음"과 "존재하지 않고 적용 할 수 없음"이 아닌 두 개의 널 마커를 사용함으로써 개선 될 수 있다고 제안했다. 이를 통해 관계형 디자인이 어떻게 향상 될지 상상할 수 없습니다.


2
다른 종류의 사용자 정의 집합과 null함께 사용할 사용자 정의 다중 값 논리를 제안합니다 .p
Jack Douglas

13
이것 만이 유일한 옵션은 아닙니다. 정규화 대안을 제외합니다. 값이 있거나 없을 수있는 열 대신 첫 번째 테이블에 해당하는 행이 있거나 없을 수있는 다른 테이블을 사용하십시오. 행의 존재 또는 부재의 의미는 표의 의미에 수반되며 NULL 또는 센티넬 값 등의 특수한 경우는 없습니다.
bignose

7
NULL이 있어도 특수한 대소 문자 또는 센티넬 값이 필요하지 않습니다. 이는 일부 사람들이 NULL을 처리하기로 결정한 증상입니다.
Aaron Bertrand

PostgreSQL에서 ''는 null과 다르며 (Oracle은 아니지만) 두 가지 마커를 제공하며 숫자 열에 0을 사용할 수 있습니다. 그러나 0의 문제는 외래 키에서 작동하지 않는다는 것입니다.
Chris Travers

13

DBA가 아니라, 개발자이며, 필요에 따라 데이터베이스를 유지 관리하고 업데이트한다고 말하면서 시작하겠습니다. 즉, 몇 가지 이유로 같은 질문이있었습니다.

  1. 값이 널이면 개발이 더 어려워지고 버그가 발생하기 쉽습니다.
  2. Null 값은 쿼리, 저장 프로 시저 및 뷰를보다 복잡하고 버그가 발생하기 쉽습니다.
  3. 널값은 공간을 차지합니다 (고정 열 길이에 따라? 바이트 또는 가변 열 길이에 대해 2 바이트).
  4. 널값은 색인 작성 및 수학에 영향을 줄 수 있으며 종종 영향을줍니다.

인터넷을 통해 많은 답변, 의견, 기사 및 조언을 조사하는 데 오랜 시간을 소비했습니다. 말할 필요도없이 대부분의 정보는 @AaronBertrand의 답변과 거의 동일했습니다. 그렇기 때문에이 질문에 대답해야한다고 생각했습니다.

먼저 미래의 모든 독자를 위해 무언가를 똑바로 설정하고 싶습니다 ... NULL 값은 사용되지 않은 데이터가 아닌 알 수없는 데이터를 나타냅니다. 종료 날짜 필드가있는 직원 테이블이있는 경우 종료일의 널값은 현재 알려지지 않은 미래의 필수 필드이기 때문입니다. 모든 직원이 활동 중이거나 해고되면 어느 시점에서 해당 필드에 날짜가 추가됩니다. 그것이 제 생각에는 널 입력 가능 필드의 유일한 이유입니다.

동일한 직원 테이블에 일종의 인증 데이터가있을 가능성이 높습니다. 엔터프라이즈 환경에서 직원이 HR 및 회계 용 데이터베이스에 나열되는 것이 일반적이지만 인증 세부 정보가 항상 있거나 필요하지는 않습니다. 대부분의 응답으로 해당 필드를 무효화하거나 계정을 만들지 만 자격 증명을 보내지 않는 것이 좋습니다. 전자는 개발 팀이 NULL을 확인하고 그에 따라 처리하는 코드를 작성하게하므로 후자는 큰 보안 위험을 초래합니다! 시스템에서 아직 사용되지 않은 계정은 해커의 가능한 액세스 지점 수만 증가 시키며, 사용하지 않은 무언가를 위해 귀중한 데이터베이스 공간을 차지합니다.

위의 정보를 감안할 때 사용되는 널 입력 가능 데이터를 처리하는 가장 좋은 방법은 널 입력 가능 값을 허용하는 것입니다. 슬프지만 사실이며 개발자가 당신을 미워할 것입니다. 두 번째 유형의 널 입력 가능 데이터는 관련 테이블 (IE : 계정, 신임 정보 등)에 넣고 일대일 관계를 가져야합니다. 이를 통해 사용자는 필요하지 않은 경우 자격 증명없이 존재할 수 있습니다. 이는 추가 보안 위험과 귀중한 데이터베이스 공간을 제거하고 훨씬 더 깨끗한 데이터베이스를 제공합니다.

아래는 필요한 nullable 열과 일대일 관계를 모두 보여주는 매우 간단한 테이블 구조입니다.

알 수없는 Nullable 및 일대일 관계

나는이 질문이 몇 년 전에 요청 된 이후로 파티에 조금 늦었다는 것을 알고 있지만, 이것이이 문제와 그 문제를 다루는 가장 좋은 방법을 밝히는 데 도움이되기를 바랍니다.


2
TerminationDate직원 레코드에 포함 되지 않도록 변경 하지만 TerminatedEmployee직원이 종료 될 때 직원이 응용 프로그램에 의해 이동 (복사되지 않음) 하는 테이블 이 있습니다. 분명히 테이블에 연결된 계정이 없기 때문에 Account 테이블과 잘 작동 TerminatedEmployee합니다. 여전히 전화 번호가 필요한 경우 외래 키를 뒤집어 직원과 종료 된 직원 테이블이 다른 방법 대신 전화 번호의 ID를 갖도록합니다.
Programster

2
나는 이것이 왜 나쁜지에 대해 말 그대로 계속할 수 있습니다. 중복 테이블, 잘못된 SQL 관행으로 인해 개발자 데이터가 직원 데이터,보고 문제, 존재하지 않는 직원 (직접 이동)에 대한 URI 직접 문제와 같은 두 곳을 찾아야하므로 목록이 계속 표시됩니다. 그리고 계속. 언젠가 값을 가질 필드에 대해 NULLS를 갖는 것은 괜찮습니다. 채워지지 않고 사용하지 않는 필드를 갖는 것은 또 다른 이야기입니다. 이 작업을 수행하기위한 많은 잠재적 인 문제와 해결 방법은 필드에서 NULL을 확인하는 작은 문제의 가치가 없습니다.
Nicholas Aguirre

1
동의하지 않습니다. 유일하게 중복되는 것은 종료 날짜의 null 필드로 채워지지 않을 수 있습니다. 개발자는 원하는 데이터에 대한 적절한 표만 살펴보고 성능을 향상시킬 수 있습니다. 어떤 이유로 든 해고 된 해고 된 직원과 비 종료 된 직원을 모두 원할 경우 90 %는 신청서를 원할 것입니다. 직원에게 해지 날짜를 부여하고 계정을 보유 할 수 없기 때문에 지정한 레이아웃이 더 좋습니다.
Programster

2
나는 중복 데이터를 말하지 않았고 중복 테이블을 말했다. 또한 직원 테이블에 대한 변경 사항은 종료 된 테이블로 세분화해야합니다. 이로 인해 앱에 오류가 발생하기 쉽고 개발자의 작업이 훨씬 어려워집니다. 또한, 종료 날짜 필드는 거의 모든 사람에게 채워집니다. 동일한 두 번째 테이블 구조를 작성하고 데이터를 이동시키는 것은 낭비이며 문제가됩니다. 테이블 데이터가 이동되고 정리되었는지 확인하기 위해 매번 테스트를 포함하지 마십시오. 테이블 만 이동하더라도 테이블에서 데이터를 제거하는 것은 좋지 않습니다. 당신이 하나의 필드에 너무 관심이 있다면 ...
Nicholas Aguirre

1
... 거의 항상 채워진 다음 직원과 1 대 1 관계로 종료 된 테이블을 만듭니다. DBA와 개발자 모두 하루 종일 다양한 데이터베이스를 사용하고 있으며 아직 제안한 구조로 데이터베이스를 만나지 않아서 기쁩니다. 특히 개발자의 관점에서 볼 때 어떤 테이블에서 왔는지 모르기 때문에 모든 것을 작성하고 오류를 확인하는 것은 악몽입니다. 조인을 작성하더라도 소프트웨어로 반환되는 데이터에는 null 데이터가 포함 된 필드가 있으므로 여전히 테스트해야합니다.
Nicholas Aguirre

13

NULL 혼란스러운 개발자의 모든 문제 외에도 NULL은 또 다른 심각한 단점이 있습니다.

NULL을 허용하는 열은 성능 측면에서 재앙입니다. 예를 들어 정수 산술을 고려하십시오. NULL이없는 제정신 세계에서는 SIMD 명령어를 사용하여 데이터베이스 엔진 코드에서 정수 산술을 벡터화하여 CPU 사이클 당 1 행보다 빠른 속도로 거의 모든 계산을 수행하는 것이 "쉽습니다". 그러나 NULL을 도입하는 순간 NULL이 생성하는 모든 특수한 경우를 처리해야합니다. 최신 CPU 명령어 세트 (읽기 : x86 / x64 / ARM 및 GPU 논리도)는이 작업을 효율적으로 수행 할 수 없습니다.

예를 들어 나누기를 고려하십시오. 매우 높은 수준에서 이것은 null이 아닌 정수로 필요한 논리입니다.

if (b == 0)
  do something when dividing by error
else
  return a / b

NULL을 사용하면 조금 까다로워집니다. 함께 null에 대해 비슷하게 b표시가 필요합니다 . 이제 수표가됩니다 :ba

if (b_null_bit == NULL)
   return NULL
else if (b == 0) 
   do something when dividing by error
else if (a_null_bit == NULL)
   return NULL
else 
   return a / b

널 (null) 산술은 널이 아닌 산술 (약 2-3 배의 계수)보다 최신 CPU에서 실행하는 것이 훨씬 느립니다.

SIMD를 도입하면 상황이 악화됩니다. SIMD를 사용하면 최신 Intel CPU는 다음과 같이 단일 명령으로 4 x ​​32 비트 정수 나누기를 수행 할 수 있습니다.

x_vector = a_vector / b_vector
if (fetestexception(FE_DIVBYZERO))
   do something when dividing by zero
return x_vector;

SIMD 랜드에서도 NULL을 처리하는 방법이 있지만 더 많은 벡터와 CPU 레지스터를 사용하고 영리한 비트 마스킹을 수행해야합니다. 좋은 트릭을 사용하더라도 NULL 정수 산술의 성능 패널티는 비교적 간단한 표현을 위해 5-10 배 느린 범위로 들어갑니다.

위와 같은 것은 집계와 어느 정도의 조인에도 적용됩니다.

다시 말해, SQL에서 NULL이 존재한다는 것은 데이터베이스 이론과 현대 컴퓨터의 실제 디자인 사이의 임피던스 불일치입니다. NULL이 개발자를 혼란스럽게하는 데는 꽤 좋은 이유가 있습니다. 대부분의 정상적인 프로그래밍 언어에서는 정수가 NULL 일 수 없기 때문에 컴퓨터가 작동하는 방식이 아닙니다.


10

흥미로운 질문들.

내가 생각할 수있는 것은 응용 프로그램 개발자로서 NULL 및 존재하지 않는 가능한 데이터 값 (예 : 문자열의 빈 문자열)을 테스트 할 필요가 없다는 것입니다.

그것보다 더 복잡합니다. Null에는 여러 가지 고유 한 의미가 있으며 많은 열에서 null을 허용하지 않는 중요한 이유는 열이 null 일 때 단 하나만 의미하기 때문입니다 (즉, 외부 조인에 표시되지 않음). 또한 매우 유용한 데이터 입력 표준을 설정할 수 있습니다.

그러나 날짜, 날짜 시간 및 시간 (SQL Server 2008)의 경우 어떻게합니까? 과거 또는 최저 날짜를 사용해야합니다.

즉, 테이블에 저장된 값이 "이 값이 적용되지 않음"또는 "알지 못함"을 의미 할 수있는 널 (null) 문제가 있음을 나타냅니다. 문자열을 사용하면 빈 문자열은 "적용되지 않음"으로 사용할 수 있지만 날짜와 시간에는 일반적으로이를 의미하는 유효한 값이 없기 때문에 이러한 규칙이 없습니다. 일반적으로 NULL을 사용하여 고정됩니다.

더 많은 관계를 추가하고 조인 하여이 문제를 해결할 수있는 방법이 있지만 데이터베이스에 NULL을 갖는 것과 동일한 의미 론적 명확성 문제가 있습니다. 이 데이터베이스의 경우 걱정하지 않아도됩니다. 실제로 할 수있는 일은 없습니다.

편집 : NULL 없어야 영역 중 하나 는 외래 키입니다. 여기서는 일반적으로 외부 조인 의미의 null과 동일한 하나의 의미를 갖습니다. 이것은 물론 문제에 대한 예외입니다.


10

SQL Null에 대한 Wikipedia의 기사 에는 NULL 값에 대한 흥미로운 설명이 있으며 특정 RDBMS에 NULL 값을 갖는 잠재적 영향을 알고있는 한 데이터베이스에 무관 한 답으로 설계에 적용 할 수 있습니다. 그렇지 않은 경우 열을 널 입력 가능으로 지정할 수 없습니다.

RDBMS가 수학과 같은 SELECT 작업과 인덱스에서 RDBMS를 처리하는 방법을 알고 있어야합니다.


-12

와우, 정답은 "성능을 저하시키기 때문에 NULL을 허용하지 않을 때"를 허용하는 것입니다. 나는 그것을 찬성하고 정교하게 할 것이다. RDBMS가 스파 스가 아닌 열에 대해 NULL을 허용하면 해당 열은 각 개별 행에 대해 값이 NULL인지 여부를 추적하는 비트 맵에 추가됩니다. 따라서 모든 열이 NULL을 허용하지 않는 테이블의 열에 NULL 기능을 추가하면 테이블을 저장하는 데 필요한 저장 공간이 늘어납니다. 또한 RDBMS가 비트 맵을 읽고 쓰도록 요구하므로 모든 작업의 ​​성능이 저하됩니다.

또한 많은 경우 NULL을 허용하면 3NF가 중단됩니다. 나는 많은 동료들처럼 3NF를 고집하지는 않지만 다음 시나리오를 고려하십시오.

Person 테이블에는 DateOfDeath라는 열이 있으며이 열은 Null을 허용합니다. 사람이 사망 한 경우 DateOfDeath로 채워지며 그렇지 않으면 NULL로 남습니다. IsAlive라는 Null을 허용하지 않는 비트 열도 있습니다. 이 열은 사람이 살아있는 경우 1로 설정되고 사람이 죽은 경우 0으로 설정됩니다. 대부분의 저장 프로시 저는 IsAlive 열을 사용하며 DateOfDeath가 아닌 사람이 살아있는 경우에만 관심을 갖습니다.

그러나 IsAlive 열은 DateOfDeath에서 완전히 파생되므로 데이터베이스 정규화가 중단됩니다. 그러나 IsAlive는 대부분의 SP에 연결되어 있기 때문에 간단한 해결책은 DateOfDeath를 Null을 허용하지 않도록 설정하고 사람이 아직 살아있는 경우 열에 기본값을 할당하는 것입니다. 그런 다음 DateOfDeath를 사용하는 소수의 SP를 다시 작성하여 IsAlive 열을 확인하고 사람이 살아 있지 않은 경우에만 DateOfDeath를 적용 할 수 있습니다. 다시 말하지만, 대부분의 SP는이 패턴을 사용하는 DateOfDeath (날짜)가 아닌 IsAlive (비트)에만 관심이 있기 때문에 액세스 속도가 상당히 빨라집니다.

모든 스키마에서 NULL이없는 널 입력 가능 컬럼을 찾는 데 유용한 T-SQL 스크립트는 다음과 같습니다.

select 'IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' WHERE ' + QUOTENAME(c.name) + ' IS NULL)
    AND (SELECT COUNT(*) FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ') > 1 PRINT ''' + s.name + '.' + t.name + '.' + REPLACE(c.name, '''', '''''') + ''''
    from sys.columns c
    inner join sys.tables t ON c.object_id = t.object_id
    inner join sys.schemas s ON s.schema_id = t.schema_id
    where c.is_nullable = 1 AND c.is_computed = 0
    order by s.name, t.name, c.name;

프로덕션 데이터베이스의 사본에서 이것을 실행하면 실제로 NULL이없는 NULL을 허용하는 것으로 표시된 열 개발자를 찾을 수 있습니다. 이들 대부분은 NOT NULL로 표시 될 수 있으므로 성능이 향상되고 저장 공간이 줄어 듭니다.

모든 테이블에서 모든 NULL을 제거하는 것이 가능하지는 않지만 여전히 깔끔한 디자인을 가지고 있지만 가능한 많은 NULL을 제거하면 상당한 이점이 있습니다. 옵티마이 저는이 정보로 훨씬 빠르게 작동하며 테이블에서 모든 NULL을 제거 할 수 있으면 상당한 양의 스토리지 공간을 다시 확보 할 수 있습니다.

나는 DBA가 생각하는 성능이 그다지 중요하지 않다는 것을 알고 있지만 솔루션에서 제한된 양의 메모리와 프로세서 파워 만 던질 수 있습니다. .

또한 이것은 실제 RDBMS에만 해당되며 SQL Server에서 답변의 기술적 부분을 기반으로합니다. Null이없는 Null 허용 열을 찾기위한 나열된 T-SQL도 SQL Server에서 가져 왔습니다.


1
의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Paul White
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.