【发布时间】: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 中工作的查询和函数时间。我刚刚表明,对于某些类型的查询,从数学的角度来看,这种划分是有意义的。
标签: sql oracle relational-database bigdata sql-tuning