Performa Database & Arsip Data

Panduan optimasi performa database, estimasi volume data, strategi indexing, dan sistem arsip otomatis untuk menjaga kecepatan akses data Hospital (SIMRS).

Estimasi Volume Data

Estimasi jumlah record per tahun berdasarkan kapasitas rumah sakit (100-500 pasien/hari).

Estimasi Volume Data per Tahun
TabelVolume/TahunKeterangan
hms_encounters36.000 - 180.000Kunjungan pasien (rawat jalan + rawat inap)
hms_prescription_items110.000 - 550.000Item resep obat (~3 item per kunjungan)
hms_bill_items73.000 - 365.000Item tagihan (~2 item per kunjungan)
hms_progress_notes73.000 - 365.000Catatan perkembangan pasien (SOAP)
hms_appointments36.000 - 180.000Janji temu / antrian
hms_payments36.000 - 180.000Transaksi pembayaran
hms_doctor_fees36.000 - 180.000Perhitungan jasa dokter
Info: Dalam 3 tahun, tabel hms_prescription_items bisa mencapai 1,5 juta record. Tanpa optimasi, query akan melambat secara signifikan.

Optimasi Index

Composite index ditambahkan pada kolom yang sering digunakan bersamaan dalam query WHERE dan JOIN untuk mempercepat pencarian data.

Composite Indexes

Daftar Composite Index
TabelIndexKegunaan
hms_encounterspatient + dateRiwayat kunjungan per pasien
hms_encountersdepartment + date + statusDaftar kunjungan per departemen
hms_encountersdoctor + date + statusJadwal dan daftar pasien dokter
hms_appointmentsdate + dept + statusAntrian per departemen hari ini
hms_appointmentsdoctor + dateJadwal appointment dokter
hms_prescription_itemsmedicine_code + dateRiwayat penggunaan obat
hms_prescription_itemsprescription + dispensedItem resep yang belum didispensasi
hms_bill_itemsservice + dateLaporan pendapatan per layanan
hms_billspatient + statusTagihan aktif per pasien
hms_billsstatus + dateLaporan tagihan per periode
hms_billspaytype + status + dateLaporan per metode pembayaran
hms_progress_notesencounter + dateCatatan per kunjungan kronologis
hms_progress_notesencounter + role + dateCatatan per profesi (dokter/perawat)
hms_doctor_feesdoctor + period + statusRekap jasa dokter per periode

Partial Indexes (PostgreSQL)

Partial index hanya mengindex baris yang memenuhi kondisi tertentu. Hasilnya: ukuran index lebih kecil dan query lebih cepat.

Partial Indexes
Partial IndexKondisiKegunaan
Active encountersWHERE status = 'active'Hanya index kunjungan yang sedang berlangsung
Pending billsWHERE status = 'pending'Hanya index tagihan yang belum dibayar
Undispensed prescriptionsWHERE dispensed = falseHanya index resep yang belum didispensasi
Pending doctor feesWHERE status = 'pending'Hanya index jasa dokter yang belum dibayar
Active admissionsWHERE status = 'admitted'Hanya index pasien rawat inap aktif
Today's appointmentsWHERE date = CURRENT_DATEHanya index janji temu hari ini
Tips: Partial index hanya tersedia di PostgreSQL. Untuk MySQL/MariaDB, gunakan composite index biasa. Partial index sangat efektif karena hanya mengindex baris yang sesuai kondisi — ukuran lebih kecil, query lebih cepat.

Sistem Arsip Data

Sistem arsip otomatis memindahkan data lama ke tabel arsip agar tabel utama tetap ringan dan cepat diakses.

Cara Kerja

Data yang lebih tua dari 24 bulan (default) dipindahkan secara otomatis dari tabel utama ke tabel arsip (*_archive). Tabel utama tetap ringan untuk operasional harian, sementara data lama tetap dapat diakses melalui tabel arsip.

7 Tabel Arsip

Sistem membuat 7 tabel arsip yang menyimpan data lama dari masing-masing tabel utama.

Penggunaan Command Arsip
# Simulasi arsip (tanpa memindahkan data)
php artisan hospital:archive-data --dry-run

# Jalankan arsip dengan default 24 bulan
php artisan hospital:archive-data

# Arsip data lebih tua dari 12 bulan
php artisan hospital:archive-data --months=12

# Arsip hanya tabel tertentu
php artisan hospital:archive-data --table=hms_encounters
Perhatian: Selalu jalankan --dry-run terlebih dahulu untuk melihat berapa banyak data yang akan dipindahkan sebelum menjalankan arsip sesungguhnya.

Rekomendasi Maintenance

Jadwalkan Arsip Bulanan

Jalankan proses arsip secara berkala setiap bulan menggunakan cron job. Contoh: 0 2 1 * * php artisan hospital:archive-data (setiap tanggal 1 jam 02:00).

VACUUM ANALYZE Otomatis

Setelah proses arsip selesai, perintah VACUUM ANALYZE dijalankan secara otomatis untuk mengoptimalkan storage dan memperbarui statistik query planner PostgreSQL.

Monitor Ukuran Tabel

Pantau ukuran tabel secara berkala melalui PostgreSQL. Gunakan query pg_total_relation_size() untuk melihat ukuran tabel beserta index-nya.

Pertimbangkan Table Partitioning

Untuk tabel dengan lebih dari 1 juta record, pertimbangkan penggunaan table partitioning berdasarkan tanggal (range partitioning) untuk performa query yang lebih optimal.

Tabel Arsip

Daftar 7 tabel arsip yang dibuat oleh sistem untuk menyimpan data lama.

Daftar Tabel Arsip
Tabel ArsipTabel SumberData yang Disimpan
hms_encounters_archivehms_encountersKunjungan pasien lama (rawat jalan & rawat inap)
hms_prescription_items_archivehms_prescription_itemsItem resep obat dari kunjungan lama
hms_bill_items_archivehms_bill_itemsItem tagihan dari kunjungan lama
hms_progress_notes_archivehms_progress_notesCatatan perkembangan pasien lama (SOAP)
hms_appointments_archivehms_appointmentsJanji temu dan antrian lama
hms_payments_archivehms_paymentsTransaksi pembayaran lama
hms_doctor_fees_archivehms_doctor_feesPerhitungan jasa dokter periode lama
Tips: Tabel arsip memiliki struktur yang identik dengan tabel sumber. Data dapat di-query langsung dari tabel arsip jika diperlukan untuk keperluan audit atau laporan historis.