2013-02-20 3 views
1

컨테스트 모듈이있는 ASP.NET (Umbraco CMS)에 웹 사이트를 구축했습니다. 회사는 매월 두 번의 대회를 시작하며 각 대회의 평균 참가자 수는 약 15.000 명입니다. 이 참가자는 다음과 같이 디자인 된 데이터베이스 테이블에 저장됩니다ASP.NET에 많은 양의 데이터 저장

참가자

Id 
Name 
ZipCity 
Address 
Country 
Email 
DateAttended 

ZipCity

Id 
Zipcode 
City 

ContestAnswer

Id 
AnswerNodeId (Umbraco node id) 
ContestNodeId (Umbraco node id) 
ContestantId 
Date 

각 경연 대회에는 하나의 질문과 N 개의 답변 옵션이있을 수 있습니다.

데이터베이스의 레코드 수를 절약하기 위해 작성한 방법은 매 응답마다 이미 주어진 전자 메일을 가진 참가자가 Contestant 테이블에 있는지 확인합니다. 있다면, 나는 그것을 사용하고, 그렇지 않다면, 나는 새로운 참가자를 만듭니다. 또한 모든 참가자에 대해 제공된 우편 번호가 이미 ZipCity 테이블에 있는지 확인하고 그 참조를 만듭니다.

모든 콘테스트에 대해 맹목적으로 새롭게 Contestant을 작성하는 대신이 방법을 사용 했더라도 데이터베이스는 계속 채워집니다 .--(용량을 두 번 늘렸고 잠시 후에도 동일한 예외가 발생합니다.

파일 그룹이 꽉 차서 ... 객체의 공간을 할당 할 수 없습니다.

이 회사는 종료 된 대회가 아닌 이후에 그렇게 기록을 삭제가 실행 각 경연 대회 참가자를 유지하고 싶어 옵션 : -/

이렇게 많은 양의 데이터를 더 똑똑하게 저장하는 방법이 있는지 궁금해했습니다. 이것에 대한 생각?

모든 입력 사항을 매우 높이 평가합니다.

+0

당신이 MongoDB를 또는 DynamoDB의 같은 NoSQL의 솔루션을 사용하여 생각 해 봤나 이러한 기사를 확인? –

+1

15000x2는 한 달에 "많은 양의 데이터"처럼 들리지 않습니다. 공간이 왜 그렇게 제한되어 있습니까? 새로운 하드 드라이브를 구입하는 것이 경제적 인 해결책을 찾기 위해 지불하는 것보다 훨씬 저렴할 것입니까? – spender

+0

한 달에 30000 개의 행이 "많은 양의 데이터"처럼 들리지 않습니다. 스토리지 공간이 왜 문제가됩니까? – Kai

답변

3

하드 드라이브 설정에 대해 잘 모릅니다.

http://blog.sqlauthority.com/2009/05/31/sql-server-create-multiple-filegroup-for-single-database/

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

첫 번째 링크는 개념을 설명합니다.

두 번째 링크는 구문을 보여줍니다. 당신이보고 싶을

3 개 항목은 다음과 같습니다

[ , SIZE = size [ KB | MB | GB | TB ] ] 
[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ] 
[ , FILEGROWTH = growth_increment [ KB | MB | GB | TB| % ] ] 

이유는 무엇입니까?

첫 번째 크기가 초기 크기입니다. 두 번째는 최대 크기입니다. 그리고 이것이 설정된 경우 하드 드라이브에 공간이있을 수 있지만 데이터베이스는 더 이상 사용하지 않게됩니다. 세 번째 것은 "maxsize 규칙을 위반하지 않은 경우 얼마나 커야합니까?"입니다.

지금. MAXSIZE를 UNLIMITED로 설정할 수 있습니다.

. 하드 드라이브가 가득 차면 오류가 발생하기 시작합니다.

따라서 dba를 재생하고 어떤 옵션이 가장 적합한 지 선택하십시오.
개인적으로 MAXSIZE를 드라이브의 여유 공간보다 작게 설정 했으므로 에지 지점에 도달하지 않습니다.

대상 : 다른 파일 그룹을 만들고 다른 파일 그룹에 다른 테이블을 넣을 수 있습니다. 하나의 테이블이 거대하지만 다른 테이블은 작을 것이라는 것을 알면 편리합니다.

그래서 ... 이미 MAXSIZE 설정이되어 있는지 확인하십시오.

그럼 테이블과 하드 드라이브, 파일 그룹 및 테이블로 룰렛을해야합니다.

공간 문제에 대한 다른 옵션으로 로그 파일을 다른 하드 드라이브에 저장할 수도 있습니다.

다음은 파일 그룹을 만든 다음 테이블을 새 파일 그룹으로 옮기는 좋은 샘플입니다. 다음은

http://www.daveturpin.com/2010/09/move-tables-to-new-filegroup/

내가 SQLCMD 모드를 사용하여 데이터베이스를 생성해야하는 스크립트입니다. 디렉토리가 "미리 존재"해야합니다 (실제로 SQL 서버에 있지 않은 경우 로컬 시스템이 아닌 서버에 있음).

:Setvar DBName MyFirstDatabase01 
:Setvar DataFilesBaseDirectory "C:\WUTemp\Some Folder\" 
:Setvar LogFilesBaseDirectory "C:\WUTemp\Some Folder\" 
:Setvar DatabasePrimaryDataFileStartSizeMB 9 
:Setvar DatabasePrimaryDataFileGrowthMB 8 
:Setvar DatabasePrimaryLogFileStartSizeMB 7 
:Setvar DatabasePrimaryLogFileGrowthMB 6 




Use [master]; 
GO 


if exists (select * from sysdatabases where name='$(DBName)') 
BEGIN 
     DROP DATABASE [$(DBName)]; 
END 

GO 



--Create Database $(DBName) 
--G--O 


DECLARE @device_directory_data NVARCHAR(520) 
DECLARE @device_directory_log NVARCHAR(520) 
--SELECT @device_directory_data = SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1) FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 
--SELECT @device_directory_log = SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1) FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 



