【问题标题】:Best way to store large data in SQL Server在 SQL Server 中存储大数据的最佳方法
【发布时间】:2015-07-21 08:21:43
【问题描述】:

我有一个使用 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,加载页面变得越来越慢。

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

无论如何我可以将表示“[Description]”的表单值转换为文件,然后将路径存储到我的数据库?

【问题讨论】:

  • 我想我会花一些时间来了解占用空间的内容例如,您真的需要所有NVARCHAR(MAX) 列那么大吗?我无法想象你为什么需要这么大的电话号码和电子邮件。而且您似乎没有存储任何二进制数据。最后,你确定这是 data 大小并且不包括 log 大小吗?
  • "Slower to load the page"... 我将首先测量/分析用于加载页面的代码和 SQL 查询并确定瓶颈所在。只要您不扫描所有 8GB 以显示一页,数据库的大小并不重要。
  • 数据库的大小很少是性能瓶颈。特别是考虑到你的说法,它随着它的增长而变得越来越慢。正如弗拉基米尔所说,剖析它。然后你就会确切地知道问题是什么。我会在它与错误查询有关的情况下投入大量资金。

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


【解决方案1】:

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

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

但我怀疑这是否真的会有所帮助。

【讨论】:

  • 感谢 Otheus,我真的明白这一切。我在这里实际上并不清楚的是如何提取我的 html 表单字段(描述)的内容并将其保存在单独的文件中,同时存储到 db 的路径。
  • “提取我的 html 表单域的内容”——这是一个完全不同的问题。 “并将其保存在单独的文件中,同时存储数据库的路径”这确实是另一个问题。我在上面的答案的后半部分回答了部分问题。
【解决方案2】:

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

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

一个好的起点是直接在 SSMS 上运行最频繁的查询并查看执行计划。 sql server 可能会建议创建索引。如果有,请创建它们。

【讨论】:

  • 谢谢@zohar_peled,我真的明白这一切。我在这里实际上并不清楚的是如何提取我的 html 表单字段(描述)的内容并将其保存在单独的文件中,同时存储到 db 的路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2021-06-29
  • 2010-09-13
  • 2013-01-25
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多