Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 每种对象的一个表,还是一个有许多列的表:哪一个最快?_Sql Server_Database Design - Fatal编程技术网

Sql server 每种对象的一个表,还是一个有许多列的表:哪一个最快?

Sql server 每种对象的一个表,还是一个有许多列的表:哪一个最快?,sql-server,database-design,Sql Server,Database Design,我必须在数据库中存储数据库中的四种对象。这些对象具有相同的心房: 名称(varchar2) 描述(varchar2) 文件(二进制blob) 也许我可以使用一个表来存储这些对象,添加一列来标识对象的类型,但我需要存储大量对象(>1000000或更多) 我的问题是哪种情况更适合提高性能?存储所有对象的表或每种对象的表 我将使用SQL Server 2005或2008。如果您只有四种不同类型的对象,并且它们的大小和数量都差不多,那么打破表不会有太多作用。您可以将表扫描的成本降低四倍,但您无论如何

我必须在数据库中存储数据库中的四种对象。这些对象具有相同的心房:

  • 名称(varchar2)
  • 描述(varchar2)
  • 文件(二进制blob)
也许我可以使用一个表来存储这些对象,添加一列来标识对象的类型,但我需要存储大量对象(>1000000或更多)

我的问题是哪种情况更适合提高性能?存储所有对象的表或每种对象的表


我将使用SQL Server 2005或2008。

如果您只有四种不同类型的对象,并且它们的大小和数量都差不多,那么打破表不会有太多作用。您可以将表扫描的成本降低四倍,但您无论如何都不想进行完全扫描。你将通过一个索引,然后它就不重要了

如果这四种类型在访问的大小、数量或频率上完全不同,那么将它们分开可能会使较小、数量较少的用户受益。查询频率更高。但在使用索引时,这需要有很大的偏差才能对性能产生影响

如果您决定拆分表,那么跨多个类型查询或稍后添加新类型将变得更加困难

另一方面,如果不需要跨多个类型进行查询(并且名称在所有对象类型中都不是唯一的),则无需将它们保存在单个表中

我注意到您没有“类型”列。如果需要区分这四种类型,您可能应该有一种。或者仅仅通过查看名称就可以做到这一点

名称是主键吗?
表大小对主键查找的性能影响很小。

如果您只有四种不同类型的对象,并且它们的大小和数量都差不多,那么打破表不会有太大影响。您可以将表扫描的成本降低四倍,但您无论如何都不想进行完全扫描。你将通过一个索引,然后它就不重要了

如果这四种类型在访问的大小、数量或频率上完全不同,那么将它们分开可能会使较小、数量较少的用户受益。查询频率更高。但在使用索引时,这需要有很大的偏差才能对性能产生影响

如果您决定拆分表,那么跨多个类型查询或稍后添加新类型将变得更加困难

另一方面,如果不需要跨多个类型进行查询(并且名称在所有对象类型中都不是唯一的),则无需将它们保存在单个表中

我注意到您没有“类型”列。如果需要区分这四种类型,您可能应该有一种。或者仅仅通过查看名称就可以做到这一点

名称是主键吗?
表大小对主键查找的性能影响很小。

纯卷不是将类似对象拆分为不同表的好理由,还有其他更好的方法来提高性能、索引和表分区


向表中添加一个类型列,维护和查询将更容易。

纯卷不是将类似对象拆分为不同表的好理由,有其他更好的方法来提高性能、索引和表分区


将类型列添加到表中,维护和查询将更容易。

创建一个主查找表,其中包含不同类型对象的名称和id。然后用id而不是name创建依赖表。您可以拥有一个表,并根据对象类型(id)对其进行水平分区


使用整数id而不是名称的好处是,您可以在同一个id上创建索引,这将大大加快查询速度(特别是您提到的表的大小)

为不同类型的对象创建一个带有名称和id的主查找表。然后用id而不是name创建依赖表。您可以拥有一个表,并根据对象类型(id)对其进行水平分区


使用整数id而不是名称的好处是,您可以在同一个id上创建索引,这将大大加快查询速度(特别是您提到的表的大小)

您的问题是性能,而不是方便性。
因此,最好为每个人单独安排一张桌子;这减少了每个索引中的记录数,您实际上是通过选择正确的表来进行筛选。

您的问题是性能,而不是方便性。
因此,最好为每个人单独安排一张桌子;这减少了每个索引中的记录数,您实际上是通过选择正确的表来进行筛选。

这些对象是真正等效的还是只是巧合地相似?把它们放在一起,你可能会做出不合理的假设。稍后,当您决定其中一种对象类型需要其他对象类型不需要的其他属性时,您可能会得到一个相当大的重新分解任务,或者得到填充稀疏的行


也要怀疑任何称为“描述”的字段,这是一种难闻的气味,表明建模不足。它往往被用作丢失属性的总括。我不主张过度建模,但许多有用的结构可以通过这种方式被掩埋。例如,我曾经不得不向一个产品数据库添加一些功能,该数据库根据“地区批准”进行一些处理。但是没有地域批准属性???与用户交谈后,很明显,他们使用自己设计的特殊代码系统将区域数据存储在描述字段中。

这些对象是真正等效的还是巧合相似的?把它们混为一谈