Statistik pemisahan

Halaman ini menjelaskan cara mendeteksi dan men-debug hotspot di database Anda. Anda dapat mengakses statistik tentang hotspot dalam pemisahan dengan GoogleSQL dan PostgreSQL.

Spanner menyimpan data Anda sebagai ruang kunci yang berdekatan, yang diurutkan berdasarkan kunci utama tabel dan indeks Anda. Pemisahan adalah rentang baris dari sekumpulan tabel atau indeks. Awal pemisahan disebut awal pemisahan. Batas pemisahan menetapkan akhir pemisahan. Pemisahan mencakup awal pemisahan, tetapi tidak mencakup batas pemisahan.

Di Spanner, hotspot adalah situasi ketika terlalu banyak permintaan dikirim ke server yang sama sehingga membebani resource server dan berpotensi menyebabkan latensi tinggi. Pemisahan yang terpengaruh oleh hotspot dikenal sebagai pemisahan panas atau hangat.

Statistik hotspot pemisahan (diidentifikasi dalam sistem sebagai CPU_USAGE_SCORE) adalah pengukuran beban pada pemisahan yang dibatasi oleh resource yang tersedia di server. Pengukuran ini diberikan sebagai persentase. Jika lebih dari 50% beban pada pemisahan dibatasi oleh resource yang tersedia, maka pemisahan dianggap warm. Jika 100% beban pada pemisahan dibatasi, maka pemisahan dianggap hot.

Spanner menggunakan pemisahan berbasis beban untuk mendistribusikan beban data secara merata di seluruh server instance. Pemisahan hangat dan panas dapat dipindahkan di seluruh server untuk penyeimbangan beban atau dapat dibagi menjadi pemisahan yang lebih kecil. Namun, Spanner mungkin tidak dapat menyeimbangkan beban, bahkan setelah beberapa kali mencoba membagi, karena anti-pola dalam aplikasi. Oleh karena itu, hotspot persisten yang berlangsung setidaknya 10 menit mungkin memerlukan pemecahan masalah lebih lanjut dan potensi perubahan aplikasi.

Statistik pemisahan aktif Spanner membantu Anda mengidentifikasi pemisahan tempat terjadinya hotspot. Kemudian, Anda dapat membuat perubahan pada aplikasi atau skema sesuai kebutuhan. Anda dapat mengambil statistik ini dari tabel sistem SPANNER_SYS.SPLIT_STATS_TOP_MINUTE menggunakan pernyataan SQL.

Mengakses statistik pemisahan panas

Spanner menyediakan statistik pemisahan aktif dalam skema SPANNER_SYS. Data SPANNER_SYS hanya tersedia melalui antarmuka GoogleSQL dan PostgreSQL. Anda dapat menggunakan cara berikut untuk mengakses data ini:

Metode baca tunggal berikut yang disediakan Spanner tidak mendukung SPANNER_SYS:

  • Melakukan pembacaan yang kuat dari satu baris atau beberapa baris dalam tabel.
  • Melakukan pembacaan basi dari satu baris atau beberapa baris dalam tabel.
  • Membaca dari satu baris atau beberapa baris dalam indeks sekunder.

Statistik pemisahan panas

Anda menggunakan tabel berikut untuk melacak pemisahan panas:

  • SPANNER_SYS.SPLIT_STATS_TOP_MINUTE: menampilkan pemisahan yang populer selama interval 1 menit.

Tabel ini memiliki properti berikut:

  • Setiap tabel berisi data untuk interval waktu yang tidak tumpang-tindih selama durasi yang ditentukan nama tabel.
  • Interval didasarkan pada waktu jam:

    • Interval 1 menit berakhir pada menit ke-0.
  • Setelah setiap interval, Spanner mengumpulkan data dari semua server dan kemudian menyediakan data tersebut di tabel SPANNER_SYS tidak lama setelahnya.

    Misalnya, pada pukul 11.59.30, interval terbaru yang tersedia untuk kueri SQL adalah:

    • 1 menit: 11.58.00-11.58.59 AM
  • Spanner mengelompokkan statistik berdasarkan pemisahan.

  • Setiap baris berisi persentase yang menunjukkan seberapa sering atau hangat pemisahan terjadi, untuk setiap pemisahan yang datanya dikumpulkan Spanner selama interval yang ditentukan.

  • Jika kurang dari 50% beban pada split dibatasi oleh resource yang tersedia, Spanner tidak akan mencatat statistik. Jika Spanner tidak dapat menyimpan semua pemisahan aktif selama interval, sistem akan memprioritaskan pemisahan dengan persentase CPU_USAGE_SCORE tertinggi selama interval yang ditentukan. Jika tidak ada pemisahan yang ditampilkan, berarti tidak ada hotspot.

