一个复杂查询与多个简单查询

Posted

技术标签:

【中文标题】一个复杂查询与多个简单查询【英文标题】:One complex query vs Multiple simple queries 【发布时间】:2010-10-15 15:50:52 【问题描述】:

实际上什么更好?让具有复杂查询的类负责加载例如嵌套对象?还是具有简单查询的类负责加载简单对象?

对于复杂的查询,您不必去数据库,但该类将承担更多的责任。

或简单的查询,您需要更多地访问数据库。然而,在这种情况下,每个类都将负责加载一种类型的对象。

我的情况是加载的对象将被发送到 Flex 应用程序 (DTO)。

【问题讨论】:

【参考方案1】:

凭直觉我会说:

只要没有经过证实的优化性能的理由,就采用简单的方法。否则我会将“复杂对象和查询”方法放在过早优化的篮子中。

如果您发现存在真正的性能影响,那么您应该在下一步优化 flex 和后端之间的往返。但正如我之前所说:这是一种直觉,你真的应该从“性能”的定义开始,从简单开始并衡量性能。

【讨论】:

【参考方案2】:

这里的一般经验法则是服务器往返成本很高(相对于典型查询需要多长时间),因此指导原则是您希望尽量减少它们。基本上每个一对多连接都可能使您的结果集成倍增加,所以我的方法是继续连接,直到结果集变得太大或查询执行时间变得太长(通常大约 1-5 秒)。

根据您的平台,您可能会也可能无法并行执行查询。这是您应该做什么的一个关键决定因素,因为如果您一次只能执行一个查询,那么分解查询的障碍就会高得多。

有时值得在内存中保留某些相对恒定的数据(例如国家信息)或将它们作为单独的查询进行,但根据我的经验,这是相当不寻常的。

更常见的是不得不修复性能糟糕的系统,这在很大程度上是因为执行单独的查询(特别是相关的查询)而不是连接。

【讨论】:

【参考方案3】:

我不认为任何选项实际上更好。这取决于您的应用程序特定、架构、使用的 DBMS 和其他因素。

例如我们在独立解决方案中使用了多个简单查询。但是当我们将产品发展为轻量级的互联网可访问解决方案时,我们发现我们的框架发出了大量的请求,并且导致网络延迟的性能下降。因此,我们充分改造了我们的框架以使用聚合的复杂查询。同时,我们仍然维护我们的独立解决方案,并从 Oracle Light 迁移到 Apache Derby。我们再一次发现我们的一些新的复杂查询应该被简化,因为 Derby 执行它们的时间太长了。

所以看看你真正的问题并适当地解决它。我认为,如果没有针对它们的强烈目标,简单的查询很适合开始。

【讨论】:

以上是关于一个复杂查询与多个简单查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中另一种查询优化方案—重构查询的方式

树状数组

让MySQL查询更加高效——对查询进行重构

Entity Framework LINQ 复杂查询 - 组合多个谓词

Oracle 查询性能——多个复杂的窗口函数

关于树状数组