在 SQL 服务器中存储大数据的最佳方式

Best way to store large data in SQL Server

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

下面是我的table:

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,加载页面的速度越来越慢。

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

有没有办法将表示“[Description]”的表单值转换成一个文件,然后将路径存储到我的数据库中?

当然,您可以将文件存储在本地,然后 'link' 到数据库中。但是,如果您的应用程序和数据库不在同一台服务器上(数据库服务器应该针对文件存储进行优化,这就是文件应该去的地方),那么这种方法可能是错误的。首先,如果将 Description 字段存储在数据库外,您将失去所有查询和索引的可能性。其次,数据库服务器 "should" 足够强大来完成这项任务。您应该研究调整数据库引擎和服务器。

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

但我怀疑这是否真的有用。

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

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

一个很好的起点是 运行 您最常直接在 SSMS 上查询并查看执行计划。 sql 服务器可能会建议创建索引。如果是,请创建它们。