2012-09-24 2 views
0

데이터웨어 하우스를 생성하는 데 사용할 수있는 C# .NET 시스템을 구축했습니다. 이 시스템은 선택한 데이터베이스를 가져 와서이 데이터베이스에 대해 스크립트를 실행하여 결합 된 데이터베이스 /웨어 하우스를 만듭니다.동적 SQL INSERT는 30 배 이상 소요됩니다.

이제 하나의 데이터베이스로 컴파일 할 3 개의 데이터베이스가 있고 각 테이블 ([XI] 및 테이블 [XII])에서 두 개의 테이블을 복사하고 있습니다. 일대 다 관계가 있지만 제약 조건은 설정되어 있지 않습니다. 복사 당시/INSERT INTO). 실행 스크립트 및 각 테이블의 관련 크기는 다음과 같습니다.

실행 된 스크립트는 30 개의 SQL 쿼리로 구성됩니다.

  1. DatabaseA :

    Table [XI] 29,026 Rows (size 20,128Kb). 
    Table [XII] 531,958 Rows (size 50,168Kb). 
    Time taken for entire script: 1.51s. 
    
  2. DatabaseB :

    Table [XI] 117,877 Rows (size 17,000Kb). 
    Table [XII] 4,000,443 Rows (size 512,824Kb). 
    Time taken for entire script: 2.04s. 
    

이들 모두 미세하고 빠른 실행합니다. 다음은 첫 번째와 거의 동일한 크기이지만 40 배는 오래 걸립니다!

  1. DatabaseC이 너무 오래 걸리는 이유

    Table [XI] 29,543 Rows (size 20,880Kb). 
    Table [XII] 538,302 Rows (size 68,000Kb). 
    Time taken for entire script: 44.38s. 
    

내가 운동을 할 수 없다. SQL Server 프로파일 러 및 성능 모니터를 사용했지만 성능이 크게 변한 이유를 자세히 설명 할 수는 없습니다.

업데이트를 수행하는 데 사용되는 쿼리가 동적이며이 질문의 맨 아래에 표시됩니다. 필수 열에 대한 명시 적 참조로 인해 커집니다. 내 질문은; 실행 시간이 과도하게 증가하는 원인은 무엇입니까?

모든 단서는 크게 감사하겠습니다.

SQL :

DECLARE @DbName NVARCHAR(128); 
SET @DbName = (SELECT TOP 1 [DbName] 
       FROM [IPACostAdmin]..[TmpSpecialOptions]); 
DECLARE @FilterSql NVARCHAR(MAX); 
SET @FilterSql = (SELECT TOP 1 [AdditionalSQL] 
        FROM [IPACostAdmin]..[TmpSpecialOptions]); 
DECLARE @SQL NVARCHAR(MAX); 
DECLARE @SQL1 NVARCHAR(MAX); 
DECLARE @SQL2 NVARCHAR(MAX); 
SET @SQL1 = 
    'INSERT INTO [' + @DbName + ']..[Episode] 
     ([Fields1], ..., [FieldN])'; 
SET @SQL2 = 
'SELECT 
    [Fields1], ..., [FieldN] 
FROM [B1A] ' + @FilterSql + ';'; 
SET @SQL = @SQL1 + @SQL2; 
EXEC(@SQL); 
GO 

참고 : 나는 명확성을 위해 @SQL1@SQL2에 동적 SQL을 분할하고있다. 또한 필자는 공간과 그것이 대부분 중복 될 것이라는 사실 때문에 모든 컬럼을 보여주지 않았다는 것을 주목하십시오.

편집 1.

1. 데이터베이스가 동일한 서버에 있습니다.

2. 로그를 포함하여 데이터베이스 파일은 동일한 드라이브의 동일한 디렉토리에 있습니다.

3. 소스 데이터베이스 (DatabaseA/B/C) 또는이 INSERT INTO시의 데이터웨어 하우스 데이터베이스에 설정 프라이/foriegn 키 또는 제약이 없습니다.

편집 2 나는 관리 스튜디오에서 위의 쿼리를 실행했고 5 초가 걸렸다!?

편집 3. 임시 CLUSTERED INDEX을 추가하여이 쿼리가 도움이 될 것이라는 희망을 갖게되었습니다.

1 :

+2

왜 2 수준 동적 쿼리를 사용합니까? 나는 단지 하나의 실행만으로 충분하다고 생각한다. 특별한 이유가 있습니까? –

+0

@SQL의 가치를 얻고 그것을 실행하여 얼마나 많은 시간이 걸리는지보십시오. – PraveenVenu

+0

나는 그렇다. 이 스크립트는 SQL 쿼리의 데이터베이스로 미리 컴파일되어 있습니다 ... 사실 지금 당장 그것을보고, 나는 내 이유가 사라 졌다고 생각하고, 나는 역학 SQL의 수준을 낮출 수 있습니다. 그러나 이것은 내 문제의 원인이 아닙니다. 시간 내 줘서 고마워. – MoonKnight

답변

0

이것은 DELETE 쿼리가 실행되어 이전에 CREATE CLUSTERED INDEX 쿼리에 전체 테이블을 업데이트 할 시간이 있었기 때문에 발생했습니다. 해결책은 BEGIN TRANSACTIONCOMMIT 키워드를 사용하는 것이 었습니다. 이로 인해 SQL 서버는 의 색인을 마치기 전에에 다른 작업을 시도합니다.

참고 :이 문제는 기존 테이블을 수정하는 동적 SQL 문을 사용하여 CREATE CLUSTERED INDEX 쿼리를 수행 할 때만 발생할 수 있습니다.

다른 사람에게 도움이되기를 바랍니다.

1

일부 정보는 알고 좋을 것 같은 서버에 데이터베이스인가?

2 : A와 C의 경우 db 파일과 로그 파일이 같은 드라이브에 있습니까?

는 (그들 중 하나가 SSD 드라이브와 HDD의 다른 하나 어디 한 번 나는 두 개의 데이터베이스에 문제가 있었다 즉, 데이터 읽기의 문제였다.)

3 : DB 통계를 분열에 대해?

+0

감사합니다. 질문에 대한 편집을 참조하십시오 ... – MoonKnight

+0

아, SSD 및 1TB 외장 HD로 실행 중입니다. 그러나 액세스되는 모든 데이터베이스는 HD에 있습니다 ... 이것은 다른 컴퓨터에서도 발생합니다 - 다른 구성으로 데이터 문제라고 생각되지만 진행 방법을 모릅니다. – MoonKnight

관련 문제