【发布时间】:2013-09-14 22:15:32
【问题描述】:
我一直在为同样的问题苦苦挣扎——在 Rails 中执行高效查询。我目前正在尝试对具有 500,000 条记录的模型执行查询,然后提取一些有关返回结果的描述性统计信息。
概述: 我想提取一些符合一组标准的产品。然后我想...
- 计算记录数(如果没有我想禁止某些操作)
- 确定匹配记录的最高和最低价格并计算落在特定范围内的商品数量
就目前而言,这组命令比我希望的要长得多(在我的台式计算机上本地运行 26000 毫秒)并且涉及 8 或 9 个活动记录操作,每个操作大约需要 3000 毫秒
是我做错了什么导致处理速度如此缓慢吗?任何建议都会很棒
我的控制器中的代码是:
filteredmatchingproducts = Allproduct.select("id, product_name, price")
.where('product_name LIKE ?
OR (product_name LIKE ? AND product_name NOT LIKE ? AND product_name NOT LIKE ? AND product_name NOT LIKE ? AND product_name NOT LIKE ? AND product_name NOT LIKE ?)
OR product_name LIKE ? OR product_name LIKE ? OR product_name LIKE ? OR product_name LIKE ? OR (product_name LIKE ? AND product_name NOT LIKE ?) OR product_name LIKE ?',
'%Bike Box', '%Bike Bag%', '%Pannier%', '%Shopper%', '%Shoulder%', '%Shopping%', '%Backpack%' , '%Wheel Bag%', '%Bike sack%', '%Wheel cover%', '%Wheel case%', '%Bike case%', '%Wahoo%', '%Bicycle Travel Case%')
.order('price ASC')
@selected_products = filteredmatchingproducts.paginate(:page => params[:page])
@productsfound = filteredmatchingproducts.count
@min_price = filteredmatchingproducts.first
@max_price = filteredmatchingproducts.last
@price_range = @max_price.price - @min_price.price
@max_pricerange1 = @min_price.price + @price_range/4
@max_pricerange2 = @min_price.price + @price_range/2
@max_pricerange3 = @min_price.price + 3*@price_range/4
@max_pricerange4 = @max_price.price
if @min_price == nil
#don't do anything - just avoid error
else
@restricted_products_pricerange1 = filteredmatchingproducts.select("price").where('price BETWEEN ? and ?', 0 , @max_pricerange1).count
@restricted_products_pricerange2 = filteredmatchingproducts.select("price").where('price BETWEEN ? and ?', @max_pricerange1 + 0.01 , @max_pricerange2).count
@restricted_products_pricerange3 = filteredmatchingproducts.select("price").where('price BETWEEN ? and ?', @max_pricerange2 + 0.01 , @max_pricerange3).count
@restricted_products_pricerange4 = filteredmatchingproducts.select("price").where('price BETWEEN ? and ?', @max_pricerange3 + 0.01 , @max_pricerange4).count
end
编辑 为了清楚起见,我的基本问题是 - 为什么每个查询都需要在大型 Allproduct 数据库上执行,是否没有办法对前一个查询的结果执行后一个查询(即使用过滤匹配产品本身不重新计算它适用于每个查询)?在其他编程语言中,我习惯于记住变量并对这些记住的值执行操作,而不是在执行操作之前再次计算它们——这不是 Rails 中的心态吗?
【问题讨论】:
-
有机会迁移到包含聚合窗口函数的数据库吗? (我只是猜测 SQLite 没有)。所有这一切都可以通过 PostgreSQL 的单个查询来实现,并且对于如此多的记录,您应该尝试将其推送到数据库中。
标签: ruby-on-rails ruby-on-rails-3 sqlite activerecord