문제

최선의 방법으로 테이블로 바꾸고 싶습니다.
IPTOCONTRY 테이블이 있으며 가져 오는 외부 CSV 파일에 따라 매주 새로운 테이블을 만듭니다.

내가 스위치를 만드는 가장 빠른 방법은 다음을 수행하는 것입니다.

sp_rename IpToCountry IpToCountryOld
go
sp_rename IpToCountryNew IpToCountry
go

이것의 문제는 테이블이 여전히 그 사이에 액세스 될 수 있다는 것입니다.
SQL 에서이 문제에 어떻게 접근합니까?
SP_GETAPPLOCK 및 SP_RELEASEAPPLOCK 사용을 고려하지만 테이블 기능을 최대한 빨리 읽고 싶습니다.

도움이 되었습니까?

해결책

기존 테이블에 업데이트/삽입 할 수 없다고 가정하면 보다?

예를 들어, 처음에는 데이터를 부르는 테이블에 저장할 수 있습니다. IPTOCONTRY20090303, 당신의 견해는 다음과 같습니다.

CREATE VIEW IpToCountry
AS
SELECT * FROM IpToCountry20090303

새 데이터가 들어 오면 IPTOCONTRY20090310 테이블. 테이블이 채워지면보기를 업데이트하십시오.

ALTER VIEW IpToCountry
AS
SELECT * FROM IpToCountry20090310

스위치는 명백한 잠금 또는 트랜잭션이 필요하지 않고 완전히 원자가됩니다. 보기가 업데이트되면 이전 테이블을 버릴 수 있습니다 (또는 원하는 경우 보관하십시오).

다른 팁

달성하고자하는 것을 구현하는 또 다른 방법은 SQL Server의 엔터프라이즈 에디션에서 사용할 수있는 기술인 테이블 파티셔닝을 사용하는 것입니다.

테이블 이름은 동일하게 유지 될 수 있습니다. 테이블 가져 오기가 완료된 후에는 기존 데이터가 포함 된 파티션을 전환하고 새 파티션에서 전환합니다.

다음 백서에는 시작하는 데 필요한 모든 정보가 포함되어 있습니다.

http://msdn.microsoft.com/en-us/library/ms345146.aspx

건배, 존

나는 규모로 일하기 위해 분할 기능을 얻는 데 문제가있었습니다. 생성 및 드롭 파티션은 차단 작업이며 차단을 거의 제어 할 수 없으며, 잠금을 얻을 수 없으면 심각도 레벨 16으로 실패하고 연결을 죽일 수 있습니다. 연결. 그러나 그것은 당신에게 잘 작동 할 수 있습니다. 또한 MSS Enterprise Edition이 필요하며 SE를 사용할 수 없습니다. 비용이 많이 들거나 비용이 많이 드는 상점에서는 너무 많을 수 있습니다.

또한 SYS 테이블 및 객체에서 고 스케일 (= 트랜잭션 볼륨 + 끊임없이 삽입 된 데이터의 끊임없는 양)에서 차단하는 View Redef를 찾았으므로 해당 작업은 Reindexing 및 DTCCS와 같은 것들에 대한 교착 상태가 될 수 있습니다. 그리고 어떤 경우에는, 특히 SSMS의 사용자가 객체 탐색기에서보기를 탐색하려고 노력합니다 (누군가가 그 사람들에게 ReadPast에 대해 말해야합니다). 다시 말하지만, 마일리지는 다를 수 있습니다.

대조적으로, sp_rename은 규모로 잘 작동합니다. 잠금과 그 범위를 제어 할 수 있습니다. 스왑 전에 차단 문제를 해결하려면 아래와 같이 시도하십시오. 액면가에서 이것은 대량으로 동일한 스케일 문제가있는 것처럼 보이지만 실제로는 보지 못했습니다. 그래서 저를 위해 일하지만 ... 다시 말하지만, 모든 사람의 요구와 경험은 다릅니다.

DECLARE @dummylock bit 
BEGIN TRANSACTION 
BEGIN TRY
   -- necessary to obtain exclusive lock on the table prior to swapping
   SELECT @dummylock = 1 WHERE EXISTS (SELECT 1 FROM A WITH (TABLOCKX))
   -- may or may not be necessary in your case
   SELECT @dummylock = 1 WHERE EXISTS (SELECT 1 FROM B WITH (TABLOCKX))
   exec sp_rename 'A', 'TEMP'
   exec sp_rename 'B', 'A'
   exec sp_rename 'TEMP', 'B'
   COMMIT TRANSACTION
END TRY
BEGIN CATCH
   -- other error handling here if needed
   ROLLBACK TRANSACTION 
END CATCH

IPTOCONTRYOLD는 어떻게됩니까? 당신은 그것을 버리나요? 이 경우 IPTOCONTRY를 자르고 새 데이터를 가져 오지 않겠습니까?

데이터를 유지 해야하는 경우 테이블에로드 날짜를 저장하고 WHERE 절에 사용할 "현재"로드 날짜를 저장하는 것은 어떻습니까? 그런 다음 데이터가 성공적으로로드 된 경우 현재 날짜를 전환합니다.

당신은 어떤 DB를 사용하고 있는지 말하지 않으므로, 이것을 얼마나 많이 사용하는지 모르겠지만 테이블을 참조하는 저장된 절차가 있습니까? 일부 플랫폼에서 SPS는 이름 변경으로 변경되지 않는 테이블에 대한 내부 참조를 사용하여 컴파일되므로 SPS가 다시 컴파일하지 않고 새 데이터를 선택하지 않을 위험이 있습니다. 뷰와 저장된 구문 분석 쿼리에 대해서도 마찬가지입니다.

쉬는 시간 동안 한 테이블로 가져올 수 없습니까?

또는 데이터 업데이트를 수행하지 말고, 즉 기존 레코드를 업데이트하고 데이터를 가져 오기 위해 루프 할 때 레코드별로 새로운 레코드를 추가하십시오. 이를 통해 테이블은 라이브를 유지하고 전체 테이블을 추가하고 떨어 뜨리는 전반적인 영향을 줄일 수 있습니다.

가져 오는 데이터의 구조, 테이블 디자인, 형식, PK 등은 무엇입니까? 그로부터 우리는 당신에게 더 나은 답을 줄 수 있습니다.

적절한 잠금으로 스케일링하는 문제가있는 스테이징 테이블에서 작업하는 유사한 문제에 만났습니다.

테이블이 참조되는 모든 곳에서는 테이블 이름을 요구하는 저장된 절차를 호출 할 수 있습니다.

저장된 절차는 선택적으로 새 테이블을 생성하거나 제공된 매개 변수에 따라 이전 테이블을 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top