Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用postgresql时计数*太慢_Sql_Ruby On Rails_Database_Postgresql - Fatal编程技术网

使用postgresql时计数*太慢

使用postgresql时计数*太慢,sql,ruby-on-rails,database,postgresql,Sql,Ruby On Rails,Database,Postgresql,我注意到,当涉及到深度SQL时,COUNT*from表并不是一个优化的查询 下面是我正在使用的sql SELECT COUNT(*) FROM "items" INNER JOIN ( SELECT c.* FROM companies c LEFT OUTER JOIN company_groups ON c.id = company_groups.company_id WHERE company_groups.has_restriction IS NULL OR company_gr

我注意到,当涉及到深度SQL时,COUNT*from表并不是一个优化的查询

下面是我正在使用的sql

SELECT COUNT(*) FROM "items"
INNER JOIN (
  SELECT c.* FROM companies c LEFT OUTER JOIN company_groups ON c.id = company_groups.company_id
  WHERE company_groups.has_restriction IS NULL OR company_groups.has_restriction = 'f' OR company_groups.company_id = 1999 OR company_groups.group_id IN ('3','2')
  GROUP BY c.id
) AS companies ON companies.id = stock_items.vendor_id
LEFT OUTER JOIN favs ON items.id = favs.item_id AND favs.user_id = 999 AND favs.is_visible = TRUE
WHERE "items"."type" IN ('Fashion') AND "items"."visibility" = 't' AND "items"."is_hidden" = 'f' AND (items.depth IS NULL OR (items.depth >= '0' AND items.depth <= '100')) AND (items.table IS NULL OR (items.table >= '0' AND items.table <= '100')) AND (items.company_id NOT IN (199,200,201))
请建议我如何使它工作得更快

注意:所有列都有索引,如类型、可见性、是否隐藏、表格、深度等


提前谢谢

好吧,您有两个部分可以选择查询中的所有select*,也许您可以限制它,看看它是否有用,例如:

SELECT COUNT(OneSpecificColumn)
FROM "items"
INNER JOIN
  ( SELECT c.(AnotherSpecificColumn)
   FROM companies c
   LEFT OUTER JOIN company_groups ON c.id = company_groups.company_id
   WHERE company_groups.has_restriction IS NULL
     OR company_groups.has_restriction = 'f'
     OR company_groups.company_id = 1999
     OR company_groups.group_id IN ('3',
                                    '2')
   GROUP BY c.id) AS companies ON companies.id = stock_items.vendor_id
LEFT OUTER JOIN favs ON items.id = favs.item_id
AND favs.user_id = 999
AND favs.is_visible = TRUE
WHERE "items"."type" IN ('Fashion')
  AND "items"."visibility" = 't'
  AND "items"."is_hidden" = 'f'
  AND (items.depth IS NULL
       OR (items.depth >= '0'
           AND items.depth <= '100'))
  AND (items.table IS NULL
       OR (items.table >= '0'
           AND items.table <= '100'))
  AND (items.company_id NOT IN (199,
                                200,
                                201))

您还可以检查这些左连接是否都是必需的,内部连接的成本更低,并且可以加快搜索速度

大部分时间花在项目的顺序扫描上,这是无法改进的,因为您几乎需要表中的所有行

因此,改进查询的唯一方法是

查看项目是否缓存在内存中

获得更快的存储速度


你是在使用kaminari之类的分页宝石,还是will_paginate会射入你的腿?@PavelMikhailyuk我们确实安装了kaminari,但为此我们没有使用kaminari。相反,我们使用的是限制和抵消,其目的是避免依赖关系。通常计数用于分页。所以您必须将分页实现从基于计数的计算页码更改为无限滚动。或者在数据库或内存中缓存总计数。您好@eliamelfior我尝试了您的1建议,即限制列,但sql仍然需要4043毫秒。
SELECT COUNT(OneSpecificColumn)
FROM "items"
INNER JOIN
  ( SELECT c.(AnotherSpecificColumn)
   FROM companies c
   LEFT OUTER JOIN company_groups ON c.id = company_groups.company_id
   WHERE company_groups.has_restriction IS NULL
     OR company_groups.has_restriction = 'f'
     OR company_groups.company_id = 1999
     OR company_groups.group_id IN ('3',
                                    '2')
   GROUP BY c.id) AS companies ON companies.id = stock_items.vendor_id
LEFT OUTER JOIN favs ON items.id = favs.item_id
AND favs.user_id = 999
AND favs.is_visible = TRUE
WHERE "items"."type" IN ('Fashion')
  AND "items"."visibility" = 't'
  AND "items"."is_hidden" = 'f'
  AND (items.depth IS NULL
       OR (items.depth >= '0'
           AND items.depth <= '100'))
  AND (items.table IS NULL
       OR (items.table >= '0'
           AND items.table <= '100'))
  AND (items.company_id NOT IN (199,
                                200,
                                201))