Skema tabel

Tabel berikut menunjukkan skema tabel untuk statistik berikut:

  • SPANNER_SYS.SPLIT_STATS_TOP_MINUTE
Nama kolom Jenis Deskripsi
INTERVAL_END TIMESTAMP Akhir interval waktu saat pemisahan aktif
SPLIT_START STRING Kunci awal rentang baris dalam pemisahan. Awal pemisahan juga dapat berupa <begin>, yang menunjukkan awal ruang kunci
SPLIT_LIMIT STRING Kunci batas untuk rentang baris dalam pemisahan. Batas: kunci juga dapat berupa <end>, yang menunjukkan akhir dari ruang kunci|
CPU_USAGE_SCORE INT64 Persentase CPU_USAGE_SCORE dari pemisahan. Persentase CPU_USAGE_SCORE sebesar 50% menunjukkan adanya pemisahan | warm atau hot |
AFFECTED_TABLES STRING ARRAY Tabel yang barisnya mungkin ada dalam pemisahan

Kunci awal pemisahan dan batas pemisahan

Pemisahan adalah rentang baris yang berdekatan dari database, dan ditentukan oleh kunci start dan limit. Pemisahan dapat berupa satu baris, rentang baris sempit, atau rentang baris lebar, dan pemisahan dapat mencakup beberapa tabel atau indeks.

Kolom SPLIT_START dan SPLIT_LIMIT mengidentifikasi kunci utama pemisahan hangat atau panas.

Contoh skema

Skema berikut adalah contoh tabel untuk topik di halaman ini.

GoogleSQL

CREATE TABLE Users (
  UserId INT64 NOT NULL,
  FirstName STRING(MAX),
  LastName STRING(MAX),
) PRIMARY KEY(UserId);

CREATE INDEX UsersByFirstName ON Users(FirstName DESC);

CREATE TABLE Threads (
  UserId INT64 NOT NULL,
  ThreadId INT64 NOT NULL,
  Starred BOOL,
) PRIMARY KEY(UserId, ThreadId),
  INTERLEAVE IN PARENT Users ON DELETE CASCADE;

CREATE TABLE Messages (
  UserId INT64 NOT NULL,
  ThreadId INT64 NOT NULL,
  MessageId INT64 NOT NULL,
  Subject STRING(MAX),
  Body STRING(MAX),
) PRIMARY KEY(UserId, ThreadId, MessageId),
  INTERLEAVE IN PARENT Threads ON DELETE CASCADE;

CREATE INDEX MessagesIdx ON Messages(UserId, ThreadId, Subject),
INTERLEAVE IN Threads;

PostgreSQL

CREATE TABLE users
(
   userid    BIGINT NOT NULL PRIMARY KEY,-- INT64 to BIGINT
   firstname VARCHAR(max),-- STRING(MAX) to VARCHAR(MAX)
   lastname  VARCHAR(max)
);

CREATE INDEX usersbyfirstname
  ON users(firstname DESC);

CREATE TABLE threads
  (
    userid   BIGINT NOT NULL,
    threadid BIGINT NOT NULL,
    starred  BOOLEAN, -- BOOL to BOOLEAN
    PRIMARY KEY (userid, threadid),
    CONSTRAINT fk_threads_user FOREIGN KEY (userid) REFERENCES users(userid) ON
    DELETE CASCADE -- Interleave to Foreign Key constraint
  );

CREATE TABLE messages
  (
    userid    BIGINT NOT NULL,
    threadid  BIGINT NOT NULL,
    messageid BIGINT NOT NULL PRIMARY KEY,
    subject   VARCHAR(max),
    body      VARCHAR(max),
    CONSTRAINT fk_messages_thread FOREIGN KEY (userid, threadid) REFERENCES
    threads(userid, threadid) ON DELETE CASCADE
  -- Interleave to Foreign Key constraint
  );

