PSQL请求太慢。如何修复它?
如何使此请求更有效?可以使用with。将所有查询移动到WITH并稍加修改:将COUNTcid更改为COUNTDISTINCT cid,并完全删除GROUP BY子句。您可以使用以下方法:PSQL请求太慢。如何修复它?,sql,postgresql,datatable,count,subquery,Sql,Postgresql,Datatable,Count,Subquery,如何使此请求更有效?可以使用with。将所有查询移动到WITH并稍加修改:将COUNTcid更改为COUNTDISTINCT cid,并完全删除GROUP BY子句。您可以使用以下方法: SELECT COUNT(a)/COUNT(s)*100 as aratio, COUNT(b)/COUNT(s)*100 as bratio, COUNT(c)/COUNT(s)*100 as cratio, COUNT(a), COUNT(b),
SELECT
COUNT(a)/COUNT(s)*100 as aratio,
COUNT(b)/COUNT(s)*100 as bratio,
COUNT(c)/COUNT(s)*100 as cratio,
COUNT(a),
COUNT(b),
COUNT(c),
COUNT(s)
FROM
(SELECT COUNT(cid) as a FROM images WHERE width > height AND category_id = 4 GROUP BY cid) as aq,
(SELECT COUNT(cid) as b FROM images WHERE width < height AND category_id = 4 GROUP BY cid) as bq,
(SELECT COUNT(cid) as c FROM images WHERE width = height AND category_id = 4 GROUP BY cid) as cq,
(SELECT COUNT(cid) as s FROM images WHERE category_id = 4 GROUP BY cid) as sq;
此查询不按cid分组,但您可能不需要它。您确定需要笛卡尔积吗?不,我不喜欢它,但我无法以更好的方式解决此问题。拆分到不同的查询和/或移动到存储过程?不可能,我需要在一个请求中输入。不要告诉我这是不可能的:与一起使用Dit是可能的。将所有查询移动到WITH并稍加修改:将COUNTcid更改为COUNTDISTINCT cid,并完全删除GROUP BY子句。有时GROUP BY的工作速度比DISTINCT快;重写之前值得检查一下。@Andrew Lazarus:在这个特殊情况下不相关。GROUP BY将返回具有唯一值的N行,而COUNTDISTINCT cid将返回具有唯一值count的一行。
SELECT
SUM(CASE (width > height) WHEN true THEN 1 ELSE 0 END)::float8*100/COUNT(*) as aratio,
SUM(CASE (width < height) WHEN true THEN 1 ELSE 0 END)::float8*100/COUNT(*) as bratio,
SUM(CASE (width = height) WHEN true THEN 1 ELSE 0 END)::float8*100/COUNT(*) as cratio,
SUM(CASE (width > height) WHEN true THEN 1 ELSE 0 END),
SUM(CASE (width < height) WHEN true THEN 1 ELSE 0 END),
SUM(CASE (width = height) WHEN true THEN 1 ELSE 0 END),
COUNT(*)
FROM
images WHERE category_id = 4;