2016-12-16 1 views
1

SQL 2014를 사용하고 있는데 현재 id 열의 최소 및 최대 값을 반환하려고합니다. id 열은 기본 키이며 클러스터되지 않은 고유 한 인덱스가 있습니다. 내 테이블에는 206,923,208 개의 레코드가 있으며 계속해서 성장하고 있습니다. 나는 그것 여전히이 시간 이후 6+ 분을 복용 ID의 최소 및 최대를 찾을 수 있지만, 651,315 레코드를 반환 위에 나는 또한 내 레코드 선택을 바탕으로큰 테이블 최소/최대

select min(id) from tier_post (nolock) 
where created_datetime >= '2016-11-13' and created_datetime <= '2016-11-15' 

아래에 날짜를 만드는 예제 코드를 기반으로 내 기록을 선택하고 내가 스크립트를 중지했습니다

처음에는 같은 select 문에서 min과 max를 사용하고있었습니다. 그러나이 명령문은 더 느리게 실행되어 여전히 시도하고 해체하고 개별적으로 실행한다고 생각합니다.

혼란스럽게도이 테이블은 SSIS 패키지를 통해 5 분마다 지속적으로 채워지므로 내 스크립트가이 기간 동안 실행될 때 문제가 발생할 가능성이 있습니다.

누구나 이와 비슷한 문제가 발생 했습니까?이를 수정하는 방법에 대한 아이디어가 있습니까?

감사합니다.

+2

어떤 색인을 사용할 수 있습니까? – BishNaboB

+0

안녕하세요 BishNaboB, 고유 한 클러스터되지 않은 인덱스 및 unique_ 클러스터되지 않은 인덱스 created_datetime – PJD

+0

고유 한, 클러스터되지 않은 인덱스가 있습니다. NOLOCK, 특히 테이블에 지속적으로 기록됩니다 알고있는 경우주의해야합니다. 그게 여기서 문제가되는지는 모르지만 NOLOCK의 위험성을 읽어야합니다. 실행 계획은 어떻게 생겼습니까? 어떤 색인을 사용하고 있습니까? –

답변

0

id에 대한 색인이 있습니다.

나는 이 아닌데,은 created_datetime에 대한 색인입니다. 이드의 색인은 당신이 이드를보고 있지 않다면 좋지 않습니다.

created_datetime에 색인을 생성하십시오. 2 억 개의 레코드가있는 테이블의 경우 상당한 시간이 걸릴 수 있습니다. 이 쿼리

1

는 :

select min(id) 
from tier_post (nolock) 
where created_datetime >= '2016-11-13' and created_datetime <= '2016-11-15'; 

당신은 인덱스를 원한다. 나는 tier_post(created_datime, id)에 색인을 추천 할 것입니다.

참고 : 206,923,208 개의 행이있는 테이블에서 인덱스를 만드는 데 몇 분이 걸릴 것입니다. 전체 테이블을 읽어야하고 시스템에 시간이 걸리는 것 같습니다.

1

여기에 제안 된 색인 및 파티셔닝 외에도 많은 양의 데이터 세트이므로 명시 적 캐스팅을 통해 런타임시 문자열을 datetime으로 변환 할 필요가 없으므로 쿼리를 도움이 될 것입니다. 다음과 같이 사용하십시오 :

declare @start_date datetime, @end_date datetime 
set @start_date = '2016-11-13' 
set @end_date = '2016-11-15' 

select select min(id) 
from tier_post (nolock) 
where created_datetime >= @start_date 
and created_datetime <= @end_date; 
+0

[데이터 형식 우선 순위] (https://msdn.microsoft.com/en-us/library/ms190309.aspx)에 대한 규칙에 따르면 문자열은'datetime's로 변환됩니다 ('created_datetime'은, 사실,'datetime'). 쿼리 최적화 프로그램은 이들이 상수라는 것을 인식하고 변환을 한 번만 수행합니다. – HABO