Query Store: Analisis Query Lambat SQL Server

Foto oleh Sergei Starostin via Pexels

Mengungkap Biang Kerok: Menganalisis Query Lambat dengan Query Store di SQL Server

Pernahkah Anda merasakan aplikasi melambat secara tiba-tiba tanpa sebab yang jelas? Seringkali, penyebab utamanya adalah query SQL yang performanya menurun drastis. Identifikasi dan penyelesaian masalah query lambat ini bisa menjadi tugas yang menantang jika Anda hanya mengandalkan alat tradisional seperti SQL Server Profiler atau melihat Execution Plan saat ini. Di sinilah SQL Server Query Store hadir sebagai solusi revolusioner.

Apa Itu SQL Server Query Store?

Query Store adalah fitur bawaan di SQL Server (sejak SQL Server 2016) yang berfungsi sebagai "kotak hitam" untuk database Anda. Ia secara otomatis merekam histori query, rencana eksekusi (execution plans), dan statistik runtime yang terkait dengan query tersebut. Bayangkan memiliki rekaman lengkap tentang apa yang telah terjadi pada performa query database Anda dari waktu ke waktu.

Data yang dikumpulkan Query Store meliputi:

  • Teks query (query text)
  • Rencana eksekusi yang berbeda untuk query yang sama
  • Statistik runtime (durasi, CPU time, logical reads, physical reads, memory usage, jumlah baris)
  • Statistik wait time (sejak SQL Server 2017)

Mengapa Query Store Penting untuk Optimasi Performa?

Sebelum Query Store, identifikasi masalah performa query seringkali reaktif dan sulit dilakukan secara historis. Anda mungkin perlu mereplikasi masalah atau menggunakan SQL Server Profiler, yang bisa menimbulkan overhead signifikan dan hanya menangkap data real-time.

Keunggulan Query Store meliputi:

  • Analisis Historis: Melihat performa query dari waktu ke waktu, bukan hanya saat ini. Ini krusial untuk menemukan regresi performa setelah perubahan indeks, statistik, atau bahkan update kode aplikasi.
  • Identifikasi Query Regresi: Query Store secara khusus menyoroti query yang performanya memburuk (regressed queries) dengan mudah.
  • Pemilihan Rencana Eksekusi Optimal: Jika suatu query memiliki beberapa rencana eksekusi yang berbeda dan salah satunya menyebabkan performa buruk, Anda bisa "memaksa" SQL Server untuk menggunakan rencana yang lebih baik.
  • Overhead Minimal: Didesain untuk memiliki dampak minimal pada performa server.

Mengaktifkan Query Store pada Database Anda

Query Store diaktifkan per database. Secara default, ia tidak aktif. Anda bisa mengaktifkannya menggunakan SQL Server Management Studio (SSMS) atau melalui T-SQL.

Untuk mengaktifkannya via T-SQL, jalankan perintah berikut:

Mengaktifkan Query Store untuk sebuah database

ALTER DATABASE NamaDatabaseAnda SET QUERY_STORE = ON;

Setelah diaktifkan, Query Store mulai mengumpulkan data secara otomatis.

Konfigurasi Optimal Query Store

Mengaktifkan saja tidak cukup. Konfigurasi yang tepat penting untuk memastikan Query Store bekerja efektif tanpa memakan terlalu banyak sumber daya atau kehilangan data penting. Berikut adalah beberapa opsi konfigurasi kunci yang bisa Anda sesuaikan:

  • OPERATION_MODE:
    • READ_WRITE: Default setelah aktivasi. Mengumpulkan data aktif.
    • READ_ONLY: Berhenti mengumpulkan data baru, hanya memungkinkan pembacaan data yang sudah ada. Berguna untuk analisis tanpa overhead tambahan.
    • OFF: Menonaktifkan Query Store.
  • MAX_STORAGE_SIZE_MB: Ukuran maksimum data Query Store dalam MB. Jika ukuran ini tercapai, Query Store akan beralih ke mode READ_ONLY secara otomatis, atau menghapus data tertua jika CLEANUP_POLICY aktif.
  • INTERVAL_LENGTH_MINUTES: Interval waktu agregasi statistik runtime. Nilai default adalah 60 menit. Untuk analisis lebih detail, Anda bisa menguranginya.
  • DATA_FLUSH_INTERVAL_SECONDS: Seberapa sering data Query Store ditulis dari memori ke disk. Nilai yang lebih rendah berarti data lebih cepat persist, tapi mungkin ada sedikit overhead I/O.
  • STALE_QUERY_THRESHOLD_DAYS: Berapa lama data query disimpan sebelum dihapus secara otomatis. Defaultnya adalah 30 hari. Sesuaikan dengan kebutuhan histori Anda.

