Penyimpanan kueri pada Azure Database for PostgreSQL Flexible Server

Penyimpanan kueri adalah fitur di server fleksibel Azure Database for PostgreSQL yang menyediakan cara untuk melacak performa kueri dari waktu ke waktu. Query Store menyederhanakan pemecahan masalah kinerja dengan membantu Anda dengan cepat menemukan kueri yang berjalan paling lama dan paling banyak menggunakan sumber daya. Penyimpanan kueri secara otomatis mencatat riwayat kueri dan statistik runtime, serta menyimpan data tersebut untuk tinjauan Anda. Ini mengiris data berdasarkan waktu sehingga Anda dapat melihat pola penggunaan temporal. Data untuk semua pengguna, database, dan kueri disimpan dalam database bernama azure_sys di server fleksibel Azure Database for PostgreSQL.

Aktifkan penyimpanan kueri

Query Store tersedia tanpa biaya tambahan. Ini adalah fitur keikutsertaan, sehingga tidak diaktifkan secara default di server. Anda dapat mengaktifkan atau menonaktifkan penyimpanan kueri secara global untuk semua database di server tertentu. Anda tidak dapat mengaktifkan atau menonaktifkannya per database.

Penting

Jangan aktifkan penyimpanan kueri pada tingkat harga Burstable karena menyebabkan masalah performa.

Mengaktifkan Query Store di portal Azure

  1. Masuk ke portal Azure dan pilih server fleksibel Azure Database for PostgreSQL Anda.
  2. Pilih Parameter di bagian Pengaturan pada menu.
  3. Cari parameter pg_qs.query_capture_mode.
  4. Atur nilai ke top atau all, tergantung pada apakah Anda ingin melacak kueri tingkat atas atau juga kueri berlapis (yang dijalankan di dalam fungsi atau prosedur), dan pilih Simpan. Izinkan hingga 20 menit agar batch data pertama bertahan dalam azure_sys database.

Mengaktifkan pengambilan sampel tunggu penyimpanan kueri

  1. Cari parameter pgms_wait_sampling.query_capture_mode.
  2. Atur nilainya ke all dan Simpan.

Informasi di penyimpanan kueri

Penyimpanan kueri terdiri dari dua penyimpanan:

  • Penyimpanan statistik runtime untuk mempertahankan informasi statistik eksekusi kueri.
  • Penyimpanan statistik tunggu untuk mempertahankan informasi statistik tunggu.

Skenario umum untuk menggunakan Query Store meliputi:

  • Menentukan berapa kali kueri dijalankan dalam jendela waktu tertentu.
  • Membandingkan waktu eksekusi rata-rata kueri di seluruh jendela waktu untuk melihat variasi besar.
  • Mengidentifikasi kueri yang berjalan paling lama dalam beberapa jam terakhir.
  • Mengidentifikasi kueri N teratas yang menunggu sumber daya.
  • Memahami sifat waktu tunggu untuk kueri tertentu.

Untuk meminimalkan penggunaan ruang, statistik eksekusi runtime di penyimpanan statistik runtime diagregat melalui jendela waktu yang tetap dan dapat dikonfigurasi. Anda dapat membuat kueri atas informasi dalam penyimpanan ini menggunakan tampilan.

Mengakses informasi penyimpanan kueri

Azure Database for PostgreSQL server fleksibel menyimpan data penyimpanan kueri dalam azure_sys database. Kueri berikut mengembalikan informasi tentang kueri yang direkam oleh penyimpanan kueri:

SELECT * FROM  query_store.qs_view;

Dan kueri ini mengembalikan informasi tentang statistik tunggu:

SELECT * FROM  query_store.pgms_wait_sampling_view;

Menemukan kueri tunggu

Jenis peristiwa tunggu mengelompokkan peristiwa tunggu yang berbeda ke dalam wadah berdasarkan kesamaan. Query Store menyediakan jenis peristiwa tunggu, nama peristiwa tunggu tertentu, dan kueri yang dimaksud. Saat Anda menghubungkan informasi tunggu ini dengan statistik runtime kueri, Anda mendapatkan pemahaman yang lebih mendalam tentang apa yang berkontribusi pada karakteristik performa kueri.

Berikut adalah beberapa contoh bagaimana Anda bisa mendapatkan lebih banyak wawasan tentang beban kerja Anda dengan menggunakan statistik tunggu di Query Store:

