【问题标题】:Why are Many-to-Many joins so resource-consuming and how to predict requirements vs performance为什么多对多连接如此耗费资源以及如何预测需求与性能
【发布时间】:2017-07-29 10:15:02
【问题描述】:

在传统的 RDBMS 中, 为什么多对多连接比多对一连接消耗更多资源? 毕竟,多对多关系不就像两个多对一关系吗?

我观察到多对多查询在使用具有 3-4 GB RAM 的主流计算机时变得缓慢,超过了表中大约 10 到 15 百万行。 在查询多对一关系时,我观察到即使有 5000 万行也没有减速。

  • 如何根据预期性能预测内存和 CPU 需求? (是否有可用的基准?)
  • 过去哪些阈值值得使用其他解决方案? (MPP 或 NoSQL)

【问题讨论】:

  • 如果你想了解查询是如何执行的,那就学习使用explai
  • 感谢@Gordon-Linoff。解释命令真的可以预测内存和 CPU 需求并提供多对多关系的基准吗?
  • 一般来说是的,但这取决于数据库。
  • 我正在使用 postgresql。我会看看 explain 命令是否可以提供有关最佳内存和 cpu 要求的有效提示,也欢迎社区对此主题的任何反馈
  • @Gordon-Linoff,据我所知,粗略回顾一下 postgres 文档,即使转换为磁盘页面单位 (postgresql.org/docs/8.0/static/performance-tips.html),也会提供 CPU 工作量估计值,但我没有看到内存要求,也没有速度预测给定内存和 cpu 参数。

标签: sql query-optimization rdbms database-optimization


【解决方案1】:

在传统的 RDBMS 中,为什么多对多连接比多对一连接消耗更多资源?

当列列表的子行值也作为UNIQUE NOT NULL(超级键)出现在其他地方时,SQL FOREIGN KEY(FK)约束成立。因此,对于引用表中的每一行,被引用表中只能有一个匹配行。所以JOINON 相等的 FK 和它的超键的结果可以在 FK 表中的每行最多输出一行。而一般而言,由于 JOIN 返回可以从满足 ON 条件的输入行生成的行的所有可能组合,因此通常可以输出更多行。

毕竟,多对多关系不就像两个多对一关系吗?

不清楚你所说的“就像”是什么意思,或者你认为它如何暗示或证明任何事情。加入不是关系。 (一张表代表一种关系。)

  • 如何根据预期性能预测内存和 CPU 需求? (是否有可用的基准?)

许多 SQL DBMS 都有一个查询计划器/优化器 EXPLAIN 命令和其他命令,用于查询查询将做什么或做了什么或成本。

阅读有关(逻辑和物理)关系查询优化/实现的一般信息和任何特定 DBMS。维基百科恰好有a decent article。许多教科书都在线。

  • 过去哪些阈值值得使用其他解决方案? (MPP 或 NoSQL)

Re NoSQL 搜索我的答案,其中最新的是:
How to convert an existing relational database to a key-value store?
How does noSQL perform horizontal scaling and how it is more efficient than RDBMS scaling
Reasonable Export of Relational to Non-Relational Data

RDBMS 提供具有某些计算复杂性和优化机会的通用直接查询。相对而言,其他系统专业化,某些方面的改进是以牺牲其他方面为代价的。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多