Menyesuaikan kueri menggunakan visualizer rencana kueri

Visualisasi rencana kueri memungkinkan Anda memahami struktur rencana kueri yang dipilih oleh Spanner untuk mengevaluasi kueri dengan cepat. Panduan ini menjelaskan cara menggunakan rencana kueri untuk membantu Anda memahami eksekusi kueri.

Sebelum memulai

Untuk memahami bagian antarmuka pengguna konsol Google Cloud yang disebutkan dalam panduan ini, baca artikel berikut:

Menjalankan kueri di konsol Google Cloud

  1. Buka halaman Instances Spanner di konsol Google Cloud .

    Buka halaman Instances

  2. Pilih nama instance yang berisi database yang ingin Anda kueri.

    KonsolGoogle Cloud menampilkan halaman Ringkasan instance.

  3. Pilih nama database yang ingin Anda kueri.

    Google Cloud console menampilkan halaman Overview database.

  4. Di menu samping, klik Spanner Studio.

    Google Cloud console menampilkan halaman Spanner Studio database.

  5. Masukkan kueri SQL di panel editor.
  6. Klik Run.

    Spanner menjalankan kueri.

  7. Klik tab Penjelasan untuk melihat visualisasi paket kueri.

Tur editor kueri

Halaman Spanner Studio menyediakan tab kueri yang memungkinkan Anda mengetik atau menempelkan kueri SQL dan pernyataan DML, menjalankannya terhadap database, dan melihat hasil serta rencana eksekusi kuerinya. Komponen utama halaman Spanner Studio diberi nomor dalam screenshot berikut.

Halaman editor kueri yang diberi anotasi dengan komponen utama yang diberi nomor.
Gambar 7. Halaman editor kueri yang diberi anotasi.
  1. Tab bar menampilkan tab kueri yang telah Anda buka. Untuk membuat tab baru, klik Tab baru.

    Tab bar juga menyediakan daftar Template kueri yang dapat Anda gunakan untuk menempelkan kueri yang memberikan insight tentang kueri database, transaksi, pembacaan, dan lainnya, seperti yang dijelaskan dalam Ringkasan alat introspeksi.

  2. Panel perintah editor menyediakan opsi berikut:
    • Perintah Run menjalankan pernyataan yang dimasukkan di panel pengeditan, menghasilkan hasil kueri di tab Results dan rencana eksekusi kueri di tab Explanation. Ubah perilaku default menggunakan drop-down untuk menghasilkan Hanya hasil atau Hanya penjelasan.

      Menandai sesuatu di editor akan mengubah perintah Run menjadi Run selected, sehingga Anda dapat menjalankan hanya apa yang telah Anda pilih.

    • Perintah Hapus kueri menghapus semua teks di editor dan menghapus subtab Hasil dan Penjelasan.
    • Perintah Format kueri memformat pernyataan dalam editor sehingga lebih mudah dibaca.
    • Perintah Pintasan menampilkan kumpulan pintasan keyboard yang dapat Anda gunakan di editor.
    • Link Bantuan kueri SQL akan membuka tab browser ke dokumentasi tentang sintaksis kueri SQL.

    Kueri divalidasi secara otomatis setiap kali diperbarui di editor. Jika pernyataan valid, perintah editor bar menampilkan tanda centang konfirmasi dan pesan Valid. Jika ada masalah, pesan error dengan detail akan ditampilkan.

  3. Editor adalah tempat Anda memasukkan kueri SQL dan pernyataan DML. Kode tersebut diberi kode warna dan nomor baris ditambahkan secara otomatis untuk pernyataan multi-baris.

    Jika Anda memasukkan lebih dari satu pernyataan di editor, Anda harus menggunakan titik koma penghentian setelah setiap pernyataan kecuali yang terakhir.

  4. Panel bawah tab kueri menyediakan tiga subtab:
    • Subtab Schema menampilkan tabel dalam database dan skemanya. Gunakan sebagai referensi cepat saat menyusun pernyataan di editor.
    • Subtab Results menampilkan hasil saat Anda menjalankan pernyataan di editor. Untuk kueri, tabel hasil ditampilkan, dan untuk pernyataan DML seperti INSERT dan >UPDATE pesan tentang jumlah baris yang terpengaruh akan ditampilkan.
    • Subtab Penjelasan menampilkan grafik visual dari paket kueri yang dibuat saat Anda menjalankan pernyataan di editor.
  5. Subtab Hasil dan Penjelasan menyediakan pemilih pernyataan yang Anda gunakan untuk memilih hasil pernyataan atau rencana kueri yang ingin Anda lihat.

