2009-10-27 6 views
1

InTime 및 OutTime 열이있는 테이블이 있습니다.인덱싱 성능이 null 데이터 대 더미 데이터

일반적으로이 테이블에 데이터를 삽입 할 때 InTime을 DateTime으로 설정하고 OutTime을 null로 설정합니다. 데이터가 제거되면 OutTime 값이 설정됩니다. 나는 특정 시간에서 데이터를 받고있을 때

내가 같은 것을 사용 : 더 나은 질의/인덱스 성능을 얻기의 측면에서

where InTime < sometime and OutTime is > sometime or OutTime is null 

내 질문은,이다 나는 같은 OUTTIME에 어떤 값을 넣어해야합니다 max datetime 그리고 nullable이 아닌 필드를 만드시겠습니까?

그럼 내 쿼리

where InTime < sometime and OutTime is > sometime 
+1

데이터베이스 자체가이 질문에 대한 최상의 답을 줄 것입니다. 다양한 쿼리에 대해 EXPLAIN을 사용하고 그들이 사용하는 인덱스와 qery를 실행하는 방법을 확인하십시오. –

답변

2

이 필드 NULL을 남겨됩니다. OR을 사용하지 마십시오. UNION ALL을 사용하십시오.

select ... from ... where InTime < sometime and OutTime is > sometime 
union all 
select ... from ... where InTime < sometime and OutTime is null 

재해를 대비하는 방법은 NULL 대신 마술 값을 사용하는 것입니다. 최소한 스토리지를 더 많이 사용합니다. 더 구체적으로, 데이터베이스 제약 조건을 적용 할 때, 집계를 계산할 때 및 응용 프로그램에서 NULL의 의미를 파기합니다.

쿼리에서 OR을 사용하면 성능 문제가 발생합니다. optmizer는 모든 인덱스 범위 탐색을 스캔으로 전환합니다. 옵티마이 저가 NULL이 아닌 하나의 otpimal에 최적 인 두 개의 계획을 생성하고 UNION을 사용하기 때문에 일반적으로 UNION을 사용하면 더 좋습니다.

Intime 및/또는 OutTime에 대한 색인이 없으면 쿼리는 검색이되고 UNION은 OR보다 성능이 좋지만 그럴 가치가있는 시나리오는 아닙니다. 질문은 물론 에서 쿼리를 최적화하는 방법을 적절하게 설계된 스토리지입니다.

+0

원래 쿼리의 실행 계획을 유니온 모든 쿼리로 보는 경우. 노동 조합은 모두 일괄 처리에 비해 67 %입니다. – Spruce

+1

@ Spruce : IO 및 CPU 및 기간은 어떻게됩니까? % 친척은 때로는 오해의 소지가 있습니다. – gbn

+0

나는 이제 몇 가지 쿼리를 사용해 보았습니다. 하나는 인덱스 스캔과 하나는 인덱스 검색입니다. 두 경우 모두 union all 문은 쿼리를 두 번 실행 한 다음 배치에 대한 % 비용에 반영된 결과를 연결합니다. IO와 CPU는 union all 쿼리에 대해 두 배가 될 것으로 예상하므로 두 번 실행해야하기 때문입니다. 내가 놓친 게 있니? – Spruce