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-bagian antarmuka pengguna konsol Google Cloud yang disebutkan dalam panduan ini, baca hal berikut:

Menjalankan kueri di konsol Google Cloud

  1. Buka halaman Instance Spanner di konsol Google Cloud.

    Buka halaman Instances

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

    Konsol Google Cloud akan menampilkan halaman Ringkasan instance.

  3. Pilih nama database yang ingin Anda buat kueri.

    Konsol Google Cloud menampilkan halaman Ringkasan 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 Explanation 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 terhadap database, dan melihat hasilnya serta rencana eksekusi kueri. Komponen utama halaman Spanner Studio diberi nomor dalam screenshot berikut.

Halaman kueri yang dianotasi.
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, menghasilkan hasil kueri di tab Results dan rencana eksekusi kueri di tab Explanation. Ubah perilaku default menggunakan drop-down untuk menghasilkan Hasil saja atau Penjelasan saja.

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

    • Perintah Hapus kueri akan menghapus semua teks di editor dan menghapus subtab Hasil dan Penjelasan.
    • Perintah Format kueri memformat pernyataan di 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, panel perintah editor akan 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 ini diberi kode warna dan nomor baris otomatis ditambahkan untuk pernyataan multibaris.

    Jika memasukkan lebih dari satu pernyataan di editor, Anda harus menggunakan titik koma penutup 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 menulis pernyataan di editor.
    • Subtab Results menampilkan hasil saat Anda menjalankan pernyataan di editor. Untuk kueri, tabel hasil akan ditampilkan, dan untuk pernyataan DML seperti INSERT dan >UPDATE, pesan tentang jumlah baris yang terpengaruh akan ditampilkan.
    • Subtab Penjelasan menampilkan grafik visual 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 contoh rencana kueri dan membandingkan performa kueri dari waktu ke waktu. Untuk kueri yang menggunakan CPU lebih tinggi, Spanner mempertahankan rencana kueri sampel selama 30 hari di halaman Insight kueri di konsol Google Cloud. Untuk melihat contoh paket kueri:

  1. Buka halaman Instance Spanner di konsol Google Cloud.

    Buka halaman Instances

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

    Konsol Google Cloud akan menampilkan halaman Ringkasan instance.

  3. Di menu Navigasi dan pada judul Observabilitas, klik Analisis kueri.

    Konsol Google Cloud menampilkan halaman Analisis kueri Instance.

  4. Di menu Database drop-down, 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 dan tag permintaan teratas yang diurutkan berdasarkan penggunaan CPU.

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

    Halaman Detail kueri menampilkan grafik Contoh paket kueri untuk kueri Anda dari waktu ke waktu. Anda dapat memperkecil 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 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 paket kueri.

Mengikuti tur visualizer rencana kueri

Komponen utama visualiser dianotasikan dalam screenshot berikut dan dijelaskan secara lebih mendetail. Setelah menjalankan kueri di tab kueri, pilih tab EXPLANATION di bawah editor kueri untuk membuka visualiser 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.

Visualisator rencana kueri yang dianotasi
Gambar 9. Visualisator rencana kueri yang dianotasi.
  • Visualisasi rencana Anda dapat berukuran besar, bergantung pada kueri yang dijalankan. Untuk menyembunyikan dan menampilkan detail, alihkan selektor tampilan DILUASKAN/RAPAT. Anda dapat menyesuaikan jumlah rencana yang Anda lihat pada satu waktu menggunakan kontrol zoom.
  • Aljabar yang menjelaskan cara Spanner menjalankan kueri digambar sebagai grafik acyclic, dengan setiap node sesuai dengan iterator yang menggunakan baris dari inputnya dan menghasilkan baris ke induknya. Contoh rencana 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, latensi, dan jumlah CPU yang digunakan.
    • Kami menyediakan isyarat 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 mewakili jumlah baris. Makin tebal garis, makin besar jumlah baris yang diteruskan ke node berikutnya. Jumlah baris yang sebenarnya ditampilkan di setiap kartu dan saat Anda mengarahkan kursor ke 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).

  • 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 pada peta mini atau klik tempat yang ingin Anda fokuskan, untuk membuka bagian lain dari rencana visual.
  • Pilih DOWNLOAD JSON untuk mendownload rencana eksekusi versi JSON, yang berguna saat Anda menghubungi tim Spanner untuk mendapatkan dukungan.
  • Panel informasi menampilkan informasi kontekstual mendetail tentang node yang dipilih dalam diagram rencana kueri. Informasi tersebut diatur 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 signifikan adalah operator yang menunjukkan latensi yang signifikan, menggunakan CPU yang signifikan dibandingkan dengan operator lain, dan menampilkan jumlah baris data yang signifikan.
    • Linimasa eksekusi kueri adalah grafik berbasis waktu yang menunjukkan berapa lama setiap grup mesin menjalankan bagian kuerinya. Grup mesin mungkin tidak selalu berjalan selama seluruh durasi waktu berjalan kueri. Grup mesin juga dapat dijalankan beberapa kali selama menjalankan kueri, tetapi linimasa di sini hanya menunjukkan awal pertama kali dijalankan dan akhir terakhir kali dijalankan.
  • Menyesuaikan kueri yang berperforma buruk

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

    Sebagai developer utama untuk layanan tersebut, Anda diminta untuk menyelidiki masalah performa ini karena menyebabkan rating buruk untuk layanan. 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 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 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 di langkah sebelumnya memerlukan waktu lebih dari dua menit, tetapi kita tidak tahu apakah kueri tersebut seefisien mungkin dan, karenanya, apakah durasi ini sudah diperkirakan.

    Anda memilih tab EXPLANATION 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 telah dipindai dan kurang dari 64 ribu baris 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 dieksekusi di satu atau beberapa mesin. Memilih grup mesin di linimasa akan menandai pada rencana visual bagian kueri yang dieksekusi di grup tersebut.

    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 join dari join penerapan, yang dipilih Spanner secara default, menjadi join hash.

    Meningkatkan kueri

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

    Berikut adalah 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 mengilustrasikan kueri yang diperbarui. Seperti yang ditunjukkan dalam screenshot, kueri selesai dalam waktu kurang dari 5 detik, peningkatan yang signifikan dari runtime 120 detik sebelum perubahan ini.

    Editor kueri 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 disampaikannya tentang peningkatan ini.

    Visualisasi kueri di UI konsol Cloud
    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 dikurangi secara drastis.

    Kesimpulan

    Dalam skenario ini, kita menjalankan kueri lambat dan melihat rencana visualnya untuk mencari inefisiensi. Berikut adalah ringkasan kueri dan rencana sebelum dan setelah 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 title tabel memenuhi syarat filter LIKE '% the %'. Mencari ke tabel lain dengan begitu banyak baris kemungkinan akan mahal. Mengubah implementasi join menjadi join hash meningkatkan performa secara signifikan.

    Langkah selanjutnya