我想知道是否有人有过改变来测量100个联接表的表现如何? 每个表都有一个带有主索引的ID列,所有表都是1:1相关的。
在我们需要收集1000多个数据点的许多数据输入应用程序中,这是一个常见问题。一种解决方案是拥有一个包含1000多列的大表,另一种方法是将它们拆分为多个表,并在必要时将它们连接起来。
因此,或许更真实的问题是30个表(每个30列)如何使用多表连接。
500K-1M行应该是表的预期大小。
干杯
答案 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语句可能比我们考虑的替代连接语句短。