1

コンテスト モジュールを備えた ASP.NET (Umbraco CMS) で Web サイトを構築しました。同社は毎月約 2 つのコンテストを開始し、各コンテストには平均 15,000 人の参加者がいます。これらの競技者は、次のように設計されたデータベース テーブルに保存されます。

出場者

Id
Name
ZipCity
Address
Country
Email
DateAttended

ジップシティ

Id
Zipcode
City

コンテスト回答

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

各コンテストには、1 つの質問とN複数の回答オプションを含めることができます。

データベースにレコードの数を保存するために作成した方法は、すべての回答について、指定された電子メールを持つ競技者がContestantテーブルに既に存在するかどうかを確認することです。ある場合はそれを使用し、ない場合は新しい競技者を作成します。また、すべての出場者について、提供された郵便番号が既にZipCity表にあるかどうかを確認し、それへの参照を作成します。

Contestantコンテストごとにやみくもに新しいものを作成する代わりに、この方法でそれを行ったにもかかわらず、データベースはいっぱいになり続けます:-(容量を2回増やしましたが、しばらくしても同じ例外が発生します:

オブジェクトにスペースを割り当てられませんでした ... ファイル グループがいっぱいであるためです。

同社は、開始するコンテストごとに出場者を保持したいと考えているため、コンテストが終了した後に記録を削除するという選択肢はないようです :-/

それで、これらの大量のデータを保存するよりスマートな方法があるかどうか疑問に思っていましたか? これについての考えは?

どんな入力でも大歓迎です!

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

最初のリンクは概念を説明します。

2 番目のリンクは構文を示します。

見ておきたいのは以下の3点です。

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

なんで?

最初のものは初期サイズです。2枚目は最大サイズです。これが設定されている場合、ハードドライブに空き容量がある場合でも、データベースは成長しなくなります。3 つ目は、「maxsize ルールに違反していない場合、どのくらいの大きさに拡張するか」です。

今。MAXSIZE を UNLIMITED に設定できます。

でも。ハード ドライブがいっぱいになると、エラーが発生し始めます。

したがって、DBA をプレイして、最適なオプションを選択する必要があります。
個人的には、MAXSIZE をドライブの空き容量よりも小さい値に設定して、エッジ ポイントに到達しないようにします。

また、異なるファイル グループを作成し、異なるファイル グループに異なるテーブルを配置することもできます。これは、1 つのテーブルが巨大で、もう 1 つのテーブルが小さいことがわかっている場合に便利です。

そのため... 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

データ要件が低下する原因となる領域の削減に関してできることはあまりありません。また、深刻な制限がある共有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

于 2013-02-21T06:57:45.187 に答える