Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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
PSQL请求太慢。如何修复它?_Sql_Postgresql_Datatable_Count_Subquery - Fatal编程技术网

PSQL请求太慢。如何修复它?

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),

如何使此请求更有效?

可以使用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), 
    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;