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 izlenir
  • top — 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>