100多个表加入

时间:2010-06-03 01:57:14

标签: sql join

我想知道是否有人有过改变来测量100个联接表的表现如何? 每个表都有一个带有主索引的ID列,所有表都是1:1相关的。

在我们需要收集1000多个数据点的许多数据输入应用程序中,这是一个常见问题。一种解决方案是拥有一个包含1000多列的大表,另一种方法是将它们拆分为多个表,并在必要时将它们连接起来。

因此,或许更真实的问题是30个表(每个30列)如何使用多表连接。

500K-1M行应该是表的预期大小。

干杯

4 个答案:

答案 0 :(得分:4)

根据经验,任何超过25个连接可能是性能问题。我试图将联接保持在10-15以下。它取决于数据库活动和并发用户数以及读/写比率。

建议您查看索引视图。

对于任何调整良好的数据库,查询工作负载的“良好”索引是关键。

答案 1 :(得分:1)

他们很可能表现得非常糟糕,除非你每张桌子的行数非常少。

寻找更宽的表格,但要正确规范化。我的猜测是,如果你正确地规范化你的数据,你将会有一个更健全的设计。

答案 2 :(得分:0)

没有办法更好地组织表格?例如“DataPointTypes”和“DataPointValues”表?

例如(我不知道您的具体情况)如果您的所有表格都是“WebsiteDataPoints(WebsitePage,Day,Visits)”“StoreDataPoints(Branch,Week,Sales)”等,您可以改为< / p>

DataPointSources(Name) 
 (with data: Website,Store)

DataPointTypes(SourceId, ColumnName) 
 (with data: (Website, WebsitePage), (Website, Day), (Store, Branch), (Store, Sales) etc.)

DataPointEntry(Id, Timestamp)

DataPointValues (EntryId, Value(as varchar probably)) 
 (with data: (1, Website-WebsitePage, 'pages.php'), (2, Store-Branch, 'MainStore'), (1, Website-Day, '12/03/1980'), (2, Store-Sales '35') etc.)

这样每个表成为一个源,每列成为一个类型,每一行成为一个条目,每个单元格成为一个值。

答案 3 :(得分:0)

您所描述的内容与column-oriented database (wikipedia)的实施类似。数据以“列主要”格式存储,这会减慢添加每一行的速度,但在限制返回行集的where子句的情况下查询要快得多。

为什么你宁愿拆分行呢?是您在不同时间测量每行的数据元素?或者是一行的查询结果会非常大?

自从第一次发布此帖子以来,您在下面回答我,您希望分割表格的原因是您通常只使用数据的子集。

在这种情况下,拆分表可以帮助您提高性能(查询所消耗的运行时间)。这可能是您希望使用较少数据的一个重要因素 - 在数据库引擎以大行缓慢运行的情况下。

如果不考虑性能,而不是使用SQL JOIN,它可能会让您明确列出要在每个查询中检索的列。例如,如果您只想检索行的宽度,高度和长度,可以使用: SELECT width, height, length FROM datatable;而不是 SELECT * FROM datatable;,并且可以完成获得更少数据的相同改进。使用的SQL语句可能比我们考虑的替代连接语句短。