CREATE INDEX messagesidx ON messages(userid, threadid, subject), REFERENCES
threads(userid, threadid);

Bayangkan ruang kunci Anda terlihat seperti ini:

KUNCI UTAMA
<begin>
Users()
Threads()
Users(2)
Users(3)
Threads(3)
Threads(3,"a")
Messages(3,"a",1)
Messages(3,"a",2)
Threads(3, "aa")
Users(9)
Users(10)
Threads(10)
UsersByFirstName("abc")
UsersByFirstName("abcd")
<end>

Contoh pemisahan

Berikut beberapa contoh pemisahan untuk membantu Anda memahami tampilan pemisahan.

SPLIT_START dan SPLIT_LIMIT dapat menunjukkan baris tabel atau indeks, atau dapat berupa <begin> dan <end>, yang merepresentasikan batas ruang kunci database. SPLIT_START dan SPLIT_LIMIT juga dapat berisi kunci yang dipangkas, yaitu kunci yang mendahului kunci lengkap dalam tabel. Misalnya, Threads(10) adalah awalan untuk baris Threads yang disisipkan dalam Users(10).

SPLIT_START SPLIT_LIMIT AFFECTED_TABLES PENJELASAN
Users(3) Users(10) UsersByFirstName, Users, Threads, Messages, MessagesIdx Pemisahan dimulai pada baris dengan UserId=3 dan berakhir pada baris sebelum baris dengan UserId = 10. Pemisahan berisi baris tabel Users dan semua baris tabel yang disisipkan untuk UserId=3 hingga 10.
Messages(3,"a",1) Threads(3,"aa") Threads, Messages, MessagesIdx Pemisahan dimulai pada baris dengan UserId=3, ThreadId="a", dan MessageId=1, lalu berakhir pada baris sebelum baris dengan kunci UserId=3 dan ThreadsId = "aa". Pemisahan ini berisi semua tabel antara Messages(3,"a",1) dan Threads(3,"aa"). Karena split_start dan split_limit disisipkan dalam baris tabel tingkat teratas yang sama, pemisahan berisi baris tabel yang disisipkan antara awal dan batas. Lihat schemas-overview untuk memahami cara tabel sisipan ditempatkan bersama.
Messages(3,"a",1) <end> UsersByFirstName, Users, Threads, Messages, MessagesIdx Pemisahan dimulai di tabel pesan pada baris dengan kunci UserId=3, ThreadId="a", dan MessageId=1. Bagian ini menghosting semua baris dari split_start hingga <end>, akhir ruang kunci database. Semua baris tabel setelah split_start, seperti Users(4), disertakan dalam pemisahan.
<begin> Users(9) UsersByFirstName, Users, Threads, Messages, MessagesIdx Pemisahan dimulai di <begin>, awal ruang kunci database, dan berakhir di baris sebelum baris Users dengan UserId=9. Jadi, pemisahan memiliki semua baris tabel sebelum Users dan semua baris tabel Users sebelum UserId=9 serta baris tabel sisipannya.
Messages(3,"a",1) Threads(10) UsersByFirstName, Users, Threads, Messages, MessagesIdx Pemisahan dimulai pada Messages(3,"a", 1) yang disisipkan di Users(3) dan berakhir pada baris sebelum Threads(10). Threads(10) adalah kunci pemisahan yang dipangkas yang merupakan awalan dari kunci tabel Thread yang disisipkan di Users(10).
Users() <end> UsersByFirstName, Users, Threads, Messages, MessagesIdx Pemisahan dimulai pada kunci pemisahan yang dipangkas dari Users() yang mendahului kunci lengkap dari tabel Users. Pemisahan diperluas hingga akhir kemungkinan ruang kunci dalam database. Oleh karena itu, affected_tables mencakup tabel Users, tabel dan indeks yang disisipkan, serta semua tabel yang mungkin muncul setelah pengguna.
Threads(10) UsersByFirstName("abc") UsersByFirstName, Users, Threads, Messages, MessagesIdx Pemisahan dimulai pada baris Threads dengan UserId = 10 dan berakhir pada indeks, UsersByFirstName pada kunci sebelum "abc".

Contoh kueri untuk menemukan pemisahan yang populer

