2011-08-08 3 views
2

많은 양의 데이터 (대부분 텍스트가 8 천 2 백 65 만 행, 총 8Gb)가있는 SQL Server 데이터베이스가 있습니다. 데이터는 주당 한 번만 변경됩니다. 여러 조건을 만족하는 행 수를 계산하는이 데이터에 대해 여러 SQL 쿼리를 실행하는 ASP.NET 웹 응용 프로그램이 있습니다. 데이터가 일주일에 한 번만 변경되기 때문에 일주일 동안 SQL 쿼리와 카운트 모두를 저장하는 가장 효율적인 방법은 무엇입니까? 데이터베이스 또는 응용 프로그램에 저장해야합니까?대용량 SQL 데이터의 쿼리 및 개수를 저장하는 가장 효율적인 방법

+0

BTW, 총 6500 만 행과 8GB의 총 크기가 실제로 큰 것은 아닙니다 ... –

+0

MS SQL Server는 구체화 된보기를 지원합니까? 그것은 하나의 아이디어 일 것입니다. (빠른 검색을 수행하고 [this] (http://stackoverflow.com/questions/1527141/how-to-mimick-oracle-materialized-views-on-ms-sql-server)를 찾았습니다.) – bart

답변

3

데이터가 일주일에 한 번 수정되는 경우 (ETL?) 프로세스의 일부 및 끝 부분에서 "기본"개수를 수행하고 결과를 데이터베이스의 테이블에 저장하십시오. 그런 다음, 큰 테이블에 대한 긴 쿼리가 아닌, 그 작은 요약 테이블을 쿼리 할 수 ​​있습니다.

0

쿼리는 복잡성에 따라 저장 프로 시저 또는 뷰로 저장해야합니다.

상황에 내가 indexed views.

로 보일 것이다 그들은 당신이 두 쿼리와 달리 인덱싱 할 수 없습니다 집계와 같은 것들에 대한 결과 집합을 저장할 수 있습니다.

보너스로 쿼리 최적화 프로그램에도이 데이터가 있다는 것을 "알고 있습니다". 따라서 다른 쿼리 (심지어 뷰를 직접 참조하지 않는 쿼리 포함)의 뷰 인덱스에 저장된 수나 다른 값을 확인하면 여전히 저장된 데이터를 사용합니다.

+0

인덱싱 된 뷰 수 매우 유용하지만, 나는이 상황에서 그들이 과잉이라고 생각한다. –

+0

@Mitch - 아마도. 그는 이러한 집계를 확인해야하는 빈도 나 개수가 얼마나되는지, 결과에 얼마나 많은 쿼리 활동이 있는지에 대해서는 말하지 않습니다. – JNK

2

당신이, 당신은 SQL 서버의 내부 정보를 조회 할 수있는 최신의 정확한 행 카운트 100 %가 필요하지 않은 경우 :

Select so.name as 'TableName', si.rowcnt as 'RowCount' 
from sysobjects so 
inner join sysindexes si on so.id = si.id 
where so.type = 'u' and indid < 2 

매우 실행할 신속하고 필요한 별도의 테이블. 많은 업데이트가 발생하는 곳에서는 정확하지 않지만 일 경우은 의도 한 용도로 충분히 정확할 수 있습니다. (여전히 빠른 인해 합계 느리지 만) 파고의 비트를했고이 정확한 카운트를 생산 않습니다 :

업데이트 [! 덧글에 감사드립니다]

SELECT OBJECT_SCHEMA_NAME(ps.object_id) AS SchemaName, 
     OBJECT_NAME(ps.object_id) AS ObjectName, 
     SUM(ps.row_count) AS row_count 
FROM sys.dm_db_partition_stats ps 
JOIN sys.indexes i ON i.object_id = ps.object_id 
         AND i.index_id = ps.index_id 
WHERE i.type_desc IN ('CLUSTERED','HEAP') 
AND OBJECT_SCHEMA_NAME(ps.object_id) <> 'sys' 
GROUP BY ps.object_id 
ORDER BY OBJECT_NAME(ps.object_id), OBJECT_SCHEMA_NAME(ps.object_id) 

Ref.

저장된 카운트 정보는 항상 100 % 2005에서 만든 새 테이블에 대한 SQL Server 2000에서 정확한 카운트가 정확 될 것을 기억하십시오. 그러나 2000 년에 존재하고 이제 테이블이 복원 또는 업데이트를 통해 2005에 상주하는 경우 (2005 년 이동 후 한 번만 실행해야 함) sp_spaceused @updateusage = N'true '또는 COUNT_ROWS가있는 DBCC UPDATEUSAGE 선택권.

+0

나는 이러한 쿼리의 결과가 항상 100 % 정확하다는 것을 확신하지는 않는다. 이 점에 대해 긍정적 인 증거가 있습니까? –

+0

빈번한 변경 사항이있는 경우 메타 데이터 행 개수가 100 % 정확하지 않습니다. OP의 상황 (매주 업데이트)에 대해서는 정확하지 않을 수 있습니다. – JNK

+0

@mitch - sysindexes는 현재 통계만큼 정확합니다. – JNK

관련 문제