2013-02-20 108 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

你有沒有考慮使用NoSQL的解決方案一樣的MongoDB或DynamoDB? – 2013-02-20 13:50:52

+1

15000x2一個月對我來說聽起來不像「大量數據」。爲什麼空間如此受限?不會購買新的硬盤比付出更多的費用便宜得多? – spender 2013-02-20 13:50:58

+0

每月30000行聽起來不像「大量數據」。爲什麼存儲空間成爲問題? – Kai 2013-02-20 13:52:10

回答

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設置爲UNLIMITED。

然而,硬盤驅動器填滿後,您將開始發生錯誤。

所以你得玩dba,並選擇哪個選項最好。
就個人而言,我會將MAXSIZE設置爲小於驅動器上的可用空間,因此您不會碰到邊緣點。

ALSO: 您可以創建不同的文件組,並將不同的表放在不同的文件組上。 如果您知道一張桌子很大,但另一張桌子很小,這很方便。

因此...檢查您是否已經設置了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 2013-02-20 14:40:02

+0

好的。是的,我不知道你有一家託管公司。然後他們將不得不檢查設置。 – granadaCoder 2013-02-20 14:45:41

+0

您可能需要每隔一段時間「清除日誌文件」。你必須看看他們是否認爲你的空間限制的一部分。但是我認爲,根據上面的信息,你會有正確的「術語」與他們交談。提醒。如果你不把這個標記爲答案,人們會一直試圖回答它。 – granadaCoder 2013-02-20 14:46:59

0

在減少可能導致數據需求下降的空間方面,您可以做的不多。 此外,每月15k是不是真的很多,除非你在一些共享的SQL宿主,有嚴重的限制。無論如何,不​​幸的是,你不能在這裏做很多事情。

也許你可以嘗試啓用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