Contoh berikut menunjukkan pernyataan SQL yang dapat Anda gunakan untuk mengambil statistik pemisahan panas. Anda dapat menjalankan pernyataan SQL ini menggunakan library klien, gcloud, atau konsol Google Cloud .

GoogleSQL

SELECT t.split_start,
       t.split_limit,
       t.cpu_usage_score,
       t.affected_tables,
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.interval_end =
  (SELECT MAX(interval_end)
  FROM    SPANNER_SYS.SPLIT_STATS_TOP_MINUTE)
ORDER BY  t.cpu_usage_score DESC;

PostgreSQL

SELECT t.split_start,
       t.split_limit,
       t.cpu_usage_score,
       t.affected_tables
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.interval_end = (
  SELECT MAX(interval_end)
  FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE
)
ORDER BY t.cpu_usage_score DESC;

Output kueri akan terlihat seperti berikut:

SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE AFFECTED_TABLES
Users(13) Users(76) 82 Messages,Users,Threads
Users(101) Users(102) 90 Messages,Users,Threads
Threads(10, "a") Threads(10, "aa") 100 Messages,Threads
Messages(631, "abc", 1) Messages(631, "abc", 3) 100 Messages
Threads(12, "zebra") Users(14) 76 Messages,Users,Threads
Users(620) <end> 100 Messages,Users,Threads

Retensi data untuk statistik pemisahan panas

Setidaknya, Spanner menyimpan data untuk setiap tabel selama periode waktu berikut:

  • SPANNER_SYS.SPLIT_STATS_TOP_MINUTE: Interval yang mencakup 6 jam sebelumnya.

Memecahkan masalah hotspot menggunakan statistik pemisahan hot

Bagian ini menjelaskan cara mendeteksi dan memecahkan masalah hotspot.

Pilih jangka waktu yang akan diselidiki

Periksa metrik latensi untuk database Spanner Anda guna menemukan jangka waktu saat aplikasi Anda mengalami latensi tinggi dan penggunaan CPU. Misalnya, masalah mungkin mulai terjadi sekitar pukul 22.50 pada 18 Mei 2024.

Menemukan hotspot persisten

Karena Spanner menyeimbangkan beban Anda dengan pemisahan berbasis beban, sebaiknya Anda menyelidiki apakah hotspotting telah berlanjut selama lebih dari 10 menit. Anda dapat melakukannya dengan membuat kueri tabel SPANNER_SYS.SPLIT_STATS_TOP_MINUTE, seperti yang ditunjukkan dalam contoh berikut:

GoogleSQL

SELECT Count(DISTINCT t.interval_end)
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.cpu_usage_score >= 50
  AND  t.interval_end >= "interval_end_date_time"
  AND  t.interval_end <= "interval_end_date_time";

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

PostgreSQL

SELECT COUNT(DISTINCT t.interval_end)
FROM   SPLIT_STATS_TOP_MINUTE t
WHERE  t.cpu_usage_score >= 50
  AND  t.interval_end >= 'interval_end_date_time'::timestamptz
  AND  t.interval_end <= 'interval_end_date_time'::timestamptz;

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

Jika hasil kueri sebelumnya sama dengan 10, berarti database Anda mengalami hotspotting yang mungkin memerlukan proses debug lebih lanjut.

Menemukan pemisahan dengan tingkat CPU_USAGE_SCORE tertinggi

Untuk contoh ini, kita menjalankan SQL berikut untuk menemukan rentang baris dengan tingkat CPU_USAGE_SCORE tertinggi:

GoogleSQL

SELECT t.split_start,
       t.split_limit,
       t.affected_tables,
       t.cpu_usage_score
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.cpu_usage_score >= 50
  AND  t.interval_end = "interval_end_date_time";

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

PostgreSQL

SELECT t.split_start,
       t.split_limit,
       t.affected_tables,
       t.cpu_usage_score
FROM   SPLIT_STATS_TOP_MINUTE t
WHERE  t.cpu_usage_score = 100
  AND  t.interval_end = 'interval_end_date_time'::timestamptz;

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

SQL sebelumnya menghasilkan output berikut:

SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE AFFECTED_TABLES
Users(180) <end> 85 Messages,Users,Threads
Users(24) Users(76) 76 Messages,Users,Threads

