每种对象的表,或具有多列的单个表:哪个是最快的?

时间:2009-03-09 08:21:13

标签: sql-server database-design

我必须在数据库上存储四种对象的数据库。这些对象具有相同的属性:

  • 名称(varchar2)。
  • 描述(varchar2)。
  • 文件(Binary blob)。

也许我可以使用表来存储这些对象,添加一列来识别对象的类型,但我需要存储大量对象(> 1,000,000或更多)。

我的问题是哪种方案更能提高性能?用于存储每种对象的所有对象或表的表。

我将使用SQL Server 2005或2008。

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

如果您只有四种不同类型的对象,并且它们的大小和数量大致相同,那么打破表格就不会做太多。您可以将表扫描的成本降低四倍,但无论如何您都不希望进行全面扫描。你会看一个索引,然后没​​关系。

如果这四种类型的大小,数量或访问频率完全不同,将它们分开可能会使较小的,较少的数据受益。更频繁的查询。但是,在使用索引时,这需要对性能产生影响。

如果您决定拆分该表,则在多个类型中查询或稍后添加新类型变得更加困难。

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

我注意到你没有“类型”列。如果你需要区分四种类型,你应该有一个。或者这可以通过查看名称来完成吗?

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

答案 2 :(得分:2)

这些物体是真正相同还是恰巧相似?通过将它们整合在一起,您可能会做出不合理的假设。稍后当您确定其中一个对象类型需要其他对象不需要的其他属性时,您可能最终会得到一个相当大的重新分解任务,或最终会出现稀疏填充的行。

还要怀疑任何一个叫做“描述”的字段,这是一种难闻的气味,表明模型不足。它往往被用作捕获所有缺失属性。我不提倡过度建模,但是很多有用的结构都可以这样埋没。例如,我曾经不得不在产品数据库中添加一些功能,这些功能基于“区域批准”进行了一些处理。但是没有领土批准属性???在与用户交谈后,很明显他们使用他们设计的特殊代码系统将领土数据存储在描述字段中。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

你的问题是关于表现,而不是方便。 因此,每个单独的表格最好;这减少了每个索引中的记录数,并且您实际上是通过选择正确的表来自行进行过滤。