Muhtemelen bunu duymak istemiyorum, ama hızlandırmak için en iyi seçenek SELECT DISTINCT
olduğunu kaçınmak DISTINCT
ile başlayacak. Birçok durumda (hepsi değil!) Daha iyi veritabanı tasarımı veya daha iyi sorgularla önlenebilir.
Bazen, GROUP BY
daha hızlıdır, çünkü farklı bir kod yolu gerektirir.
In sizin özel durumda size kurtulabilirsiniz gibi görünmüyor DISTINCT
. Ancak, bu tür birçok sorgunuz varsa, sorguyu özel bir dizinle destekleyebilirsiniz:
CREATE INDEX foo ON events (project_id, "time", user_id);
Ekleme user_id
, yalnızca bundan sadece dizin taramaları alırsanız yararlıdır . Ayrıntılar için bağlantıyı takip edin. Sorgu zamanınızın% 90'ını tüketen pahalı Bitmap Öbek Taramasını sorgu planınızdan kaldıracaktır .
Sizin EXPLAIN
çıkış sorgusu yarım milyon eşleşen satırların 2491 farklı kullanıcıları dışarıda yoğunlaşmaya olmayacağını söylüyor. Ne yaparsanız yapın, bu süper hızlı olmayacak, ancak önemli ölçüde daha hızlı olabilir.
Sorgularınızdaki zaman aralıkları her zaman aynıysa, MATERIALIIZED VIEW
katlama user_id
başına (project_id, <fixed time intervall>)
uzun bir yol kat eder. Ancak değişen zaman aralıklarında şansınız yok. Belki de kullanıcıları saatte veya başka bir minimum zaman biriminde en az katlayabilirsiniz ve bu, önemli ek yükü garanti etmek için yeterli performans satın alır.
Nitpick:
Büyük olasılıkla, tahminler "time"
gerçekten şöyle olmalı:
AND "time" >= '2015-01-11 8:00:00'
AND "time" < '2015-02-10 8:00:00';
Kenara: Tanımlayıcı olarak
kullanmayın time
. Bu bir var amaçlı sözcüğünü standart SQL ve Postgres bir temel türüdür.