#!/bin/bash
# 실습 #14 ③ — pg_stat_statements: 운영의 "어느 쿼리가 느린가" 한 줄
# - shared_preload_libraries 에 등록 → 재시작
# - 확장 생성 → 모든 SQL 통계 누적
# - mean_exec_time / calls / total_exec_time 기준 정렬
set -e

DIR="$(cd "$(dirname "$0")" && pwd)"
EXT_CONF="$DIR/configs/03_pg_stat_statements.conf"

# 1) drop-in 으로 shared_preload_libraries 등록
DROPIN=/etc/postgresql/16/main/conf.d/95-pg_stat_statements.conf
sudo cp "$EXT_CONF" "$DROPIN"
sudo chown postgres:postgres "$DROPIN"
sudo systemctl restart postgresql
sleep 2

# 2) 확장 활성화
sudo -u postgres psql -d bench -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;"

# 3) 통계 리셋 + 부하 한 번 (느린 쿼리·빠른 쿼리 섞어서)
sudo -u postgres psql -d bench -c "SELECT pg_stat_statements_reset();"

echo "=== 가짜 워크로드 (30초) ==="
sudo -u postgres pgbench -c 4 -j 2 -T 30 bench >/dev/null

# 시퀀셜 스캔 유도 — 일부러 인덱스 없는 like 검색
sudo -u postgres psql -d bench <<'SQL'
SELECT count(*) FROM pgbench_accounts WHERE filler LIKE '%abcd%';
SELECT count(*) FROM pgbench_accounts WHERE filler LIKE '%xy_z%';
SQL

# 4) Top 10 슬로우 쿼리 (mean_exec_time 기준)
echo
echo "=== Top 10 slow queries (mean_exec_time) ==="
sudo -u postgres psql -d bench <<'SQL'
SELECT
    round(mean_exec_time::numeric, 2) AS mean_ms,
    calls,
    round(total_exec_time::numeric, 2) AS total_ms,
    left(query, 80) AS query
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
SQL

# 5) Top 10 by total time (자주 호출 + 평균 빠른 쿼리도 누적되면 1위)
echo
echo "=== Top 10 by total_exec_time ==="
sudo -u postgres psql -d bench <<'SQL'
SELECT
    calls,
    round(total_exec_time::numeric, 2) AS total_ms,
    round(mean_exec_time::numeric, 2)  AS mean_ms,
    left(query, 80) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
SQL

cat <<'EOF'

관전 포인트:
  - mean_exec_time : 한 번에 가장 느린 쿼리 (인덱스·플랜 점검 대상)
  - total_exec_time: 자주 호출되어 누적 부담이 큰 쿼리 (캐싱·배치화 대상)
  - calls          : 폭주 패턴 추적
  - 운영은 pg_stat_statements + slow log 두 트랙으로
EOF