Pengamatan Action
Kunci tinggi menunggu Periksa teks kueri yang terpengaruh dan identifikasi entitas target. Lihat di Query Store untuk kueri lain yang sering dijalankan dan memiliki durasi tinggi dan memodifikasi entitas yang sama. Setelah mengidentifikasi kueri ini, pertimbangkan untuk mengubah logika aplikasi untuk meningkatkan konkurensi, atau menggunakan tingkat isolasi yang kurang ketat.
Waktu tunggu IO buffer yang tinggi Temukan kueri dengan jumlah pembacaan fisik yang tinggi di Query Store. Jika kueri tersebut cocok dengan kueri yang memiliki waktu tunggu I/O yang tinggi, pertimbangkan untuk mengaktifkan fitur penyetelan otonom guna melihat apakah fitur tersebut dapat merekomendasikan pembuatan beberapa indeks yang mungkin mengurangi jumlah pembacaan fisik untuk kueri tersebut.
Memori tinggi menunggu Temukan kueri yang menggunakan memori terbanyak di Query Store. Kueri ini mungkin menghambat progres lebih lanjut dari kueri yang terdampak.

Opsi konfigurasi

Saat Penyimpanan Kueri diaktifkan, fitur ini menyimpan data dalam jendela agregasi. Panjang jendela ini ditentukan oleh parameter pg_qs.interval_length_minutes , yang defaultnya menjadi 15 menit. Untuk setiap jendela, Query Store menyimpan hingga 500 kueri unik. Atribut yang membedakan keunikan setiap kueri adalah user_id (pengidentifikasi pengguna yang menjalankan kueri), db_id (pengidentifikasi database dalam konteks yang kuerinya dijalankan), dan query_id (nilai bilangan bulat secara unik mengidentifikasi kueri yang dijalankan). Jika jumlah kueri yang berbeda mencapai 500 selama interval yang dikonfigurasi, query store membebaskan alokasi 5% dari kueri yang direkam untuk menyediakan ruang bagi kueri lainnya. Kueri yang pertama kali dealokasikan adalah kueri yang paling sedikit dieksekusi.

Untuk mengonfigurasi parameter Query Store, gunakan opsi berikut:

Parameter Deskripsi Default Rentang
pg_qs.interval_length_minutes Tetapkan interval dalam menit untuk penyimpanan kueri. Menentukan frekuensi persistensi data. 15 1 - 30
pg_qs.max_captured_queries Jumlah maksimum kueri yang disimpan kueri bertahan dari semua kueri yang direkam selama setiap interval pengambilan. 500 100 - 500
pg_qs.max_plan_size Jumlah maksimum byte yang disimpan Query Store dari teks rencana kueri. Rencana yang lebih panjang terpotong. 7500 100 - 10000
pg_qs.max_query_text_length Panjang maksimum kueri yang dapat disimpan oleh penyimpanan kueri. Kueri yang lebih panjang dipotong. 6000 100 - 10000
pg_qs.parameters_capture_mode Apakah dan kapan mengambil parameter posisi kueri. capture_parameterless_only capture_parameterless_only, capture_first_sample
pg_qs.query_capture_mode Pernyataan yang harus dilacak. none none top all
pg_qs.retention_period_in_days Periode retensi dalam hitungan hari untuk penyimpanan kueri. Data yang lebih lama dihapus secara otomatis. 7 1 - 30
pg_qs.store_query_plans Apakah Query Store harus menyimpan rencana kueri. off on, off
pg_qs.track_utility Apakah toko kueri perlu melacak perintah utilitas? on on, off

Nota

Jika Anda mengubah nilai parameter pg_qs.max_query_text_length, teks semua kueri yang ditangkap oleh penyimpanan kueri sebelum Anda melakukan perubahan akan tetap menggunakan query_id dan sql_query_text yang sama. Perilaku ini mungkin memberi kesan bahwa nilai baru tidak berlaku tetapi, untuk kueri yang tidak direkam penyimpanan kueri sebelumnya, Anda melihat bahwa teks kueri menggunakan panjang maksimum yang baru dikonfigurasi. Perilaku ini dirancang dan dijelaskan di Tampilan dan fungsi. Jika Anda menjalankan query_store.qs_reset, ini akan menghapus semua informasi yang direkam penyimpanan kueri hingga saat ini, termasuk teks yang diambilnya untuk setiap ID kueri. Jika salah satu kueri tersebut dijalankan lagi, panjang maksimum yang baru dikonfigurasi diterapkan ke teks yang diambil.

