우리는 한 번에 여러 테이블에 수천 개의 행을로드하는 SQL Server 2008R2-SP1에서 가져 오기 저장 프로 시저를 실행하고 있습니다. tempDB
및 transaction log
크기에 문제가 있습니다. 이 같은sql server free tempdb
뭔가 :
CREATE PROCEDURE spReallyHugeImportDataProcedure
@id int
AS
BEGIN
CREATE TABLE #temp(...)
INSERT INTO #temp
SELECT *
FROM AlotOfJoins
INSERT INTO FinalTable
SELECT * FROM AlotOfJoins
DROP #tempTable
INSERT INTO #temp
SELECT *
FROM AlotOfJoins
INSERT INTO FinalTable
SELECT * FROM AlotOfJoins
DROP #tempTable
INSERT INTO #temp
SELECT *
FROM AlotOfJoins
INSERT INTO FinalTable
SELECT * FROM AlotOfJoins
DROP #tempTable
-- And so on....
END
우리는 작은 데이터 세트에 대해 여러 번 전체 프로세스를 분할하고 실행하려고합니다. 이처럼
:
CREATE PROCEDURE spReallyHugeImportDataProcedure
@id int
AS
BEGIN
DECLARE @SomeSortOfCounter int = 100
WHILE(@SomeSortOfCounter <> 0)
BEGIN
-- TRY TO START A NEW TRANSACTION
BEGIN TRAN
CREATE TABLE #temp(...)
INSERT INTO #temp
SELECT *
FROM AlotOfJoins
WHERE SomeFileterWorkinWithTheCounter = @SomeSortOfCounter
INSERT INTO FinalTable
SELECT * FROM AlotOfJoins
DROP #tempTable
INSERT INTO #temp
SELECT *
FROM AlotOfJoins
WHERE SomeFileterWorkinWithTheCounter = @SomeSortOfCounter
INSERT INTO FinalTable
SELECT * FROM AlotOfJoins
DROP #tempTable
INSERT INTO #temp
SELECT *
FROM AlotOfJoins
WHERE SomeFileterWorkinWithTheCounter = @SomeSortOfCounter
INSERT INTO FinalTable
SELECT * FROM AlotOfJoins
DROP #tempTable
-- And so on....
-- TRY TO RELASE TEMP OBJECTS,
-- OR GIVE TO THE SERVER THE OPORTUNITY TO DO IT
COMMIT
SET @SomeSortOfCounter = @SomeSortOfCounter - 1
END
END
는 SQL Server 엔진이 그 내부 거래 사이에 작업 할 수 있습니까?
임시 테이블을 사용하는 이유는 왜 직접 메인 테이블에 삽입 할 수 없는지입니다. 삽입 할 열을 알고 있기 때문에 문제가되지 않아야합니다. –
감사합니다 @Pradeep, 우리는 그 부분을 찾고 있습니다 만, 지금 당장 필요한 부분을 말하게하십시오. 우리가 직면하고있는 문제는 tempDB의 공간 부족 때문에 SQLServer 작업 시간을 줄이는 방법을 찾고 있습니다. – GBrian
temp db가 켜져 있고 가득 차있는 디스크의 크기는 얼마입니까? 임시 DB가 전용 드라이브에 있습니까? 서버 또는 로컬 컴퓨터에 있습니까? RDP/Management Studio를 통해 수행되는 서버이거나 로컬 컴퓨터에서 원격으로 실행되는 서버입니까? – Tanner