Dari tabel hasil ini, kita dapat melihat bahwa hotspot terjadi pada dua pemisahan. Pemecahan berbasis beban Spanner dapat mencoba menyelesaikan hotspot pada pemecahan ini. Namun, hal ini mungkin tidak dapat dilakukan jika ada pola yang bermasalah dalam skema atau workload. Untuk mendeteksi apakah ada pemisahan yang memerlukan intervensi Anda, sebaiknya lacak pemisahan selama minimal 10 menit. Misalnya, SQL berikut melacak pemisahan pertama selama sepuluh menit terakhir.

GoogleSQL

SELECT t.interval_end,
       t.split_start,
       t.split_limit,
       t.cpu_usage_score
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.split_start = "users(180)"
  AND  t.split_limit = "<end>"
  AND  t.interval_end >= "interval_end_date_time"
  AND  t.interval_end <= "interval_end_date_time";

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

PostgreSQL

SELECT t.interval_end,
       t.split_start,
       t.split_limit,
       t.cpu_usage_score
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.split_start = 'users(180)'
  AND  t.split_limit = ''
  AND  t.interval_end >= 'interval_end_date_time'::timestamptz
  AND  t.interval_end <= 'interval_end_date_time'::timestamptz;

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

SQL sebelumnya menghasilkan output berikut:

INTERVAL_END SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE
2024-05-18T17:46:00Z Users(180) <end> 85
2024-05-18T17:47:00Z Users(180) <end> 85
2024-05-18T17:48:00Z Users(180) <end> 85
2024-05-18T17:49:00Z Users(180) <end> 85
2024-05-18T17:50:00Z Users(180) <end> 85

Sepertinya pembagiannya sangat menarik dalam beberapa menit terakhir. Anda mungkin mengamati pemisahan lebih lama untuk menentukan bahwa pemisahan berbasis beban Spanner mengurangi hotspot. Mungkin ada kasus di mana Spanner tidak dapat menyeimbangkan beban lebih lanjut.

Misalnya, buat kueri tabel SPANNER_SYS.SPLIT_STATS_TOP_MINUTE. Lihat contoh skenario berikut.

GoogleSQL

SELECT t.interval_end,
      t.split_start,
      t.split_limit,
      t.cpu_usage_score
FROM  SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE t.interval_end >= "interval_end_date_time"
      AND t.interval_end <= "interval_end_date_time";

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

PostgreSQL

SELECT t.interval_end,
       t.split_start,
       t.split_limit,
       t._cpu_usage
FROM   SPANNER_SYS.SPLIT_STATS_TOP_MINUTE t
WHERE  t.interval_end >= 'interval_end_date_time'::timestamptz
  AND  t.interval_end <= 'interval_end_date_time'::timestamptz;

Ganti interval_end_date_time dengan tanggal dan waktu untuk interval, menggunakan format 2024-05-18T17:40:00Z.

Baris aktif tunggal

Pada contoh berikut, Threads(10,"spanner") tampaknya berada dalam pemisahan baris tunggal yang tetap aktif selama lebih dari 10 menit. Hal ini dapat terjadi jika ada pemuatan berkelanjutan pada baris populer.

INTERVAL_END SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE
2024-05-16T20:40:00Z Threads(10,"spanner") Threads(10,"spanner1") 62
2024-05-16T20:41:00Z Threads(10,"spanner") Threads(10,"spanner1") 62
2024-05-16T20:42:00Z Threads(10,"spanner") Threads(10,"spanner1") 62
2024-05-16T20:43:00Z Threads(10,"spanner") Threads(10,"spanner1") 62
2024-05-16T20:44:00Z Threads(10,"spanner") Threads(10,"spanner1") 62
2024-05-16T20:45:00Z Threads(10,"spanner") Threads(10,"spanner1") 62
2024-05-16T20:46:00Z Threads(10,"spanner") Threads(10,"spanner1") 80
2024-05-16T20:47:00Z Threads(10,"spanner") Threads(10,"spanner1") 80
2024-05-16T20:48:00Z Threads(10,"spanner") Threads(10,"spanner1") 80
2024-05-16T20:49:00Z Threads(10,"spanner") Threads(10,"spanner1") 100
2024-05-16T20:50:00Z Threads(10,"spanner") Threads(10,"spanner1") 100

Spanner tidak dapat menyeimbangkan beban untuk satu kunci ini karena tidak dapat dibagi lebih lanjut.