Opsi berikut berlaku khusus untuk statistik tunggu:

Parameter Deskripsi Default Rentang
pgms_wait_sampling.history_period Frekuensi, dalam milidetik, di mana peristiwa tunggu diambil sampelnya. 100 1 - 600000
pgms_wait_sampling.query_capture_mode Pernyataan mana yang harus dilacak ekstensi pgms_wait_sampling. none none, all

Nota

pg_qs.query_capture_mode supersedes pgms_wait_sampling.query_capture_mode. Jika pg_qs.query_capture_mode adalah none, pgms_wait_sampling.query_capture_mode pengaturan tidak berpengaruh.

Gunakan portal Microsoft Azure untuk mendapatkan atau mengatur nilai yang berbeda untuk suatu parameter.

Tampilan dan fungsi

Anda bisa mengkueri informasi yang direkam oleh penyimpanan kueri dan menghapusnya dengan menggunakan tampilan dan fungsi yang tersedia dalam query_store skema azure_sys database. Siapa pun dalam peran publik PostgreSQL dapat menggunakan tampilan ini untuk melihat data di penyimpanan kueri. Tampilan ini hanya tersedia di database azure_sys.

Kueri dinormalisasi dengan melihat strukturnya dan mengabaikan apa pun yang tidak signifikan secara semantik, seperti literal, konstanta, alias, atau perbedaan dalam casing.

Jika dua kueri identik secara semantik, bahkan jika menggunakan alias yang berbeda untuk kolom dan tabel yang direferensikan yang sama, kueri tersebut diidentifikasi dengan query_id yang sama. Jika dua kueri hanya berbeda dalam nilai harfiah yang digunakan di dalamnya, kueri juga diidentifikasi dengan query_id yang sama. Untuk kueri yang diidentifikasi dengan query_id yang sama, sql_query_text adalah milik kueri yang pertama kali dijalankan sejak penyimpanan kueri mulai merekam aktivitas, atau sejak terakhir kali data berkelanjutan dihapus karena fungsi query_store.qs_reset dijalankan.

Cara kerja normalisasi kueri

Contoh berikut mengilustrasikan cara kerja normalisasi kueri:

Misalkan Anda membuat tabel dengan menggunakan pernyataan berikut:

create table tableOne (columnOne int, columnTwo int);

Anda mengaktifkan pengumpulan data Query Store, dan satu atau beberapa pengguna menjalankan kueri berikut dalam urutan yang tepat ini:

select * from tableOne;
select columnOne, columnTwo from tableOne;
select columnOne as c1, columnTwo as c2 from tableOne as t1;
select columnOne as "column one", columnTwo as "column two" from tableOne as "table one";

Semua kueri sebelumnya berbagi ID kueri yang sama. Query Store menyimpan teks kueri pertama yang berjalan setelah Anda mengaktifkan pengumpulan data. Oleh karena itu, teksnya adalah select * from tableOne;.

Kumpulan kueri berikut, setelah dinormalisasi, tidak cocok dengan kumpulan kueri sebelumnya karena klausa WHERE membuatnya berbeda secara semantik:

select columnOne as c1, columnTwo as c2 from tableOne as t1 where columnOne = 1 and columnTwo = 1;
select * from tableOne where columnOne = -3 and columnTwo = -3;
select columnOne, columnTwo from tableOne where columnOne = '5' and columnTwo = '5';
select columnOne as "column one", columnTwo as "column two" from tableOne as "table one" where columnOne = 7 and columnTwo = 7;

Namun, semua kueri dalam set terakhir ini berbagi ID kueri yang sama. Teks yang mengidentifikasi semuanya adalah teks kueri pertama dalam batch: select columnOne as c1, columnTwo as c2 from tableOne as t1 where columnOne = 1 and columnTwo = 1;.

Terakhir, kueri berikut tidak cocok dengan ID kueri kueri di batch sebelumnya. Alasan mengapa mereka tidak cocok dijelaskan dalam daftar berikut:

Kueri:

select columnTwo as c2, columnOne as c1 from tableOne as t1 where columnOne = 1 and columnTwo = 1;

