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