【发布时间】:2009-09-02 17:39:24
【问题描述】:
有类似的问题,但我认为没有人问过这个特定的问题。
场景:
客户 - 订单(其中订单有客户 ID) - OrderPart - 零件
我想要一个返回客户及其所有订单和每个订单及其零件的查询。
现在我有两个主要选择:
- 使用嵌套循环(生成单独的查询)
- 使用数据加载选项(生成单个查询连接)
问题:
大多数关于 ORM 的建议和示例都建议使用选项 2,我明白为什么。但是,选项 2 可能会发回大量重复数据,例如:
选项 1 结果(3 个查询):
ID 名称 国家 1 个客户 1 个英国 身份证名称 1 订单1 2 订单2 身份证名称 1 第 1 部分 2 第 2 部分 3 第 3 部分
选项 2 结果(1 个查询):
ID 名称 国家 ID 名称 ID 名称 1 客户 1 英国 1 订单 1 1 第 1 部分 1 客户 1 英国 1 订单 1 2 第 2 部分 1 客户 1 英国 1 订单 1 3 第 3 部分 1 客户 1 英国 2 订单 2 1 第 1 部分 1 客户 1 英国 2 订单 2 2 第 2 部分
选项 1 发回 13 个字段和 3 个查询。选项 2 在 1 个查询中发回 42 个字段。现在想象一下 Customer 表有 30 个字段,而 Orders 有更复杂的子连接,数据重复很快就会变得巨大。
以下因素对整体性能有何影响:
- 建立数据库连接的开销
- 发送数据所花费的时间(如果在不同的服务器上,可能会通过网络)
- 带宽
选项 2 始终是最佳选择,选项 1 是最佳选择还是取决于具体情况?如果视情况而定,您应该使用什么标准来确定?是否有足够聪明的 ORM 可以自己解决?
【问题讨论】:
-
此查询/方案多久运行一次?数据库回答这两个选项有多难(基于数据库负载和数据量)?任何答案(对于现实世界)都需要考虑这些以及更多方面。
标签: sql performance orm