使用datatable/will_paginate显示索引页的性能很差



环境:Ruby 2.0.0, Rails 4.0.3, Windows 8.1, PostreSQL, Datatable 1.12.2, Will_Paginate 3.0.5,所有这些都在一台高端开发笔记本电脑上同时运行服务器和客户端。注意,删除原来的问题,用这个问题代替,直接解决问题的原因。

我有我的应用程序的索引操作的性能问题,当我种子数据库模拟满负荷。问题似乎是它读取整个模型数据库,然后读取它需要显示索引的记录。

控制器代码导致此问题。在这种情况下,它与Railscast 340不同。我添加了导致问题的行,因为没有它我就会出错。显然,这个补丁是错误的。控制器代码实际上在respond_to之前发出对记录集的读取。这在Railscast 340中没有显示,但在respond_to文档中有显示。如果没有它,我将在视图中收到一个错误。控制器代码为:

  def index
    @products = Product.all   # This line seems to be the problem, but errors occur without it.
    respond_to do |format|
      format.html
      format.json { render json: ProductsDatatable.new(view_context) }
    end
  end

当@products = Product时,接收每个on nil的nomethoderror的视图段。所有不在控制器索引的动作,是:

<% @products.each do |product| %>

在示例运行中,如下所示,第一个序列大约需要3.4秒,第二个序列需要0.1秒。这个示例只在我的开发系统上,这是一台同时运行服务器和客户机的高端笔记本电脑。但是,我非常担心这种设计即使在分发到生产中也无法扩展。

第一次读取和完成是:

SELECT "products".* FROM "products" WHERE "products"."company_id" = 54
…
Completed 200 OK in 3393ms (Views: 2851.6ms | ActiveRecord: 418.3ms)

下面的读取和补全是:

SELECT "products".* FROM "products" WHERE "products"."company_id" = 54 ORDER BY stock_number asc LIMIT 10 OFFSET 0
…
Completed 200 OK in 103ms (Views: 71.0ms | ActiveRecord: 26.0ms)

EDIT添加Explain Analyze

有趣的区别在于,第一个查询没有显示索引,但模式显示产品是按公司索引的?

第一个查询:

"Seq Scan on products  (cost=0.00..12.65 rows=234 width=51) (actual time=0.036..0.114 rows=234 loops=1)"
"  Filter: (company_id = 54)"
"  Rows Removed by Filter: 218"
"Total runtime: 0.153 ms"

第二个查询:

"Limit  (cost=0.27..6.76 rows=10 width=51) (actual time=0.015..0.036 rows=10 loops=1)"
"  ->  Index Scan using index_products_on_stock_number on products  (cost=0.27..152.07 rows=234 width=51) (actual time=0.014..0.033 rows=10 loops=1)"
"        Filter: (company_id = 54)"
"        Rows Removed by Filter: 14"
"Total runtime: 0.063 ms"

如果您查看railscasts.com/episodes/340-datatables上的代码到文件views/products/index.html.erb,您将看到,他删除了表中主体的主体。您的问题是,在第一次加载页面时,您试图加载并包括数据库中的所有记录到视图中。

最新更新