【发布时间】:2019-05-15 17:49:52
【问题描述】:
我们在一个模型中有多个范围。 随着数据库的增长,范围变得不可用。
在这种类型的查询中使用范围是问题开始的地方: where("devices.id IN (?)", ETC
以下是我们的一些范围:
scope :reserved, -> { joins("INNER JOIN reservations ON (devices.ipaddress = reservations.ip)") }
scope :in_dhcp_range, -> {
joins(
"INNER JOIN dhcp_ranges ON (devices.ipaddress >= dhcp_ranges.start_ip AND devices.ipaddress <= dhcp_ranges.end_ip)"
).distinct
}
scope :alternate_aws, -> {
joins("INNER JOIN awssubnets ON (devices.ipaddress <<= awssubnets.cidr)").distinct
}
scope :dhcp_full_calculation, -> {
where("devices.id IN (?)",
(Device.in_dhcp_range.select("devices.id") + Device.alternate_aws.select("devices.id")).uniq - Device.reserved)
}
当数据库只有 50,000 条记录时,这些范围有效。但是,超过 25 万条记录,我们在这个范围内存在性能问题:dhcp_full_calculation
rails 5.2.3,ruby 2.6.3,使用 postgres 数据库
【问题讨论】:
-
我相信这个想法很好,但我得到了这个错误:ArgumentError: Relation pass to #or must be structurely compatible。不兼容的值:[:select, :joins, :distinct]
-
优秀。如果您可以设置为答案,我可以投票。
标签: ruby-on-rails postgresql optimization activerecord