Запрос PSQL слишком медленный. Как это исправить? - PullRequest
0 голосов
/ 15 июля 2011
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;

Как мне сделать этот запрос более эффективным?

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Вы можете использовать что-то вроде этого:

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;

этот запрос не группируется по cid, но, вероятно, он вам не нужен.

1 голос
/ 15 июля 2011

возможно с использованием WITH.Переместите все запросы в WITH и измените их немного: измените COUNT(cid) на COUNT(DISTINCT cid) и удалите предложение GROUP BY.

...