使用postgresql时计数*太慢
我注意到,当涉及到深度SQL时,COUNT*from表并不是一个优化的查询 下面是我正在使用的sql使用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
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))