[英]Storing great amount of data in ASP.NET
我在ASP.NET(Umbraco CMS)中建立了一個有競賽模塊的網站。 該公司每月舉辦兩場比賽,每場比賽平均有約15.000名參賽者。 這些參賽者存儲在數據庫表中,其設計如下:
選手
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
,數據庫仍然被填滿:-(我現在增加了兩倍的容量,並且在一段時間后仍然得到相同的異常:
無法為對象分配空間...因為文件組已滿。
該公司希望為他們推出的每個比賽保留參賽者,因此在比賽結束后刪除記錄似乎不是一個選項: - /
那么,現在我一直想知道是否有更智能的方法來存儲這些大量數據? 對此的想法?
任何輸入都非常感謝!
我們對您的硬盤設置了解不多。
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
在減少導致數據需求下降的空間方面,您無能為力。 此外,每月15k並不是真的,除非你在一些有嚴重限制的共享sql托管。 無論如何,不幸的是,你在這里做的並不多。
也許您可以嘗試啟用sql server壓縮。 查看這些文章了解更多詳情
http://www.bradmcgehee.com/2010/03/an-introduction-to-data-compression-in-sql-server-2008/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.