F.28. pg_stat_statements — SQL İstatistikleri
pg_stat_statements modülü, bir sunucu tarafından yürütülen tüm SQL ifadelerinin yürütme istatistiklerini izleme olanağı sağlar. Modül, her normalleştirilmiş SQL ifadesi için toplam yürütme süresi, çağrı sayısı, döndürülen satır sayısı ve diğer istatistikleri toplar.
pg_stat_statements, sorgu performansını analiz etmek, yavaş sorguları belirlemek ve genel veritabanı performansını izlemek için kullanılır. Modül, her normalleştirilmiş sorgu için ayrı istatistikler tutar, böylece aynı sorgunun farklı parametrelerle yürütülmesi durumunda bile performansı takip edebilirsiniz.
F.28.1. Genel Bakış
pg_stat_statements modülü, PostgreSQL sunucusu tarafından yürütülen tüm SQL ifadelerinin istatistiklerini toplar. Modül, her normalleştirilmiş SQL ifadesi için aşağıdaki bilgileri sağlar:
- Toplam yürütme süresi ve çağrı sayısı
- Ortalama, minimum ve maksimum yürütme süreleri
- Döndürülen veya etkilenen satır sayısı
- Blok I/O istatistikleri (okuma/yazma)
- Geçici dosya kullanımı
Normalleştirilmiş sorgu metni, sabit değerlerin yerine parametrelerin kullanıldığı bir formattır. Bu sayede, aynı sorgu yapısına sahip farklı parametrelerle yürütülen sorgular tek bir giriş altında toplanır.
F.28.2. Sınırlamalar
pg_stat_statements modülü aşağıdaki sınırlamalara sahiptir:
- İstatistikler paylaşılan bellekte saklanır ve bu nedenle sunucu yeniden başlatıldığında sıfırlanır. İstatistiklerin kalıcı olması için, pg_stat_statements.save parametresini etkinleştirmeniz gerekir.
- Modül, normalleştirilmiş sorgu metinlerini saklar, bu da bellek kullanımını artırabilir. pg_stat_statements.max parametresi ile saklanacak maksimum sorgu sayısını kontrol edebilirsiniz.
- Maksimum sorgu sayısına ulaşıldığında, en az kullanılan sorgular otomatik olarak kaldırılır.
- pg_stat_statements, sadece yürütme istatistiklerini toplar. Planlama istatistikleri toplanmaz.
- Bazı özel durumlarda, sorgu metni tam olarak normalleştirilemeyebilir.
F.28.3. Kurulum
pg_stat_statements modülünü kullanmak için, önce modülü yüklemelisiniz. Modül, PostgreSQL'in shared_preload_libraries parametresine eklenmelidir:
shared_preload_libraries = 'pg_stat_statements'
Bu parametreyi postgresql.conf dosyasında değiştirdikten sonra, PostgreSQL sunucusunu yeniden başlatmanız gerekir. Ayrıca, bu modülün çalışması için sorgu kimliklerinin hesaplanması gerekir; bu, compute_query_id parametresinin auto veya on olarak ayarlandığında veya sorgu kimliklerini hesaplayan bir üçüncü taraf modül yüklendiğinde otomatik olarak gerçekleşir.
Sunucu başlatıldıktan sonra, modülü veritabanında etkinleştirmek için aşağıdaki komutu çalıştırın:
CREATE EXTENSION pg_stat_statements;
Not: CREATE EXTENSION komutu hakkında daha fazla bilgi için PostgreSQL dokümantasyonuna bakın.
Modül, her veritabanında ayrı ayrı etkinleştirilmelidir. Modülü kullanmak istediğiniz her veritabanında CREATE EXTENSION komutunu çalıştırın.
<strong>Not:</strong> pg_stat_statements modülü, PostgreSQL 9.2 ve sonraki sürümlerde mevcuttur. Postgres Pro Enterprise ve Postgres Pro Standard ile birlikte gelir.
F.28.4. Kullanım
pg_stat_statements modülü etkinleştirildikten sonra, pg_stat_statements görünümünü sorgulayarak SQL ifadelerinin istatistiklerini görüntüleyebilirsiniz.
F.28.4.1. Temel Kullanım
En çok zaman harcayan sorguları bulmak için:
SELECT query, calls, total_exec_time, mean_exec_time
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
En çok yürütülen sorguları bulmak için:
SELECT query, calls, total_exec_time, mean_exec_time
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 10;
En yavaş sorguları bulmak için:
SELECT query, calls, mean_exec_time, max_exec_time
FROM pg_stat_statements
WHERE calls > 0
ORDER BY mean_exec_time DESC
LIMIT 10;
F.28.4.2. Veritabanı ve Kullanıcıya Göre Filtreleme
Belirli bir veritabanı için sorguları filtrelemek için:
SELECT query, calls, total_exec_time
FROM pg_stat_statements
WHERE dbid = (SELECT oid FROM pg_database WHERE datname = 'mydb')
ORDER BY total_exec_time DESC
LIMIT 10;
Not: pg_database sistem kataloğu hakkında daha fazla bilgi için PostgreSQL dokümantasyonuna bakın.
Belirli bir kullanıcı için sorguları filtrelemek için:
SELECT query, calls, total_exec_time
FROM pg_stat_statements
WHERE userid = (SELECT oid FROM pg_user WHERE usename = 'myuser')
ORDER BY total_exec_time DESC
LIMIT 10;
Not: pg_user görünümü hakkında daha fazla bilgi için PostgreSQL dokümantasyonuna bakın.
F.28.4.3. İstatistikleri Sıfırlama
Tüm istatistikleri sıfırlamak için pg_stat_statements_reset() fonksiyonunu kullanın:
SELECT pg_stat_statements_reset();
Belirli bir veritabanı için istatistikleri sıfırlamak için:
SELECT pg_stat_statements_reset(
(SELECT oid FROM pg_database WHERE datname = 'mydb'),
NULL,
NULL
);
Not: pg_database sistem kataloğu hakkında daha fazla bilgi için PostgreSQL dokümantasyonuna bakın.
F.28.5. pg_stat_statements Görünümü
pg_stat_statements görünümü, her normalleştirilmiş SQL ifadesi için yürütme istatistiklerini içerir. Görünüm aşağıdaki sütunları içerir:
| Sütun | Tip | Açıklama |
|---|---|---|
userid |
oid |
İfadeyi yürüten kullanıcının OID'si |
dbid |
oid |
İfadenin yürütüldüğü veritabanının OID'si |
queryid |
bigint |
Normalleştirilmiş sorgu metninin hash kodu |
query |
text |
Normalleştirilmiş sorgu metni |
plans |
bigint |
İfadenin planlandığı sayı (pg_stat_statements.track_planning etkinse) |
total_plan_time |
double precision |
İfadenin planlanmasında harcanan toplam süre (milisaniye, pg_stat_statements.track_planning etkinse) |
min_plan_time |
double precision |
İfadenin planlanmasında harcanan minimum süre (milisaniye) |
max_plan_time |
double precision |
İfadenin planlanmasında harcanan maksimum süre (milisaniye) |
mean_plan_time |
double precision |
İfadenin planlanmasında harcanan ortalama süre (milisaniye) |
stddev_plan_time |
double precision |
Planlama süresinin standart sapması (milisaniye) |
calls |
bigint |
İfadenin yürütülme sayısı |
total_exec_time |
double precision |
İfadenin yürütülmesinde harcanan toplam süre (milisaniye) |
min_exec_time |
double precision |
İfadenin yürütülmesinde harcanan minimum süre (milisaniye) |
max_exec_time |
double precision |
İfadenin yürütülmesinde harcanan maksimum süre (milisaniye) |
mean_exec_time |
double precision |
İfadenin yürütülmesinde harcanan ortalama süre (milisaniye) |
stddev_exec_time |
double precision |
Yürütme süresinin standart sapması (milisaniye) |
rows |
bigint |
İfade tarafından alınan veya etkilenen toplam satır sayısı |
shared_blks_hit |
bigint |
Paylaşılan blok önbellek isabet sayısı |
shared_blks_read |
bigint |
Okunan paylaşılan blok sayısı |
shared_blks_dirtied |
bigint |
Kirletilen paylaşılan blok sayısı |
shared_blks_written |
bigint |
Yazılan paylaşılan blok sayısı |
local_blks_hit |
bigint |
Yerel blok önbellek isabet sayısı |
local_blks_read |
bigint |
Okunan yerel blok sayısı |
local_blks_dirtied |
bigint |
Kirletilen yerel blok sayısı |
local_blks_written |
bigint |
Yazılan yerel blok sayısı |
temp_blks_read |
bigint |
Okunan geçici blok sayısı |
temp_blks_written |
bigint |
Yazılan geçici blok sayısı |
blk_read_time |
double precision |
Blok okuma için harcanan toplam süre (milisaniye, track_io_timing etkinse) |
blk_write_time |
double precision |
Blok yazma için harcanan toplam süre (milisaniye, track_io_timing etkinse) |
wal_records |
bigint |
Oluşturulan WAL kayıt sayısı |
wal_fpi |
bigint |
Oluşturulan WAL tam sayfa görüntü sayısı |
wal_bytes |
numeric |
Oluşturulan WAL bayt miktarı |
F.28.6. Fonksiyonlar
pg_stat_statements modülü, istatistikleri yönetmek için aşağıdaki fonksiyonları sağlar:
F.28.6.1. pg_stat_statements_reset
pg_stat_statements_reset([userid oid], [dbid oid], [queryid bigint])
Belirtilen kriterlere göre istatistikleri sıfırlar. Parametreler belirtilmezse, tüm istatistikler sıfırlanır.
<strong>Parametreler:</strong>
userid— İstatistikleri sıfırlanacak kullanıcının OID'si (opsiyonel)dbid— İstatistikleri sıfırlanacak veritabanının OID'si (opsiyonel)queryid— İstatistikleri sıfırlanacak sorgunun queryid'si (opsiyonel)
<strong>Dönen Değer:</strong> void
<strong>Örnek:</strong>
-- Tüm istatistikleri sıfırla
SELECT pg_stat_statements_reset();
-- Belirli bir veritabanı için istatistikleri sıfırla
SELECT pg_stat_statements_reset(
NULL,
(SELECT oid FROM pg_database WHERE datname = 'mydb'),
NULL
);
-- Belirli bir kullanıcı için istatistikleri sıfırla
SELECT pg_stat_statements_reset(
(SELECT oid FROM pg_user WHERE usename = 'myuser'),
NULL,
NULL
);
Not: pg_database ve pg_user hakkında daha fazla bilgi için PostgreSQL dokümantasyonuna bakın.
F.28.7. Yapılandırma Parametreleri
pg_stat_statements modülü aşağıdaki yapılandırma parametrelerini destekler. Bu parametreler postgresql.conf dosyasında veya ALTER SYSTEM komutu ile ayarlanabilir:
F.28.7.1. pg_stat_statements.max
<strong>Tip:</strong> integer
<strong>Varsayılan:</strong> 5000
Saklanacak maksimum normalleştirilmiş ifade sayısı. Bu sayıya ulaşıldığında, en az kullanılan ifadeler otomatik olarak kaldırılır. Bu parametre, paylaşılan bellek kullanımını kontrol etmek için kullanılır.
<strong>Not:</strong> Bu parametrenin değeri, paylaşılan bellek kullanımını doğrudan etkiler. Daha yüksek değerler daha fazla bellek kullanır, ancak daha fazla sorgu istatistiği saklanır.
F.28.7.2. pg_stat_statements.track
<strong>Tip:</strong> enum ('all', 'top', 'none')
<strong>Varsayılan:</strong> 'all'
Hangi ifadelerin izleneceğini belirler:
all— Tüm ifadeler izlenirtop— Sadece en üst ifadeler izlenir (en çok kaynak kullananlar)none— Hiçbir ifade izlenmez
F.28.7.3. pg_stat_statements.track_planning
<strong>Tip:</strong> boolean
<strong>Varsayılan:</strong> off
Planlama istatistiklerinin toplanıp toplanmayacağını belirler. Bu parametre 'on' olarak ayarlandığında, planlama süresi ve plan bilgileri toplanır.
F.28.7.4. pg_stat_statements.track_utility
<strong>Tip:</strong> boolean
<strong>Varsayılan:</strong> on
Yardımcı komutların (DDL, DCL vb.) izlenip izlenmeyeceğini belirler.
F.28.7.5. pg_stat_statements.save
<strong>Tip:</strong> boolean
<strong>Varsayılan:</strong> on
Sunucu durdurulduğunda istatistiklerin diske kaydedilip kaydedilmeyeceğini belirler. Bu parametre 'off' olarak ayarlandığında, sunucu yeniden başlatıldığında istatistikler kaybolur.
F.28.8. Örnek Çıktı
Aşağıda, pg_stat_statements görünümünden alınan örnek bir çıktı gösterilmektedir:
-[ RECORD 1 ]-------+----------------------------------------------------------
userid | 16384
dbid | 16384
queryid | 1234567890
query | SELECT * FROM users WHERE id = $1
plans | 10
total_plan_time | 5.234
min_plan_time | 0.123
max_plan_time | 1.456
mean_plan_time | 0.523
stddev_plan_time | 0.234
calls | 1000
total_exec_time | 1234.567
min_exec_time | 0.123
max_exec_time | 5.678
mean_exec_time | 1.235
stddev_exec_time | 0.567
rows | 1000
shared_blks_hit | 5000
shared_blks_read | 100
shared_blks_dirtied | 50
shared_blks_written | 25
local_blks_hit | 0
local_blks_read | 0
local_blks_dirtied | 0
local_blks_written | 0
temp_blks_read | 0
temp_blks_written | 0
blk_read_time | 12.345
blk_write_time | 2.345
wal_records | 100
wal_fpi | 5
wal_bytes | 10240
Bu örnek, bir SELECT sorgusunun istatistiklerini göstermektedir. Sorgu 1000 kez yürütülmüş, toplam 1234.567 milisaniye sürmüş ve ortalama 1.235 milisaniye sürmüştür.
F.28.9. Yazarlar
pg_stat_statements modülü PostgreSQL topluluğu tarafından geliştirilmiştir.
Postgres Pro Enterprise ve Postgres Pro Standard sürümlerinde, pg_stat_statements modülü Postgres Professional tarafından geliştirilmiş ve optimize edilmiştir.
<strong>Postgres Professional</strong><br/>Moskova, Rusya<br/><a href="https://postgrespro.com" target="_blank">https://postgrespro.com</a>