Melihat contoh paket kueri

    Dalam beberapa kasus, Anda mungkin ingin melihat paket kueri yang diambil sampelnya dan membandingkan performa kueri dari waktu ke waktu. Untuk kueri yang menggunakan CPU lebih tinggi, Spanner menyimpan rencana kueri yang diambil sampelnya selama 30 hari di halaman Query insights di konsol Google Cloud . Untuk melihat contoh paket kueri:

  1. Buka halaman Instances Spanner di konsol Google Cloud .

    Buka halaman Instances

  2. Klik nama instance dengan kueri yang ingin Anda selidiki.

    KonsolGoogle Cloud menampilkan halaman Ringkasan instance.

  3. Di menu Navigation dan di bagian Observability, klik Query insights.

    KonsolGoogle Cloud menampilkan halaman Query insights Instance.

  4. Di menu Database drop-down, pilih database dengan kueri yang ingin Anda selidiki.

    KonsolGoogle Cloud menampilkan informasi beban kueri untuk database. Tabel kueri dan tag TopN menampilkan daftar kueri dan tag permintaan teratas yang diurutkan berdasarkan pemakaian CPU.

  5. Temukan kueri dengan pemanfaatan CPU tinggi yang rencana kuerinya ingin Anda lihat yang disampel. Klik nilai FPRINT kueri tersebut.

    Halaman Detail kueri menampilkan grafik Contoh paket kueri untuk kueri Anda dari waktu ke waktu. Anda dapat memperkecil tampilan hingga maksimum tujuh hari sebelum waktu saat ini. Catatan: Rencana kueri tidak didukung untuk kueri dengan partitionTokens yang diperoleh dari PartitionQuery API dan kueri DML Berpartisi.

  6. Klik salah satu titik dalam grafik untuk melihat paket kueri yang lebih lama dan memvisualisasikan langkah-langkah yang dilakukan selama eksekusi kueri. Anda juga dapat mengklik operator mana pun untuk melihat informasi yang diperluas tentang operator tersebut.

    Grafik contoh paket kueri.
    Gambar 8. Grafik contoh paket kueri.

Mengikuti tur visualizer rencana kueri

Komponen utama visualizer diberi anotasi dalam screenshot berikut dan dijelaskan secara lebih mendetail. Setelah menjalankan kueri di tab kueri, pilih tab PENJELASAN di bawah editor kueri untuk membuka visualisasi rencana eksekusi kueri.

Alur data dalam diagram berikut adalah dari bawah ke atas, yaitu semua tabel dan indeks berada di bagian bawah diagram dan output akhir berada di bagian atas.