Alasan untuk tidak cocok: Daftar kolom mengacu pada dua kolom yang sama (columnOne dan ColumnTwo), tetapi urutannya dibalik. Urutan berubah dari columnOne, ColumnTwo dalam batch sebelumnya menjadi ColumnTwo, columnOne dalam kueri ini.

Kueri:

select * from tableOne where columnTwo = 25 and columnOne = 25;

Alasan ketidakcocokan: Urutan evaluasi ekspresi dalam klausa WHERE dibalik. Urutan berubah dari columnOne = ? and ColumnTwo = ? dalam batch sebelumnya menjadi ColumnTwo = ? and columnOne = ? dalam kueri ini.

Kueri:

select abs(columnOne), columnTwo from tableOne where columnOne = 12 and columnTwo = 21;

Alasan untuk tidak cocok: Ekspresi pertama dalam daftar kolom tidak columnOne lagi, tetapi fungsi abs dievaluasi lebih dari columnOne (abs(columnOne)), yang tidak setara secara semantik.

Kueri:

select columnOne as "column one", columnTwo as "column two" from tableOne as "table one" where columnOne = ceiling(16) and columnTwo = 16;

Alasan untuk tidak cocok: Ekspresi pertama dalam klausul WHERE tidak mengevaluasi kesetaraan columnOne dengan literal lagi, tetapi dengan hasil fungsi ceiling yang dievaluasi melalui literal, yang tidak setara secara semantik.

Views

query_store.qs_view

Tampilan ini mengembalikan semua data yang disimpan oleh Query Store dalam tabel pendukungnya. Data yang masih direkam oleh penyimpanan kueri di memori untuk jendela waktu yang sedang aktif saat ini belum terlihat hingga jendela waktu tersebut berakhir dan data volatil di memori dikumpulkan serta disimpan secara permanen ke tabel yang disimpan pada disk. Tampilan ini mengembalikan baris yang berbeda untuk setiap database berbeda (db_id), pengguna (user_id), dan kueri (query_id).

