2010-03-10 4 views
3

테이블이 있는데 특정 날짜 열이 null 인 모든 행을 찾아서 선택하거나 선택할 수있는 유일한 시간입니다. 거기에서 나는 그걸로 물건을하고 그 열을 업데이 트하고 가능성이 감사의 목적을 제외하고, 그 행을 다시 방문하지 않을거야.null을 찾기 위해 최적화하기 위해 테이블을 어떻게 인덱스해야합니까?

그래서 내 열 SentDate가 null 인 행을보다 빨리 찾을 수있는 가장 좋은 방법이 있습니까?

+0

파티는 과잉인가 보지 않겠습니까? (http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx) –

+0

이 특별한 경우, 예입니다. 그러나 좋은 생각! –

답변

2

NULL을 찾기 위해 테이블을 최적화하려면 물론 인덱스를 사용하십시오. NULL을 인덱싱하고 추구-수있는 다른 값과 같다 :

create table foo (a int null, b varchar(100) null); 
create clustered index cdxFoo on foo(a); 
go 

insert into foo (a,b) select Number, 'not null' from master..spt_values 

insert into foo (a,b) values (null, 'null') 

select * from foo where a is null 

선택에 대한 쿼리 계획은 분명이 행을 찾는 데 사용되는 키 'NULL'을 추구하는 것을 알 수있다.

+0

좋아, 내 원래의 질문과는 전혀 무관하다 ... 도대체 마스터는 ... spt_values? 나는 그것을 실제로 보았지만, 나는 그것을 충분히 얻었는지 확신 할 수 없다. dbname..tablename을 사용하여 소유자 부분을 건너 뛸 수 있습니까? 내가 대체 어디 있었 니? –

+0

master..spt_values는 주로 포럼 응답자가 사용하는 숫자 표입니다. database..object 구문이 유효하며 '암시 적 스키마 세 부분 이름'입니다. 누락 된 스키마 이름은 기본 스키마 (대개 dbo)로 기본 설정됩니다. 나는 쉽게 spt_values와 기본 스키마에 의존하는 것이 나쁜 습관이라고 주장 할 수있다 ... –

+0

나는 이것을 upvoted했고 내 원본을 삭제하도록 요청했다. 오라클 캠프로부터 답변을 받았으며 SQL Server (및 여러 다른 DB) 색인 생성에 대해 알지 못했습니다. DB2, Sybase 및 MySQL은 unqiue 제약 조건을 null에 색인/적용하므로 Oracle 및 Postgres는 NULL 처리에 소수에 불과합니다. – codenheim

1

필드의 Default Value or Binding을 절대로 사용하지 않을 것으로 설정 한 다음 해당 값을 찾을 수 있습니다. 그렇지 않으면 테이블 스캔을 수행하게됩니다.

0

SQL Server 2008에서는 인덱스를 필터링 할 수 있으므로 이론적으로 NULL 값만 포함하도록 인덱스를 만들 수 있습니다 (예 : WHERE SentDate IS NULL).

관련 문제