Berikut contoh T-SQL untuk mengkonfigurasi Query Store:

Contoh konfigurasi Query Store yang lebih detail

ALTER DATABASE NamaDatabaseAnda SET QUERY_STORE = ON ( OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 90), -- Simpan data hingga 90 hari MAX_STORAGE_SIZE_MB = 1000, -- Alokasikan 1 GB untuk Query Store DATA_FLUSH_INTERVAL_SECONDS = 600, -- Flush ke disk setiap 10 menit INTERVAL_LENGTH_MINUTES = 30, -- Agregasi statistik setiap 30 menit SIZE_BASED_CLEANUP_MODE = AUTO, QUERY_CAPTURE_MODE = AUTO, MAX_PLANS_PER_QUERY = 50 -- Simpan hingga 50 rencana per query );

Menganalisis Performa Query dengan Laporan Query Store di SSMS

Setelah Query Store aktif dan mengumpulkan data, Anda bisa menganalisisnya melalui laporan bawaan di SSMS. Buka database Anda di Object Explorer, lalu ekspansi folder "Query Store". Anda akan melihat beberapa laporan:

  • Top Resource Consuming Queries: Ini adalah titik awal yang paling umum. Laporan ini menampilkan query-query yang paling banyak memakan sumber daya (CPU Time, Duration, Logical Reads, dll.) dalam periode waktu tertentu.
  • Deskripsi laporan 'Top Resource Consuming Queries' di SSMS

    Gambar: Laporan 'Top Resource Consuming Queries' di SQL Server Management Studio. Menampilkan daftar query yang paling banyak mengonsumsi sumber daya seperti CPU Time, Duration, dan Logical Reads dalam periode waktu yang dipilih. Grafik batang di atas menunjukkan konsumsi sumber daya, dan tabel di bawahnya merinci setiap query, beserta rencana eksekusi dan statistiknya.
  • Queries with Regressed Plans: Ini adalah laporan yang sangat berharga. Ia secara otomatis mengidentifikasi query yang memiliki beberapa rencana eksekusi dan performanya memburuk setelah SQL Server memilih rencana yang berbeda atau kurang optimal.
  • Deskripsi laporan 'Queries with Regressed Plans' di SSMS

    Gambar: Laporan 'Queries with Regressed Plans' di SQL Server Management Studio. Menampilkan query yang performanya memburuk (regressed) dalam periode waktu tertentu. Laporan ini menyoroti perubahan signifikan pada durasi, CPU time, atau logical reads suatu query, seringkali karena perubahan pada rencana eksekusi yang dipilih SQL Server. Pengguna dapat melihat perbandingan rencana yang baik dengan rencana yang memburuk.
  • Overall Resource Consumption: Memberikan gambaran umum tentang penggunaan sumber daya Query Store itu sendiri.

Memahami "Top Resource Consuming Queries"

Dalam laporan ini, Anda akan melihat grafik batang yang menunjukkan konsumsi sumber daya (misalnya, Total Duration) dari query teratas. Di bagian bawah, ada panel yang menampilkan query beserta statistik dan rencana eksekusi yang berbeda.

Saat Anda memilih query, Anda bisa melihat "Query Plan Summary" yang menampilkan rencana eksekusi yang digunakan oleh query tersebut. Jika ada beberapa rencana, Anda bisa membandingkannya untuk melihat perubahan apa yang menyebabkan performa menurun.

Menemukan dan Mengatasi Regresi Performa

Laporan "Queries with Regressed Plans" adalah senjata utama Anda.

