在 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个。PostedBy
和Email
也可以截断到更合适的大小,我猜 path
最多也不应该超过 100 个字符。
另外,如果可能的话,我可能会将 PostedBy
、ContactPhone
和 ContactEmail
移动到新的 table(我可能会称之为 NewsAuthors
)并替换它们在新闻 table 中通过此 table 的外键。这有可能为您节省大量存储空间 space。
至于性能,存储大小通常不是问题,正如 NotMe 在评论中所建议的那样。
您可能可以通过在数据库上使用适当的查询和索引来显着提高性能。
一个很好的起点是 运行 您最常直接在 SSMS 上查询并查看执行计划。 sql 服务器可能会建议创建索引。如果是,请创建它们。
我有一个使用 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个。PostedBy
和Email
也可以截断到更合适的大小,我猜 path
最多也不应该超过 100 个字符。
另外,如果可能的话,我可能会将 PostedBy
、ContactPhone
和 ContactEmail
移动到新的 table(我可能会称之为 NewsAuthors
)并替换它们在新闻 table 中通过此 table 的外键。这有可能为您节省大量存储空间 space。
至于性能,存储大小通常不是问题,正如 NotMe 在评论中所建议的那样。
您可能可以通过在数据库上使用适当的查询和索引来显着提高性能。
一个很好的起点是 运行 您最常直接在 SSMS 上查询并查看执行计划。 sql 服务器可能会建议创建索引。如果是,请创建它们。