Sorunu çözmek için en kolay yöntem PostgreSQL'den ayrıntılı zamanlama sorgulamak için: EXPLAIN
. Bunun için en azından tamamlanan ancak beklenenden daha uzun süren bir sorgu bulmanız gerekir. Diyelim ki bu çizgi benziyor
delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
Gerçekten bu komutu çalıştırmak yerine yapabilecekleriniz
begin;
explain (analyze,buffers,timing) delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
rollback;
Sonunda geri alma, bunu veritabanını gerçekten değiştirmeden çalıştırmaya izin verir, ancak ne kadar sürdüğünün ayrıntılı zamanlamasını hala elde edersiniz. Bunu çalıştırdıktan sonra, çıktıda bazı tetikleyicilerin büyük gecikmelere neden olduğunu görebilirsiniz:
...
Trigger for constraint XYZ123: time=12311.292 calls=1
...
time
Bu contraint kontrol 12.3 saniyede aldı ms (milisaniye) bulunmaktadır. INDEX
Bu tetikleyicinin etkili bir şekilde hesaplanması için gerekli sütunların üzerine yeni bir ekleme yapmanız gerekir . Yabancı anahtar referansları için başka bir tabloya referans veren sütunun indekslenmesi gerekir (yani, hedef sütunu değil, kaynak sütunu). PostgreSQL sizin için otomatik olarak bu tür dizinler oluşturmaz ve DELETE
gerçekten bu dizine gerçekten ihtiyacınız olan tek sorgudur. Sonuç olarak, DELETE
bir endeks eksik olduğundan dolayı çok yavaş olan davaya ulaşana kadar yıllarca veri birikmiş olabilirsiniz .
Bu kısıtlamanın (veya çok uzun süren başka bir şeyin) performansını düzelttikten sonra, begin
/ rollback
blok komutunu tekrarlayın, böylece yeni yürütme zamanını önceki ile karşılaştırabilirsiniz. Tek satır silme yanıt süresinden memnun kalana kadar devam edin (yalnızca farklı dizinler ekleyerek 25.6 saniyeden 15 ms'ye kadar bir sorgun var). Sonra silme işleminizi herhangi bir hack olmadan tamamlayabilirsiniz.
( EXPLAIN
Başarılı bir şekilde tamamlayabilen bir sorguya ihtiyaç duyulduğunu unutmayın . Bir keresinde PostgreSQL'in bir silme işleminin bir yabancı anahtar kısıtlamasını ihlal edeceğini anlamak için çok uzun sürdüğü bir sorun vardı ve bu durumda EXPLAIN
başarısızlık için zamanlama vermeyeceği için kullanılamıyordu. sorgular. Böyle bir durumda performans sorunlarını ayıklamak için kolay bir yol bilmiyorum.)