Nama Type Referensi Deskripsi
runtime_stats_entry_id bigint ID dari tabel runtime_stats_entries.
user_id oid pg_authid.oid OID pengguna yang menjalankan pernyataan.
db_id oid pg_database.oid OID dari database tempat pernyataan tersebut dijalankan.
query_id bigint Kode hash internal, dihitung dari pohon penguraian pernyataan.
query_sql_text varchar(10000) Teks pernyataan perwakilan. Kueri yang berbeda dengan struktur yang sama diklusterkan bersama-sama. Teks ini adalah teks untuk kueri pertama dalam kluster. Nilai default untuk panjang teks kueri maksimum adalah 6.000, dan Anda dapat mengubahnya dengan menggunakan parameter pg_qs.max_query_text_lengthpenyimpanan kueri . Jika teks kueri melebihi nilai maksimum ini, teks akan dipotong ke byte pertama pg_qs.max_query_text_length .
plan_id bigint ID dari rencana yang sesuai dengan kueri ini.
start_time stempel waktu Kueri diagregasi menurut jendela waktu. Parameter pg_qs.interval_length_minutes menentukan rentang waktu jendela tersebut (defaultnya adalah 15 menit). Kolom ini sesuai dengan waktu mulai jendela tempat entri ini direkam.
end_time stempel waktu Waktu akhir yang sesuai dengan jendela waktu untuk entri ini.
calls bigint Berapa kali kueri dijalankan di jendela waktu ini. Untuk kueri paralel, jumlah panggilan untuk setiap eksekusi setara dengan 1 untuk proses backend yang menjalankan eksekusi kueri, ditambah satu unit tambahan untuk setiap proses pekerja backend yang diluncurkan untuk bekerja sama mengeksekusi cabang paralel dari pohon eksekusi.
total_time presisi ganda Total waktu eksekusi kueri, dalam milidetik.
min_time presisi ganda Waktu eksekusi kueri minimum, dalam milidetik.
max_time presisi ganda Waktu eksekusi kueri maksimum, dalam milidetik.
mean_time presisi ganda Rata-rata waktu eksekusi kueri, dalam milidetik.
stddev_time presisi ganda Standar deviasi waktu pelaksanaan kueri, dalam milidetik.
rows bigint Jumlah total baris yang diambil atau dipengaruhi oleh pernyataan. Untuk kueri paralel, jumlah baris untuk setiap eksekusi setara dengan jumlah baris yang dikembalikan ke klien oleh proses backend yang menjalankan eksekusi kueri, ditambah total semua baris yang dikembalikan ke proses backend tersebut oleh setiap proses pekerja backend yang diluncurkan untuk membantu menjalankan cabang paralel dari pohon eksekusi.
shared_blks_hit bigint Jumlah total hit cache blok bersama oleh pernyataan.
shared_blks_read bigint Jumlah total blok bersama yang dibaca oleh pernyataan.
shared_blks_dirtied bigint Jumlah total blok bersama yang dikorsi oleh pernyataan.
shared_blks_written bigint Jumlah total blok bersama yang ditulis oleh pernyataan.
local_blks_hit bigint Jumlah total pencapaian cache blok lokal dari pernyataan.
local_blks_read bigint Jumlah total blok lokal yang dibaca oleh pernyataan.
local_blks_dirtied bigint Jumlah total blok lokal yang dikorsi oleh pernyataan.
local_blks_written bigint Jumlah total blok lokal yang ditulis oleh pernyataan.
temp_blks_read bigint Jumlah total blok sementara yang dibaca oleh pernyataan.
temp_blks_written bigint Jumlah total blok sementara yang ditulis oleh pernyataan.
blk_read_time presisi ganda Total waktu yang dihabiskan pernyataan untuk membaca blok, dalam milidetik (jika track_io_timing diaktifkan, jika tidak nol).
blk_write_time presisi ganda Total waktu yang dihabiskan pernyataan untuk menulis blok, dalam milidetik (jika track_io_timing diaktifkan, jika tidak nol).
is_system_query Boolean Menentukan apakah peran dengan user_id = 10 (azuresu) menjalankan kueri. Pengguna tersebut memiliki hak istimewa superuser dan digunakan untuk melakukan operasi sarana kontrol. Karena layanan ini adalah layanan PaaS terkelola, hanya Microsoft yang merupakan bagian dari peran superuser tersebut.
query_type kirim pesan teks Jenis operasi yang diwakili oleh kueri. Nilai yang mungkin adalah unknown, , selectupdate, insert, delete, merge, utility, nothing, undefined.
search_path kirim pesan teks Nilai search_path ditetapkan pada saat kueri diambil.
query_parameters kirim pesan teks Representasi teks objek JSON dengan nilai yang diteruskan ke parameter posisi kueri berparameter. Kolom ini hanya mengisi nilainya dalam dua kasus: 1) untuk kueri yang tidak diparameterisasi. 2) Untuk kueri berparameter, ketika pg_qs.parameters_capture_mode disetel ke capture_first_sample, dan jika penyimpanan kueri dapat mengambil nilai untuk parameter kueri saat eksekusi.
parameters_capture_status kirim pesan teks Jenis operasi yang diwakili oleh kueri. Nilai yang mungkin adalah succeeded (kueri tidak diparameterkan atau kueri berparameter dan nilai berhasil diambil), disabled (kueri diparameterkan tetapi, parameter tidak diambil karena pg_qs.parameters_capture_mode diatur ke capture_parameterless_only), too_long_to_capture (kueri diparameterkan, tetapi parameter tidak diambil karena panjang JSON yang dihasilkan yang akan muncul di query_parameters kolom tampilan ini, dianggap terlalu lama agar penyimpanan kueri bertahan), too_many_to_capture (kueri diparameterkan, tetapi parameter tidak diambil karena jumlah total parameter, dianggap berlebihan agar penyimpanan kueri bertahan), serialization_failed (kueri diparameterkan, tetapi setidaknya salah satu nilai yang diteruskan sebagai parameter tidak dapat diserialisasikan ke teks).

query_store.query_texts_view

Tampilan ini mengembalikan data teks kueri di Penyimpanan Kueri. Ada satu baris untuk setiap query_sql_text yang berbeda.

Nama Type Deskripsi
query_text_id bigint ID untuk tabel query_texts
query_sql_text varchar(10000) Teks pernyataan perwakilan. Kueri yang berbeda dengan struktur yang sama diklusterkan bersama-sama. Teks ini adalah teks untuk kueri pertama dalam kluster.
query_type smallint Jenis operasi yang diwakili oleh kueri. Dalam versi PostgreSQL <= 14, nilai yang mungkin adalah 0 (tidak diketahui), 1 (pilih), 2 (perbarui), 3 (sisipkan), 4 (hapus), 5 (utilitas), 6 (tidak ada). Dalam versi PostgreSQL >= 15, nilai yang mungkin adalah 0 (tidak diketahui), (pilih), 1 (perbarui), 23 (sisipkan), 4 (hapus), 5 (gabungkan), 6 (utilitas), 7 (tidak ada).

