在SQL Server中存储大数据的最佳方法

时间:2015-05-10 22:35:54

标签: c# asp.net sql-server asp.net-mvc-4 filepath

我有一个用ASP.NET MVC创建的新闻网站。

以下是我的表格:

CREATE TABLE [dbo].[News] (
[NewsID]         INT            IDENTITY (1, 1) NOT NULL,
[InstitutionID]  INT            NOT NULL,
[Title]          NVARCHAR (450) NOT NULL,
[NewsDate]       DATETIME       NOT NULL,
[Description]    NVARCHAR (MAX) NULL,
[path]           NVARCHAR (MAX) NULL,
[PostedBy]       NVARCHAR (MAX) NULL,
[ContactPhone]   NVARCHAR (MAX) NULL,
[ContactEmail]   NVARCHAR (MAX) NULL,
[NewsExpiryDate] DATETIME       NOT NULL,
CONSTRAINT [PK_dbo.News] PRIMARY KEY CLUSTERED ([NewsID] ASC),
CONSTRAINT [FK_dbo.News_dbo.state_InstitutionID] FOREIGN KEY ([InstitutionID]) REFERENCES [dbo].[state] ([InstitutionID]) ON DELETE CASCADE );

我注意到我的数据库已增加到8GB,加载页面的速度越来越慢。

我正在考虑将新闻存储在文件中,然后将路径保存在数据库中。

无论如何,我可以转换表示" [描述]"到一个文件,然后将路径存储到我的数据库?

2 个答案:

答案 0 :(得分:2)

当然,您可以在本地存储文件,然后在数据库中“链接”它们。但是,如果您的应用程序和数据库不在同一台服务器上,那么这种方法可能是错误的(数据库服务器应针对文件存储进行优化,这就是文件应该去的地方)。首先,如果将Description字段存储在off-db之外,则会丢失所有查询和索引的可能性。其次,数据库服务器“应该”足够强大,可以完成这项任务。您应该考虑调整数据库引擎和服务器。

让我们假设你已经完成了所有这些。您需要确保您的应用程序(连接到数据库的东西)可以写入和读取这些文件。您可能需要设置一个具有足够空间的顶级目录。您应该注意权限/安全性 - 谁可以读/写这些文件。最后,您需要一个存储文件和创建这些文件的方案。一个典型的方案是将描述转换为散列(md5在这里可以,sha256最好)并使用散列作为文件名。你砍掉文件名,使它包含2或3级目录(大目录通常会使某些系统失速):所以ab2442vc25变为a/b2/442vc25。将您的说明存储在那里,并将路径名称存储在Description_path中。在这些情况下保持Description为空。

但我怀疑这实际上会有所帮助。

答案 1 :(得分:0)

评论中指出John Saunders,您滥用nvarchar(max)。 如果Title可以存储在450个字符中,那么ContactPhone肯定可以存储在少于20个字符中。PostedByEmail也可以被截断为更合适的大小,我猜测path最多也不应超过100个字符 另外,如果可能的话,我可能会将PostedByContactPhoneContactEmail移动到新表(我可能称之为NewsAuthors)并在新闻表中替换它们通过此表的外键。这有可能为您节省大量存储空间。

至于性能,存储大小通常不是问题,因为评论中提到了NotMe 您可以通过在数据库上使用适当的查询和索引来显着提高性能。

一个好的起点是直接在SSMS上运行最常见的查询并查看执行计划。 SQL Server可能会建议创建索引。如果是的话,创建它们。