데이터웨어 하우스를 생성하는 데 사용할 수있는 C# .NET 시스템을 구축했습니다. 이 시스템은 선택한 데이터베이스를 가져 와서이 데이터베이스에 대해 스크립트를 실행하여 결합 된 데이터베이스 /웨어 하우스를 만듭니다.동적 SQL INSERT는 30 배 이상 소요됩니다.
이제 하나의 데이터베이스로 컴파일 할 3 개의 데이터베이스가 있고 각 테이블 ([XI] 및 테이블 [XII])에서 두 개의 테이블을 복사하고 있습니다. 일대 다 관계가 있지만 제약 조건은 설정되어 있지 않습니다. 복사 당시/INSERT INTO
). 실행 스크립트 및 각 테이블의 관련 크기는 다음과 같습니다.
실행 된 스크립트는 30 개의 SQL 쿼리로 구성됩니다.
DatabaseA :
Table [XI] 29,026 Rows (size 20,128Kb). Table [XII] 531,958 Rows (size 50,168Kb). Time taken for entire script: 1.51s.
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 배는 오래 걸립니다!
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 수준 동적 쿼리를 사용합니까? 나는 단지 하나의 실행만으로 충분하다고 생각한다. 특별한 이유가 있습니까? –
@SQL의 가치를 얻고 그것을 실행하여 얼마나 많은 시간이 걸리는지보십시오. – PraveenVenu
나는 그렇다. 이 스크립트는 SQL 쿼리의 데이터베이스로 미리 컴파일되어 있습니다 ... 사실 지금 당장 그것을보고, 나는 내 이유가 사라 졌다고 생각하고, 나는 역학 SQL의 수준을 낮출 수 있습니다. 그러나 이것은 내 문제의 원인이 아닙니다. 시간 내 줘서 고마워. – MoonKnight