query_store.pgms_wait_sampling_view

Tampilan ini mengembalikan data kejadian tunggu di Penyimpanan Kueri. Tampilan ini mengembalikan baris yang berbeda untuk setiap database berbeda (db_id), pengguna (user_id), kueri (query_id), dan peristiwa (peristiwa).

Nama Type Referensi Deskripsi
start_time stempel waktu Kueri diagregasi menurut jendela waktu. Parameter pg_qs.interval_length_minutes menentukan rentang waktu jendela tersebut (defaultnya adalah 15 menit). Kolom ini sesuai dengan waktu mulai jendela tempat entri ini direkam.
end_time stempel waktu Waktu akhir yang sesuai dengan jendela waktu untuk entri ini.
user_id oid pg_authid.oid Pengidentifikasi objek pengguna yang menjalankan pernyataan.
db_id oid pg_database.oid Pengidentifikasi objek database tempat pernyataan dijalankan.
query_id bigint Kode hash internal, dihitung dari pohon penguraian pernyataan.
event_type kirim pesan teks Jenis peristiwa yang dinanti backend.
event kirim pesan teks Nama peristiwa tunggu jika backend saat ini menunggu.
calls bilangan bulat Jumlah berapa kali peristiwa yang sama dicatat.

Nota

Untuk daftar nilai yang mungkin dalam kolom event_type dan event dari tampilan query_store.pgms_wait_sampling_view, lihat dokumentasi resmi pg_stat_activity dan cari informasi yang merujuk pada kolom dengan nama yang sama.

query_store.query_plans_view

Tampilan ini mengembalikan rencana kueri yang digunakan untuk menjalankan kueri. Ada satu baris untuk setiap ID database yang berbeda dan ID kueri. Penyimpanan kueri hanya merekam rencana kueri untuk kueri non-penggunaan.

Nama Type Referensi Deskripsi
plan_id bigint Nilai hash dari rencana kueri yang dinormalisasi yang dihasilkan oleh EXPLAIN. Ini dalam bentuk yang dinormalisasi karena tidak termasuk perkiraan biaya node rencana dan penggunaan buffer.
db_id oid pg_database.oid OID dari database tempat pernyataan tersebut dijalankan.
query_id bigint Kode hash internal, dihitung dari pohon penguraian pernyataan.
plan_text varchar(10000) Rencana eksekusi pernyataan yang diberikan costs=false, buffers=false, dan format=text. Output identik sebagai yang dihasilkan oleh EXPLAIN.

Functions

query_store.qs_reset

Fungsi ini menghapus semua statistik yang dikumpulkan oleh penyimpanan kueri. Ini membuang statistik untuk jendela waktu yang sudah ditutup, yang sudah disimpan ke tabel pada disk. Ini juga membuang statistik untuk jendela waktu saat ini, yang hanya ada dalam memori. Hanya anggota peran admin server (azure_pg_admin) yang dapat menjalankan fungsi ini.

toko_kueri.pembersihan_data_pentahapan

Fungsi ini menghapus semua statistik yang dikumpulkan di memori oleh penyimpanan kueri. Data ini belum ditulis ke tabel pada disk yang mendukung persistensi data yang dikumpulkan untuk Query Store. Hanya anggota peran admin server (azure_pg_admin) yang dapat menjalankan fungsi ini.

Mode baca-saja

Saat server fleksibel Azure Database for PostgreSQL berada dalam mode baca-saja, seperti ketika default_transaction_read_only parameter diatur ke on, atau jika mode baca-saja diaktifkan secara otomatis karena mencapai kapasitas penyimpanan, penyimpanan kueri tidak menangkap data apa pun.

Mengaktifkan penyimpanan kueri di server yang memiliki replika baca tidak secara otomatis mengaktifkan penyimpanan kueri pada salah satu replika baca. Bahkan jika Anda mengaktifkannya di salah satu replika baca, penyimpanan kueri tidak merekam kueri yang dijalankan pada replika baca apa pun. Replika baca beroperasi dalam mode hanya-baca hingga Anda menaikkannya menjadi instance utama.