Visualizer rencana kueri yang dianotasi
Gambar 9. Visualizer rencana kueri beranotasi.

  1. Visualisasi rencana Anda bisa berukuran besar, bergantung pada kueri yang Anda jalankan. Untuk menyembunyikan dan menampilkan detail, alihkan pemilih tampilan DIPERLUAS/RINGKAS. Anda dapat menyesuaikan seberapa banyak rencana yang Anda lihat dalam satu waktu menggunakan kontrol zoom.
  2. Aljabar yang menjelaskan cara Spanner menjalankan kueri digambarkan sebagai grafik asiklik, dengan setiap node sesuai dengan iterator yang menggunakan baris dari inputnya dan menghasilkan baris ke induknya. Contoh rencana ditampilkan di Gambar 9. Klik diagram untuk melihat tampilan yang diperluas dari beberapa detail rencana.

    Thumbnail screenshot rencana visual
    Gambar 9. Contoh rencana visual (Klik untuk memperbesar).
    Screenshot rencana visual yang diperbesar

    Setiap node, atau kartu, pada grafik merepresentasikan iterator dan berisi informasi berikut:

    • Nama iterator. Iterator menggunakan baris dari inputnya dan menghasilkan baris.
    • Statistik runtime yang memberi tahu Anda berapa banyak baris yang ditampilkan, berapa latensinya, dan berapa banyak CPU yang digunakan.
    • Kami memberikan petunjuk visual berikut untuk membantu Anda mengidentifikasi potensi masalah dalam rencana eksekusi kueri.
    • Panel merah di node adalah indikator visual persentase latensi atau waktu CPU untuk iterator ini dibandingkan dengan total untuk kueri.
    • Ketebalan garis yang menghubungkan setiap node menunjukkan jumlah baris. Makin tebal garis, makin besar jumlah baris yang diteruskan ke node berikutnya. Jumlah baris sebenarnya ditampilkan di setiap kartu dan saat Anda menahan kursor di atas konektor.
    • Segitiga peringatan ditampilkan di node tempat pemindaian tabel penuh dilakukan. Detail selengkapnya di panel informasi mencakup rekomendasi seperti menambahkan indeks, atau merevisi kueri atau skema dengan cara lain jika memungkinkan untuk menghindari pemindaian penuh.
    • Pilih kartu dalam rencana untuk melihat detail di panel informasi di sebelah kanan (5).

  3. Peta mini rencana eksekusi menampilkan tampilan yang diperkecil dari rencana lengkap dan berguna untuk menentukan bentuk keseluruhan rencana eksekusi dan untuk membuka berbagai bagian rencana dengan cepat. Tarik langsung di peta mini atau klik tempat yang ingin Anda fokuskan, untuk berpindah ke bagian lain dari rencana visual.
  4. Pilih DOWNLOAD JSON untuk mendownload versi JSON dari rencana eksekusi, yang berguna untuk memecahkan masalah. Anda juga dapat membagikannya saat menghubungi tim Spanner untuk mendapatkan dukungan. Menyimpan JSON tidak menyimpan hasil kueri.

    Untuk mendownload dan menyimpan versi JSON rencana eksekusi untuk divisualisasikan nanti:

    1. Di Spanner Studio, jalankan kueri.
    2. Pilih tab Penjelasan.
    3. Klik DOWNLOAD JSON untuk mendownload versi JSON dari rencana eksekusi.
    4. Simpan dan salin konten file JSON.
    5. Buka tab editor kueri baru.
    6. Di tab editor, masukkan:
        PROTO:
        CONTENT_OF_JSON
      
    7. Klik Run.
    8. Pilih tab Penjelasan di bawah editor kueri untuk melihat representasi visual dari paket eksekusi yang didownload.
  5. Panel informasi menampilkan informasi kontekstual mendetail tentang node yang dipilih dalam diagram rencana kueri. Informasi tersebut dikelompokkan ke dalam kategori berikut.
    • Informasi iterator memberikan detail, serta statistik runtime, untuk kartu iterator yang Anda pilih dalam grafik.
    • Ringkasan kueri memberikan detail tentang jumlah baris yang ditampilkan dan waktu yang diperlukan untuk menjalankan kueri. Operator yang menonjol adalah operator yang menunjukkan latensi signifikan, menggunakan CPU yang signifikan dibandingkan dengan operator lain, dan menampilkan sejumlah besar baris data.
    • Linimasa eksekusi kueri adalah grafik berbasis waktu yang menunjukkan durasi setiap grup mesin menjalankan bagian kuerinya. Grup mesin mungkin tidak selalu berjalan selama seluruh durasi waktu berjalan kueri. Ada juga kemungkinan bahwa grup mesin berjalan beberapa kali selama menjalankan kueri, tetapi linimasa di sini hanya menampilkan waktu mulai saat pertama kali dijalankan dan waktu berakhir saat terakhir kali dijalankan.

Menyesuaikan kueri yang menunjukkan performa buruk

Bayangkan perusahaan Anda menjalankan database film online yang berisi informasi tentang film seperti pemeran, perusahaan produksi, detail film, dan lainnya. Layanan berjalan di Spanner, tetapi mengalami beberapa masalah performa baru-baru ini.

Sebagai developer utama untuk layanan, Anda diminta untuk menyelidiki masalah performa ini karena menyebabkan rating layanan yang buruk. Anda membuka konsol Google Cloud , membuka instance database, lalu membuka editor kueri. Anda memasukkan kueri berikut ke dalam editor dan menjalankannya.

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
FROM
  title AS t
JOIN
  movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;

Hasil menjalankan kueri ini ditampilkan dalam screenshot berikut. Kita memformat kueri di editor dengan memilih FORMAT QUERY. Ada juga catatan di kanan atas layar yang memberi tahu kita bahwa kueri valid.

Editor kueri menampilkan kueri asli
Gambar 1. Editor kueri yang menampilkan kueri asli.

Tab RESULTS di bawah editor kueri menunjukkan bahwa kueri selesai dalam waktu lebih dari dua menit. Anda memutuskan untuk melihat kueri lebih dekat untuk melihat apakah kueri tersebut efisien.

Menganalisis kueri lambat dengan visualizer rencana kueri

