将大表查询拆分为对表子集的多个查询是不是有意义?

Posted

技术标签:

【中文标题】将大表查询拆分为对表子集的多个查询是不是有意义?【英文标题】:Does it make sence to split big table querying into several queries to table subsets?将大表查询拆分为对表子集的多个查询是否有意义? 【发布时间】:2015-09-23 13:43:02 【问题描述】:

假设我们在关系数据库中有一个大表,我们需要查询。

我们有两个选择:

查询整个表 查询表内的数据子集,即从 1 到 1000 的行,然后是 1001 到 2000 等的行。

这种分离有意义吗?

是否取决于查询结构?

让我们添加一些数学。给定一些查询执行时间与 n^3 成正比,其中 n 是表中的行数。这意味着在第一种情况下查询执行时间与 n^3 成正比。至于第二个选项 - 它不同。总时间将是 (n/3)^3 + (n/3)^3 + (n/3)^3 = n^3 / 9 更好。

现实生活更复杂:在这种情况下查询不会相同,我们必须花一些时间将行限制为子集。

此外,数据库的连接数和并发性可能会受到限制,因此我们将无法同时通过 10 个查询来同时查询它,例如,至少以相同的速度。

但是这些理由有意义吗?这可能有助于减少一些大桌子的时间费用吗?

【问题讨论】:

你是真的检索整个表,还是应用条件;如果您要过滤,您过滤的列上是否有索引?你从哪里得到 n^3 的数字? 我认为无法回答这个问题,因为它非常依赖于数据和数据库的设置。我能提供的最好的建议是尝试两种方式并选择最有效的方法。祝你好运。 另外,你的数学是关闭的。 (n/3)^3 = (n^3)/27。但是,我没有看到任何支持您的断言“查询执行时间与 n^3 成正比”。你从哪里得到那个的?为什么它不是“与 n 成正比”或“n^2”或“e^n”或“n^e”?此外 - 此表中有多少行?或者,“大”是什么意思? 如果从业务角度来看有意义,请考虑对表进行分区。 嗯,n^3 表示法只是一个例子。通常我们不能说当行数增加时查询执行时间如何变化。例如,如果我们在索引表中搜索一行是 log(n),如果获取所有表是 n,我猜 SQL 中有可能在 n^2 甚至 n^3 中工作的查询和函数时间。我刚刚表明,对于某些类型的查询,从数学的角度来看,这种划分是有意义的。 【参考方案1】:

这取决于很多标准。其中一些是:

    数据库有多忙?那是多少并行查询 跑步吗?

    原因:如果有大量查询正在运行,或者任何查询有多个并行会话,那么在大表上查询会很慢,而在小表上查询会更快。

    大表被分成了多少个小表?

    原因:这里要考虑的一点是,如果一张大桌子被分割 分成几个小表并在每个较小的表上运行查询,然后需要聚合各个结果。这可能需要一些时间,具体取决于查询。

    正在执行的查询类型

    原因:如果您正在对列运行具有过滤条件的查询,并根据该列的值划分大表,那么您可以根据查询条件跳过一些表并从而减少输出时间

总体而言,在这种情况下,最好对表进行分区,而不是将大表分成较小的表。 Range Partition 可用于更大的表以加快查询执行速度。

【讨论】:

以上是关于将大表查询拆分为对表子集的多个查询是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:将大表拆分为分区或单独的表?

SQL性能问题.现在表设计可以把一个大表按类型(各类型字段不相同)拆分成多个小表.拆分后比较方便.

从大表的子集中对随机行进行最快查询 - postgresql

如何捕捉数据库错误并将其转化为对业务层有意义的信息?

Oracle中事务的处理,比如要对表A操作,我先查询在更新,是不是需要将查询放在事务,求高手解答!

MySQL 性能:在大表中排序很慢,即使过滤的子集很小