Sql server SQL Server中大型可空列的影响

Sql server SQL Server中大型可空列的影响,sql-server,performance,schema,storage,Sql Server,Performance,Schema,Storage,我正在设计一个模式,其中某些成员可以上传图像(基于权限)。我计划使用varbinary(max)列来实现这一点 下面两个设计中考虑的存储和性能的影响(除了显而易见的是,一个到多个)可以很容易地被约束。 具有可空varbinary(max)列的单个表 两个表,一个用于成员,第二个用于图片 显然,一个额外的左联会减缓性能,但是如果我使用一个表的方法,这将需要更多的存储空间(我通常不考虑存储大小太多的关注性能,但对于这个项目,我有相当严格的限制与我的主机提供商)。< /P> < P>存储图像在同一

我正在设计一个模式,其中某些成员可以上传图像(基于权限)。我计划使用
varbinary(max)
列来实现这一点

下面两个设计中考虑的存储和性能的影响(除了显而易见的是,一个到多个)可以很容易地被约束。

  • 具有可空
    varbinary(max)
    列的单个表
  • 两个表,一个用于
    成员
    ,第二个用于
    图片

显然,一个额外的左联会减缓性能,但是如果我使用一个表的方法,这将需要更多的存储空间(我通常不考虑存储大小太多的关注性能,但对于这个项目,我有相当严格的限制与我的主机提供商)。< /P> < P>存储图像在同一表中。将它们存储在单独的表中不会带来任何存储或速度方面的好处,除非您有无数的成员,其中10个成员将有一张图片

由于sql server在其值为NULL时根本不存储可为NULL的变量列,所以您甚至可以通过比较两个表的设计获得速度优势


如果图像足够大(比如超过1MB),可以考虑使用column。它允许将图像存储为文件,从而加快读写操作,但具有备份一致性。

更好的选择。。。将图像存储在磁盘上,并在Members表中添加具有文件名(路径)的可空字段。

空的可空列变量长度不占用表中的空间

当您存储BLOB时,它可能存储在行或行外,这取决于大小等。这适用于1个或2个表

如果您有一个单独的表,您还需要保存成员的主键(或者它有自己的键,FK in Members)。然而,与图片大小相比,这是微不足道的

就我个人而言,我会用一张桌子来保持简单

除非,比如说,我想使用FILESTREAM,或者使用其他文件组得到blob。

确定要在db中存储图像吗?目前是,以避免需要对硬盘驱动器的写入权限(同样不是我的服务器,所以我不确定我将拥有什么权限),并确保将来的迁移更容易,在这样做之前我会三思(或更多)。无论如何,两个表是正确的选择:您可能希望稍后向
user
表添加更多信息,您将为他上载的每个图像复制该数据。我不担心性能,这是数据库的工作。你能提供一个来源吗?您和Oleg提供了相互矛盾的建议,我不知道哪一个是正确的。如果您将所有内容存储在一个表中,那么通过从dbo.SingleTable执行
SELECT*,您将得到比您想要的多得多的数据,因为这也将返回所有图片。但除此之外:拥有一个表显然是简单的,这不是更好,而是可用的。因为如果你想得到一致的备份,你可能会失败。在这里,FILESTREAM BLOB是大文件的规则—性能和一致性+1—存储映像的正常方式,因为当备份一致性不是首要问题时,您可以提供源吗?你和Vulkanino提供了相互矛盾的建议,我不知道哪一个是正确的correct@Liath什么来源?带空值的可空列不使用空格?@Liath@Liath谢谢你,你先回答了,所以我给你答案。非常感谢!我会检查我是否可以在服务器上使用HD作为替代方案,但您的回答对于所问的问题是正确的。