1

我在 ASP.NET (Umbraco CMS) 中建立了一个网站,它有一个竞赛模块。该公司每月举办大约两场比赛,每场比赛平均有约 15.000 名参赛者。这些参赛者存储在一个设计如下的数据库表中:

选手

Id
Name
ZipCity
Address
Country
Email
DateAttended

拉链城

Id
Zipcode
City

竞赛答案

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

每场比赛可以有一个问题和N多个答案选项。

我创建它以保存数据库中的记录数的方式是,对于每一个答案,我都会检查表中是否已经存在具有给定电子邮件的参赛者Contestant。如果有,我使用那个,如果没有,我创建一个新的参赛者。此外,对于每位参赛者,我都会检查所提供的邮政编码是否已经在ZipCity表格中并创建对其的引用。

即使我这样做了,而不是盲目地Contestant为每场比赛创建一个新的,数据库仍然被填满:-(我现在已经增加了两次容量,但一段时间后仍然得到同样的异常:

无法为对象...分配空间,因为文件组已满。

该公司希望为他们发起的每场比赛保留参赛者,因此在比赛结束后删除记录似乎不是一种选择:-/

所以,现在我一直想知道是否有更聪明的方法来存储这些大量数据?对此有什么想法?

非常感谢任何输入!

4

2 回答 2

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 设置为小于驱动器上的可用空间,这样您就不会达到边缘点。

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
于 2013-02-20T14:33:54.740 回答
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

于 2013-02-21T06:57:45.187 回答