2014-02-23 3 views
0

이 쿼리는 트랜잭션 로그를 25GB로 증가시킵니다. 데이터베이스가 SIMPLE 모드입니다.트랜잭션 로그 크기를 제어하기위한 쿼리 크기 제한

INSERT INTO updbl.dbo.PopulationRelatives 
    (personid, 
     personsex, 
     relativeid, 
     relativesex, 
     degree, 
     relationship, 
     maternalpaternal) 
    SELECT DISTINCT 
      personid = relative1, 
      relative1sex, 
      relative2, 
      relative2sex, 
      degree, 
      relationship = Rel1Rel2, 
      maternalpaternal 
    FROM UPDBwork.dbo.DegreeRelationship 

루핑을 통해 8GB로 성장을 제한 할 수있었습니다.

SELECT @PID = 0, @BatchSize = 1000000, @ROWCOUNT = 0 
SELECT @MaxPID = MAX(relative1) FROM updbwork.dbo.DegreeRelationship 
WHILE @PID < @[email protected] 
BEGIN 
INSERT INTO updbl.dbo.PopulationRelatives 
     (personid, 
      personsex, 
      relativeid, 
      relativesex, 
      degree, 
      relationship, 
      maternalpaternal) 
     SELECT DISTINCT 
       personid = relative1, 
       relative1sex, 
       relative2, 
       relative2sex, 
       degree, 
       relationship = Rel1Rel2, 
       maternalpaternal 
     FROM UPDBwork.dbo.DegreeRelationship 
     WHERE relative1 BETWEEN @PID+1 AND @[email protected] 
     SET @PID = @PID + @BatchSize 
CHECKPOINT 
END 

각 루프가 DISTINCT 값에 따라 다른 수의 행을 생성하므로 최적의 전략은 아닙니다. 불행히도 데이터를 분할 할 좋은 ID가 없습니다. 각 그룹의 크기를 제어 할 수있는 방법이 있습니까? TOP (X)를 추가하려고 생각했지만 엔진은 여전히 ​​DISTINCT 문을 충족시키기 위해 큰 계산을 수행해야합니다. 커서가 좋지만 다시 DISTINCT 값을 찾는 방법은 무엇입니까? 나는 단지 뇌가 여기에 몰려 오기를 바라고있다. 감사합니다. .

답변