Menyesuaikan kueri menggunakan visualizer rencana kueri

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

Sebelum memulai

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

Menjalankan kueri di konsol Google Cloud

  1. Buka halaman Instance Spanner di Google Cloud Console.

    Buka halaman Instance

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

    Google Cloud Console menampilkan halaman Overview instance.

  3. Pilih nama database yang ingin Anda kueri.

    Konsol Google Cloud menampilkan halaman Overview database.

  4. Di menu samping, klik Spanner Studio.

    Konsol Google Cloud 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 rencana kueri.

Tur editor kueri

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

Halaman kueri yang diberi anotasi.
Gambar 7. Halaman Kueri yang Dianotasi.
  1. Panel tab menampilkan tab kueri yang telah Anda buka. Untuk membuat tab baru, klik Tab baru.

    Panel tab 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 mengeksekusi pernyataan yang dimasukkan di panel pengeditan, memberikan hasil kueri di tab Results dan rencana eksekusi kueri di tab Penjelasan. Ubah perilaku default menggunakan drop-down untuk menghasilkan Hasil saja atau Hanya penjelasan.

      Menyoroti sesuatu di editor akan mengubah perintah Run menjadi Run selected, sehingga Anda dapat mengeksekusi apa yang telah dipilih.

    • Perintah Clear query menghapus semua teks di editor dan menghapus subtab Results dan Explanation.
    • Perintah Format query memformat pernyataan di editor agar lebih mudah dibaca.
    • Perintah Shortcuts menampilkan serangkaian pintasan keyboard yang dapat Anda gunakan di editor.
    • Link Bantuan kueri SQL membuka tab browser untuk dokumentasi tentang sintaksis kueri SQL.

    Kueri divalidasi secara otomatis setiap kali diperbarui di editor. Jika pernyataan tersebut valid, kolom perintah editor akan menampilkan tanda centang konfirmasi dan pesan Valid. Jika ada masalah, pesan error beserta detailnya akan ditampilkan.

  3. Editor adalah tempat Anda memasukkan kueri SQL dan pernyataan DML. Baris tersebut berkode warna dan nomor baris ditambahkan secara otomatis untuk pernyataan multibaris.

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

  4. Panel bawah tab kueri menyediakan tiga subtab:
    • Subtab Skema menampilkan tabel dalam database dan skemanya. Gunakan sebagai referensi cepat saat membuat pernyataan di editor.
    • Subtab Hasil menampilkan hasil saat Anda menjalankan pernyataan di editor. Untuk kueri, tampilan ini menampilkan tabel hasil, dan untuk pernyataan DML seperti INSERT dan >UPDATE, akan ditampilkan pesan tentang jumlah baris yang terpengaruh.
    • Subtab Penjelasan menampilkan grafik visual rencana 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 sampel paket kueri

    Dalam beberapa kasus, Anda mungkin ingin melihat contoh paket kueri dan membandingkan performa kueri dari waktu ke waktu. Untuk kueri yang menggunakan CPU yang lebih tinggi, Spanner mempertahankan sampel paket kueri selama 30 hari di halaman Insight kueri di Konsol Google Cloud. Untuk melihat contoh paket kueri:

  1. Buka halaman Instance Spanner di Google Cloud Console.

    Buka halaman Instance

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

    Google Cloud Console menampilkan halaman Overview instance.

  3. Di menu Navigasi dan di bagian judul Kemampuan observasi, klik Query insights.

    Konsol Google Cloud akan menampilkan halaman Query insights Instance.

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

    Konsol Google Cloud menampilkan informasi pemuatan kueri untuk database. Tabel kueri dan tag TopN menampilkan daftar kueri teratas dan tag permintaan yang diurutkan berdasarkan pemakaian CPU.

  5. Temukan kueri dengan pemakaian CPU tinggi yang ingin Anda lihat paket kueri sampelnya. Klik nilai FPRINT dari kueri tersebut.

    Halaman Query details menampilkan grafik Query plans sample untuk kueri Anda dari waktu ke waktu. Anda dapat memperkecil hingga maksimum tujuh hari sebelum waktu saat ini. Catatan: Paket kueri tidak didukung untuk kueri dengan partitionTokens yang diperoleh dari kueri PartitionQuery API dan DML Terpartisi.

  6. Klik salah satu titik dalam grafik untuk melihat paket kueri yang lebih lama dan memvisualisasikan langkah-langkah yang diambil 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 rencana kueri.

Ikuti tur visualizer rencana kueri

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

Aliran data dalam diagram berikut bersifat bottom-up, yaitu semua tabel dan indeks berada di bagian bawah diagram dan output akhirnya berada di bagian atas.