Memindahkan hotspot

Dalam contoh berikut, beban bergerak melalui pemisahan yang berdekatan dari waktu ke waktu, berpindah ke pemisahan baru di seluruh interval waktu.

INTERVAL_END SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE
2024-05-16T20:40:00Z Threads(1,"a") Threads(1,"aa") 100
2024-05-16T20:41:00Z Threads(1,"aa") Threads(1,"ab") 100
2024-05-16T20:42:00Z Threads(1,"ab") Threads(1,"c") 100
2024-05-16T20:43:00Z Threads(1,"c") Threads(1,"ca") 100

Hal ini dapat terjadi, misalnya, karena workload yang membaca atau menulis kunci dalam urutan yang meningkat secara monoton. Spanner tidak dapat menyeimbangkan beban untuk mengurangi efek perilaku aplikasi ini.

Load balancing normal

Spanner mencoba menyeimbangkan beban dengan menambahkan lebih banyak pemisahan atau memindahkan pemisahan. Contoh berikut menunjukkan kemungkinan tampilannya.

INTERVAL_END SPLIT_START SPLIT_LIMIT CPU_USAGE_SCORE
2024-05-16T20:40:00Z Threads(1000,"zebra") <end> 82
2024-05-16T20:41:00Z Threads(1000,"zebra") <end> 90
2024-05-16T20:42:00Z Threads(1000,"zebra") <end> 100
2024-05-16T20:43:00Z Threads(1000,"zebra") Threads(2000,"spanner") 100
2024-05-16T20:44:00Z Threads(1200,"c") Threads(2000) 92
2024-05-16T20:45:00Z Threads(1500,"c") Threads(1700,"zach") 76
2024-05-16T20:46:00Z Threads(1700) Threads(1700,"c") 76
2024-05-16T20:47:00Z Threads(1700) Threads(1700,"c") 50
2024-05-16T20:48:00Z Threads(1700) Threads(1700,"c") 39

Di sini, pemisahan yang lebih besar pada 2024-05-16T17:40:00Z dibagi lagi menjadi pemisahan yang lebih kecil dan akibatnya, statistik CPU_USAGE_SCORE menurun. Spanner mungkin tidak membuat pemisahan ke dalam baris individual. Pemisahan mencerminkan workload yang menyebabkan statistik CPU_USAGE_SCORE tinggi.

Jika Anda telah mengamati pemisahan panas yang persisten selama lebih dari 10 menit, lihat Praktik terbaik untuk memitigasi hotspot.

Praktik terbaik untuk mengurangi hotspot

Jika penyeimbangan beban tidak mengurangi latensi, langkah selanjutnya adalah mengidentifikasi penyebab hotspot. Setelah itu, opsi yang tersedia adalah mengurangi beban kerja hotspot, atau mengoptimalkan skema dan logika aplikasi untuk menghindari hotspot.

Mengidentifikasi penyebabnya

  • Gunakan Lock & Transaction Insights untuk mencari transaksi yang memiliki waktu tunggu kunci yang tinggi dengan kunci awal rentang baris berada dalam pemisahan aktif.

  • Gunakan Query Insights untuk mencari kueri yang membaca dari tabel yang berisi pemisahan aktif, dan baru-baru ini mengalami peningkatan latensi, atau rasio latensi terhadap CPU yang lebih tinggi.

  • Gunakan Kueri Aktif Terlama untuk mencari kueri yang membaca dari tabel yang berisi pemisahan panas, dan yang memiliki latensi lebih tinggi dari yang diharapkan.

Beberapa kasus khusus yang perlu diperhatikan:

  • Periksa apakah time to live (TTL) diaktifkan baru-baru ini. Jika ada banyak pemisahan dari data lama, TTL dapat meningkatkan tingkat CPU_USAGE_SCORE selama penghapusan massal. Dalam hal ini, masalah akan teratasi sendiri setelah penghapusan awal selesai.

Mengoptimalkan workload

  • Ikuti praktik terbaik SQL. Pertimbangkan pembacaan yang tidak valid, penulisan yang tidak melakukan pembacaan terlebih dahulu, atau menambahkan indeks.
  • Ikuti Praktik terbaik skema. Pastikan skema Anda dirancang untuk menangani load balancing dan menghindari hotspot.

Langkah berikutnya