가동 중지 시간을 최소화하면서 대량의 데이터를 다시 가져 오는 가장 좋은 방법


11

일주일에 한 번 (3 개의 int / bigint cols) IP 조회 (읽기 전용 참조) 데이터가 포함 된 약 500,000 개의 레코드를 가져와야합니다.

기존 테이블과 데이터를 병합하는 것에 대해 걱정하고 싶지 않습니다. 이전 데이터를 지우고 다시 가져 오기를 선호합니다.

이상적으로 데이터를 통해 실행되는 쿼리는 계속 실행됩니다 (많은 것을 얻지 못하고 가져 오기가 발생하는 동안 약간 느리게 실행되는 것이 허용되지만 24/7 이상이어야 함). "시간 외"는 옵션이 아닙니다).

지금까지 시도한 것들

SSIS : 테이블을 자르고 가져 오는 SSIS 패키지를 만들었습니다. 실행하는 데 약 30 초가 걸립니다 (실제로 너무 오래 걸림).

임시 테이블 : 임시 테이블로 가져 오기, 잘라 내기 및 복사에 약 30 초가 걸립니다.

BCP : Bulk Import도 너무 느립니다 (어떤 이유로 SSIS보다 느립니다 (유지 보수가 없어도)-char-> int / bigint 트랜잭션과 관련이 있다고 생각합니다.

거울 테이블? 그래서 현재 뷰를 통해 테이블을 읽고 데이터를 미러 테이블로 가져 오고이 테이블을 가리 키도록 뷰를 변경하는 것이 궁금합니다. 이것은 빠르지 만 작은 것 같습니다. 조금 해키.

이것은 일반적인 문제인 것처럼 보이지만 권장되는 사례를 찾을 수 없습니다. 어떤 아이디어라도 가장 감사하겠습니다!

감사

답변:


13

과거에 사용했던 솔루션 (이전에 그리고 이전에 StackOverflow에서 권장 한 솔루션)은 두 개의 추가 스키마를 만드는 것입니다.

CREATE SCHEMA shadow AUTHORIZATION dbo;
CREATE SCHEMA cache  AUTHORIZATION dbo;

이제 cache스키마 에서 테이블의 모방을 만듭니다 .

CREATE TABLE cache.IPLookup(...columns...);

이제 스위치 작업을 수행 할 때 :

TRUNCATE TABLE cache.IPLookup;
BULK INSERT cache.IPLookup FROM ...;

-- the nice thing about the above is that it doesn't really
-- matter if it takes one minute or ten - you're not messing
-- with a table that anyone is using, so you aren't going to
-- interfere with active users.


-- this is a metadata operation so extremely fast - it will wait
-- for existing locks to be released, but won't block new locks
-- for very long at all:

BEGIN TRANSACTION;
  ALTER SCHEMA shadow TRANSFER    dbo.IPLookup;
  ALTER SCHEMA dbo    TRANSFER  cache.IPLookup;
COMMIT TRANSACTION;


-- now let's move the shadow table back over to
-- the cache schema so it's ready for next load:

ALTER SCHEMA cache TRANSFER shadow.IPLookup;
TRUNCATE TABLE cache.IPLookup; 

-- truncate is optional - I usually keep the data
-- around for debugging, but that's probably not
-- necessary in this case.

외래 키 및 기타 종속성이있는 경우 (더러운 키를 삭제하고 다시 만들어야하기 때문에) 통계가 완전히 무효화되고 계획에 영향을 줄 수 있지만 이는 계획에 영향을 줄 수 있지만 가장 중요한 것은 최소한의 중단으로 사용자 앞에서 정확한 데이터를 얻는 것입니다. 이것은 고려할 수 있습니다.


고마워, 또 다른 흥미로운 대안-마지막 두 문장이 옳지 않다고 생각합니다. 그림자로 캐시를 옮기고 캐시를 잘라야합니다. 동의어를 사용할 수 있는지 궁금합니다.
Mark

당신 말이 맞아요. 동의어가 어떻게 더 나은지 잘 모르겠습니다. 동일한 접근 방식이라고 생각합니다. 동의어를 가리키는 견해를 가지고 다른 버전을 채울 때 트랜잭션의 기본 동의어를 변경하십시오. 개인적으로 나는 이것을 조금 더 잘 발견한다. dbo.IPLookup을 쿼리 할 때 뷰와 동의어를 쫓지 않아도 "현재"테이블이라는 것을 알고있다.
Aaron Bertrand

참고로 나는 이번 주에 이것에 대해 더 자세히 블로그했다 : sqlperformance.com/2012/08/t-sql-queries/…
Aaron Bertrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.