Visualizer rencana kueri beranotasi
Gambar 9. Visualizer rencana kueri beranotasi.
  • Visualisasi rencana Anda bisa menjadi besar, tergantung pada kueri yang Anda jalankan. Untuk menyembunyikan dan menampilkan detail, aktifkan pemilih tampilan EXPANDED/COMPACT. Anda dapat menyesuaikan seberapa banyak rencana yang Anda lihat pada satu waktu menggunakan kontrol zoom.
  • Aljabar yang menjelaskan cara Spanner menjalankan kueri digambar sebagai grafik asiklik, dengan setiap node sesuai dengan iterator yang menggunakan baris dari inputnya dan menghasilkan baris ke induknya. Contoh paket ditampilkan pada 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 mewakili iterator dan berisi informasi berikut:

    • Nama iterator. Iterator menggunakan baris dari inputnya dan menghasilkan baris.
    • Statistik runtime yang memberi tahu Anda jumlah baris yang ditampilkan, latensinya, dan jumlah CPU yang dipakai.
    • Kami memberikan petunjuk visual berikut untuk membantu Anda mengidentifikasi potensi masalah dalam rencana eksekusi kueri.
    • Batang merah pada node adalah indikator visual persentase latensi atau waktu CPU untuk iterator ini dibandingkan dengan total 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 mengarahkan pointer ke konektor.
    • Segitiga peringatan ditampilkan pada node tempat pemindaian tabel lengkap 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 paket untuk melihat detailnya di panel informasi di sebelah kanan (5).

  • Peta mini rencana eksekusi menampilkan tampilan rencana lengkap yang diperbesar dan berguna untuk menentukan bentuk keseluruhan rencana eksekusi dan untuk menavigasi ke berbagai bagian rencana dengan cepat. Tarik langsung pada peta mini atau klik bagian yang ingin Anda fokuskan, untuk membuka bagian lain dari rencana visual.
  • Pilih DOWNLOAD JSON untuk mendownload versi JSON dari rencana eksekusi, yang akan berguna saat Anda menghubungi tim Spanner untuk mendapatkan dukungan.
  • Panel informasi menampilkan informasi kontekstual mendetail tentang node yang dipilih pada diagram rencana kueri. Informasi tersebut disusun ke dalam kategori-kategori berikut.
    • Informasi iterator memberikan detail, serta statistik runtime, untuk kartu iterator yang Anda pilih dalam grafik.
    • Query summary memberikan detail tentang jumlah baris yang ditampilkan dan waktu yang diperlukan untuk menjalankan kueri. Operator terkemuka adalah yang menunjukkan latensi yang signifikan, menggunakan CPU dalam jumlah yang signifikan dibandingkan operator lain, dan menampilkan baris data dalam jumlah yang signifikan.
    • Query execution timeline adalah grafik berbasis waktu yang menunjukkan durasi berapa lama setiap grup mesin menjalankan bagian kuerinya. Grup mesin mungkin belum tentu berjalan selama durasi kueri. Ada kemungkinan bahwa grup mesin berjalan beberapa kali selama menjalankan kueri, tetapi linimasa di sini hanya menunjukkan awal saat pertama kali dijalankan dan akhir dari terakhir kali dijalankan.
  • Menyesuaikan kueri yang menunjukkan performa buruk

    Bayangkan perusahaan Anda menjalankan {i>database<i} film {i>online<i} yang berisi informasi tentang film seperti pemeran film, perusahaan produksi, detail film, dan banyak lagi. Layanan berjalan di Spanner, tetapi mengalami beberapa masalah performa akhir-akhir ini.

    Sebagai developer prospek untuk layanan, Anda diminta untuk menyelidiki masalah performa ini karena memberikan rating yang buruk untuk layanan tersebut. Buka konsol Google Cloud, buka instance database Anda, lalu buka editor kueri. Masukkan kueri berikut ke editor dan jalankan.

    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 tersebut valid.

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

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

    Menganalisis kueri lambat dengan visualizer paket 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 diharapkan.

    Pilih 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 melakukan pengamatan berikut.

    • Berdasarkan Ringkasan kueri di panel informasi di sebelah kanan, kita mengetahui bahwa hampir 3 juta baris dipindai dan di bawah 64K akhirnya ditampilkan.

    • Kita juga dapat melihat dari panel Query execution linimasa bahwa ada 4 kelompok mesin yang 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 dijalankan pada grup tersebut pada rencana visual.

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

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

    Memperbaiki kueri

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

    Berikut kueri yang diupdate:

    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 mengilustrasikan kueri yang diperbarui. Seperti yang ditunjukkan di screenshot, kueri selesai dalam waktu kurang dari 5 detik, peningkatan yang signifikan pada runtime selama 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 ditampilkan dalam diagram berikut, untuk melihat apa yang ditunjukkan kepada kita tentang peningkatan ini.

    Visualisasi kueri di UI Cloud Console
    Gambar 4. Visualisasi rencana kueri setelah peningkatan kueri (Klik untuk memperbesar).

    Screenshot rencana visual yang diperbesar

    Anda akan segera melihat beberapa perbedaan:

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

    • Jumlah agregasi telah berkurang secara drastis.

    Kesimpulan

    Dalam skenario ini, kita menjalankan kueri yang 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 secara 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 hal yang dapat ditingkatkan dalam skenario ini adalah bahwa sebagian besar baris dari tabel title memenuhi syarat filter LIKE '% the %'. Mencari ke tabel lain dengan begitu banyak baris cenderung menjadi mahal. Mengubah implementasi join menjadi hash join meningkatkan performa secara signifikan.

    Langkah selanjutnya