Pada tahap ini, kita tahu bahwa kueri pada langkah sebelumnya memerlukan waktu lebih dari dua menit, tetapi kita tidak tahu apakah kueri tersebut seefisien mungkin dan, oleh karena itu, apakah durasi ini sudah sesuai.

Anda memilih tab PENJELASAN tepat di bawah editor kueri untuk melihat representasi visual rencana eksekusi yang dibuat Spanner untuk menjalankan kueri dan menampilkan hasil.

Rencana yang ditampilkan dalam screenshot berikut relatif besar, tetapi bahkan pada tingkat zoom ini, Anda dapat membuat pengamatan berikut.

  • Berdasarkan Ringkasan kueri di panel informasi di sebelah kanan, kita mengetahui bahwa hampir 3 juta baris dipindai dan kurang dari 64 ribu baris yang akhirnya ditampilkan.

  • Kita juga dapat melihat dari panel Linimasa eksekusi kueri bahwa 4 grup mesin terlibat dalam kueri. Grup mesin bertanggung jawab atas eksekusi sebagian kueri. Operator dapat melakukan eksekusi di satu atau beberapa mesin. Memilih grup mesin di linimasa akan menandai bagian kueri yang dieksekusi di grup tersebut pada rencana visual.

Visualizer rencana kueri yang menampilkan penjelasan visual kueri asli
Gambar 2. Visualizer rencana kueri yang menampilkan rencana visual kueri asli.

Karena faktor-faktor ini, Anda memutuskan bahwa peningkatan performa mungkin dapat dilakukan dengan mengubah gabungan dari gabungan penerapan, yang dipilih Spanner secara default, menjadi gabungan hash.

Meningkatkan kualitas kueri

Untuk meningkatkan performa kueri, Anda menggunakan petunjuk gabungan untuk mengubah metode gabungan menjadi gabungan hash. Implementasi gabungan ini menjalankan pemrosesan berbasis set.

Berikut kueri yang diperbarui:

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note HAVING MIN t.production_year) AS note
FROM
  title AS t
JOIN
  @{join_method=hash_join} movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;

Screenshot berikut menggambarkan kueri yang telah diperbarui. Seperti yang ditunjukkan dalam screenshot, kueri selesai dalam waktu kurang dari 5 detik, peningkatan yang signifikan dibandingkan waktu proses 120 detik sebelum perubahan ini.

Editor kueri yang menampilkan kueri yang ditingkatkan
Gambar 3. Editor kueri yang menampilkan kueri yang ditingkatkan.

Periksa rencana visual baru, yang ditunjukkan dalam diagram berikut, untuk melihat apa yang dapat kita pelajari dari peningkatan ini.

Visualisasi kueri di UI konsol Cloud
Gambar 4. Visualisasi paket kueri setelah peningkatan kueri (Klik untuk memperbesar).

Screenshot rencana visual yang diperbesar

Segera, Anda akan melihat beberapa perbedaan:

  • Hanya satu grup mesin yang terlibat dalam eksekusi kueri ini.

  • Jumlah agregasi telah berkurang secara drastis.

Kesimpulan

Dalam skenario ini, kami menjalankan kueri lambat dan melihat rencana visualnya untuk mencari inefisiensi. Berikut adalah ringkasan kueri dan rencana sebelum dan sesudah perubahan dilakukan. Setiap tab menampilkan kueri yang dijalankan dan tampilan ringkas visualisasi rencana eksekusi kueri lengkap.

Sebelum

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note
  HAVING
    MIN t.production_year) AS note
FROM
  title AS t
JOIN
  movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;
Tampilan ringkas rencana visual sebelum peningkatan.
Gambar 5. Tampilan ringkas rencana visual sebelum peningkatan.

Setelah

SELECT
  t.title,
  MIN(t.production_year) AS year,
  ANY_VALUE(mc.note
  HAVING
    MIN t.production_year) AS note
FROM
  title AS t
JOIN
  @{join_method=hash_join} movie_companies AS mc
ON
  t.id = mc.movie_id
WHERE
  t.title LIKE '% the %'
GROUP BY
  title;
Tampilan ringkas rencana visual setelah peningkatan.
Gambar 6. Tampilan ringkas rencana visual setelah peningkatan.

Indikator bahwa ada sesuatu yang dapat ditingkatkan dalam skenario ini adalah sebagian besar baris dari tabel title memenuhi syarat filter LIKE '% the %'. Mencari ke tabel lain dengan begitu banyak baris kemungkinan akan mahal. Mengubah implementasi gabungan kami menjadi gabungan hash meningkatkan performa secara signifikan.

Langkah berikutnya