分析ROR中获取关联集合size的SQL处理及疑问

本文探讨了Ruby on Rails (ROR) 和 Hibernate 在处理关联对象计数时的不同表现。ROR通过智能判断是否已初始化对象来减少不必要的数据库查询,而Hibernate则每次都会执行完整加载,可能影响性能。
假设现在有两个类A,B
[code]class A
  has_many :Bs, :class_name=>'B',:foreign_key=>'b_id'
end
a = A.find(:first)[/code]
  如果我仅想知道a.Bs.size()的话,那么在hibernate中就得单独写count语句来获取,如果使用a.getBS().size()的方式时,会先填充list,把所有Bs都初始化,也即会向数据库中发送.size()条SQL语句来初始化对象,影响性能。
  但在ror中,像上面使用a.Bs.size方法的时候,它会先判断Bs是否已经被初始化,如果已经初始化过,则直接返回Bs.size,不需要查询数据库。若尚未初始化,则发送一条count(*)语句,返回总的记录条数。这一点我感觉比hibernate要聪明。

在这个过程中发现一个有趣的现象:
[code]N.times do
  print("a.Bs.size=#{a.Bs.size}");
end[/code]
如果a.Bs是可以获取到数据的话,那么上面语句,会发送[color=red][b]N条[/b][/color]count(*)的SQL。
反之如果a.Bs是空集合,数据库中根本没有相关记录的话,那么系统只会发送[color=red][b]一条[/b][/color]count(*)的SQL。为什么呢?

思考了一下,ROR是否是这样处理的,如果a.Bs.size>0,则它认为在下次查询时仍然需要去发送count(*)SQL。反之如果a.Bs.size==0,则它认为没必要再去发送count(*)的SQL了?但还是觉得有些离奇。
[b]再次思考之后,是否是这样:如果第一次发现a.Bs.size>0,则它认为a.Bs是不为空的,但是先不去初始化它。而如果size==0,则它认为a.Bs是空值。直接就给a.Bs赋为空记录集了,所以再取a.Bs.size就不需要查询数据库了[/b]

[color=red][b]另外的一点是[/b][/color],如果代码改成:
[code]print((a.Bs[0] rescue nil));
N.times do
  print("a.Bs.size=#{a.Bs.size}");
end[/code]
则只会发送select * from xxx的SQL。相当于初始化了a.Bs集合。在这个基础上再计算a.Bs.size,则不会发送count(*)的SQL,直接返回a.Bs集合的长度了。

这该怎么解释才更合理呢????
考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值