select @device_directory_data = '$(DataFilesBaseDirectory)' 
select @device_directory_log = '$(LogFilesBaseDirectory)' 

print @device_directory_data 
print @device_directory_log 


EXECUTE (N'CREATE DATABASE $(DBName) 
    ON PRIMARY (NAME = N''$(DBName)'', FILENAME = N''' + @device_directory_data + N'$(DBName).mdf'', SIZE = $(DatabasePrimaryDataFileStartSizeMB) MB, FILEGROWTH = $(DatabasePrimaryDataFileGrowthMB)MB) 
    LOG ON (NAME = N''$(DBName)_log'', FILENAME = N''' + @device_directory_log + N'$(DBName).ldf'', SIZE = $(DatabasePrimaryLogFileStartSizeMB) MB, FILEGROWTH = $(DatabasePrimaryLogFileGrowthMB)MB)') 

DECLARE @logsize char(1) 
SELECT @logsize = CASE WHEN convert(varchar, Serverproperty('ProductVersion')) LIKE '9%' 
         --THEN '10' 
         --ELSE '5' 
         THEN '13' 
         ELSE '14' 

        END 


EXECUTE(N'ALTER DATABASE $(DBName) 
    ADD LOG FILE (NAME = N''$(DBName)_log2'', 
        FILENAME = N''' + @device_directory_log + N'$(DBName)log2.ldf'', SIZE = ' + @logsize + ' MB)') 


-- Make the database case sensitive to clean up the development effort 
-- EXECUTE(N'ALTER DATABASE $(DBName) COLLATE SQL_Latin1_General_CP1_CS_AS') 




exec sp_dboption '$(DBName)','trunc. log on chkpt.','true' 
exec sp_dboption '$(DBName)','select into/bulkcopy','true' 
GO 




GO 
+0

안녕하세요 granadaCoder, 답변 해 주셔서 감사합니다! :) 나는 기사를 읽고 결론에 도달했다 : 어쩌면 데이터의 양이 실제로 크지 않다! 솔루션은 중소 규모의 호스팅 제공 업체 일 수도 있습니다. 서버가 호스팅 회사에 의해서만 관리되기 때문에 용량 설정을 변경할 수는 없습니다. 관리자와 이야기하고 해결책을 찾을 수 있는지 알아 봅니다. – bomortensen

+0

확인. 네, 네가 호스팅 회사를 가지고 있다는 것을 몰랐다. 그런 다음 설정을 확인해야합니다. – granadaCoder

+0

잠시 동안 "로그 파일을 제거"해야 할 수도 있습니다. 그들이 공간 제한의 일부라고 생각하는지 확인해야합니다. 하지만 위의 정보로 생각하면 올바른 "전문 용어"를 사용하여 이야기 할 수 있습니다. 조언. 이것을 답으로 표시하지 않으면 사람들은 계속 답변하려고합니다. – granadaCoder

0

데이터 요구 사항이 줄어들 수있는 공간을 줄이는 측면에서 할 수있는 일은 많지 않습니다. 또한 심각한 제한이있는 일부 공유 SQL 호스팅을 사용하지 않는 한 매월 15k는 그리 많지 않습니다. 어쨌든 여기 불행히도 할 수있는 일이 많지 않습니다.

아마도 SQL Server 압축을 사용하도록 설정할 수 있습니다. 자세한 내용

http://www.bradmcgehee.com/2010/03/an-introduction-to-data-compression-in-sql-server-2008/

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

관련 문제