Bayangkan skenario ini: setelah update indeks, performa sebuah query kritis justru memburuk. Tanpa Query Store, Anda mungkin harus mencari perubahan tersebut secara manual. Dengan Query Store, Anda cukup membuka laporan ini, mencari query yang relevan, dan melihat bahwa SQL Server mulai menggunakan rencana eksekusi yang berbeda (dan lebih buruk) setelah update.

Jika Anda mengidentifikasi rencana yang lebih baik yang pernah digunakan sebelumnya, Anda bisa "memaksa" SQL Server untuk menggunakan rencana tersebut.

Contoh T-SQL untuk memaksa dan membatalkan rencana eksekusi

-- Temukan query_id dan plan_id dari Query Store untuk query yang ingin Anda paksa -- Misalnya, dari laporan 'Top Resource Consuming Queries' atau 'Queries with Regressed Plans' -- Contoh: query_id = 1234, plan_id = 5678 EXEC sp_query_store_force_plan @query_id = 1234, @plan_id = 5678; -- Untuk membatalkan paksaan rencana: -- EXEC sp_query_store_unforce_plan @query_id = 1234;

Peringatan: Memaksa rencana harus dilakukan dengan sangat hati-hati dan setelah pengujian menyeluruh. Rencana yang optimal untuk satu set data mungkin tidak optimal untuk set data lain di masa depan. Gunakan fitur ini sebagai solusi sementara atau ketika Anda yakin ada regresi yang jelas. Jika rencana baru muncul dan memburuk, mungkin ada alasan yang lebih dalam (misal, statistik usang, fragmentasi, data skew) yang perlu diatasi.

Kesalahan Umum dan Pertimbangan

  • Tidak mengaktifkan Query Store di database produksi: Banyak yang ragu karena khawatir overhead. Padahal, overheadnya minimal dan manfaatnya jauh lebih besar untuk monitoring proaktif.
  • Konfigurasi default yang tidak optimal: MAX_STORAGE_SIZE_MB default mungkin terlalu kecil untuk database sibuk, menyebabkan Query Store cepat beralih ke READ_ONLY atau menghapus data penting. Sesuaikan STALE_QUERY_THRESHOLD_DAYS agar sesuai dengan kebutuhan retensi data Anda.
  • Terlalu cepat memaksa rencana: Meskipun fitur ini kuat, memaksa rencana tanpa memahami akar masalahnya (misalnya, statistik usang, parameter sniffing, perubahan distribusi data) bisa menyebabkan masalah baru di kemudian hari. Selalu coba untuk mengoptimalkan query itu sendiri atau struktur indeks terlebih dahulu.
  • Tidak memantau ukuran Query Store: Pastikan MAX_STORAGE_SIZE_MB cukup besar. Jika terus-menerus penuh, Anda akan kehilangan data historis.

Kapan Query Store Bukan Solusi Tunggal?

Query Store adalah alat diagnostik yang luar biasa, tetapi bukan pengganti pemahaman mendalam tentang optimasi query dan struktur database.

  • Jika akar masalahnya adalah blocking atau deadlock yang parah, Anda mungkin perlu alat lain (seperti DMVs untuk sys.dm_exec_requests atau sys.dm_os_waiting_tasks) untuk analisis real-time. (Ini akan dibahas lebih lanjut di artikel selanjutnya).
  • Untuk tuning query yang sangat kompleks, Anda tetap perlu membaca dan memahami Execution Plan secara manual, mungkin dengan bantuan fitur "Show Live Query Statistics".
  • Tidak bisa menggantikan desain skema database yang buruk atau indeks yang tidak tepat sama sekali.

Kesimpulan

SQL Server Query Store adalah fitur esensial bagi setiap DBA dan developer yang serius dengan performa aplikasi berbasis SQL Server. Ia menyediakan visibilitas historis yang belum pernah ada sebelumnya ke dalam perilaku query, memungkinkan identifikasi cepat terhadap regresi performa dan memfasilitasi langkah-langkah perbaikan. Dengan mengaktifkan dan mengkonfigurasinya dengan bijak, Anda akan memiliki alat yang ampuh untuk menjaga performa database Anda tetap optimal. Mulailah gunakan Query Store sekarang untuk mengubah pendekatan reaktif menjadi proaktif dalam mengatasi query lambat.

Seri Belajar SQL Server:

→ Selanjutnya: Blocking vs Deadlock di SQL Server