Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Pembuatan Profil Kueri yang Ramah Bandwidth untuk Database Azure SQL

SQL Server selalu menyediakan kemampuan untuk menangkap kueri langsung secara ad hoc dalam format rowset yang mudah dikonsumsi – pertama dengan SQL Server Profiler lawas, kemudian melalui Extended Events di SSMS. Kemampuan ini berharga saat penyetelan kinerja karena peristiwa kueri menyertakan metrik CPU dan IO diskrit serta parameter runtime, yang merupakan kunci untuk memecahkan masalah kinerja kueri seperti sniffing parameter. Selanjutnya, peristiwa kueri berisi elemen penting lainnya seperti nama host klien, nama aplikasi, login, ID proses Windows, dll.

Anda selalu dapat mengambil agregat metrik kinerja untuk dinormalisasi kueri dari DMV atau Penyimpanan Kueri, tetapi hanya berisi dikompilasi parameter dan tidak ada elemen yang disebutkan di atas. Meskipun ini membantu, itu tidak sama. Misalnya, jika Anda perlu melihat kombinasi parameter spesifik yang digunakan oleh kueri yang melakukan 2 miliar pembacaan atau menemukan aplikasi yang paling banyak menggunakan CPU selama 24 jam terakhir, Anda kurang beruntung.

Azure SQL Database tidak didukung oleh Profiler lama, dan Microsoft menonaktifkan penyedia streaming XEvents (sys.fn_MSxe_read_event_stream TVF) karena alasan keandalan, sehingga Anda tidak dapat menjalankan sesi XE dan "menonton data langsung" dengan SSMS. Wawasan Kinerja Kueri di Portal Azure didukung oleh Penyimpanan Kueri, sehingga Anda hanya memiliki kueri yang dinormalisasi dan data kinerja teragregasi, bukan peristiwa kueri yang sebenarnya.

Jadi, selama beberapa tahun kami terjebak – satu-satunya pilihan untuk membuat profil Azure SQL Database adalah secara manual membuat jejak XEvents yang menulis ke buffer cincin atau target file dengan Azure Storage, yang keduanya tidak optimal. Menggunakan buffer ring dengan kueri T-SQL dapat menjadi masalah karena batas XML berformat 4MB seperti yang dicakup oleh Jonathan Kehayias di sini, dan target file memerlukan sejumlah lompatan dan biaya tambahan yang wajar. Keduanya memerlukan kueri manual dari data XE sehingga tidak sepenuhnya "langsung" dalam pengertian tradisional.

Masukkan Baru SQL Server Profiler

Ketika saya mengetahui ekstensi SQL Server Profiler untuk Azure Data Studio, saya senang melihat Microsoft akhirnya memberikan solusi grafis untuk pengambilan kueri langsung di Azure SQL Database. Sayangnya, kegembiraan saya tidak bertahan lama karena beberapa alasan.

Pertama, jejak “Standar” yang ditakuti dari Profiler lawas tampaknya telah digunakan sebagai model untuk sesi ADS Profiler XE untuk Azure SQL Database , bernama ADS_Standard_Azure secara default. (Sesi XE yang digunakan untuk SQL Server lengkap serupa.) Seperti yang saya blog beberapa tahun lalu dan masih percaya, jejak Standar adalah alasan utama Profiler warisan sangat kurang dihargai. Ini berisi beberapa peristiwa yang tidak berguna dan tidak dapat difilter seperti SQL batch dimulai , masuk dan keluar , dan akibatnya tidak ada nilai nyata untuk penyetelan performa. Lebih lanjut, dengan arsitektur pelacakan baris baris sinkron yang digunakan oleh Profiler lawas, volume peristiwa yang tinggi dapat memengaruhi kinerja pada sistem yang sibuk. Untuk beberapa alasan hal ini tidak akan hilang!

Aktivitas pelacakan “Standar” Profiler Lama

Acara ADS Profiler “ADS_Standard_Azure” XE
– terlihat familier?

Kedua, ia menggunakan buffer cincin dengan ukuran maksimal 8MB atau 1000 peristiwa, mana saja yang lebih dulu. Karena peristiwa masuk/keluar kecil, Anda akan sering mencapai 1000 peristiwa jauh sebelum Anda mencapai batas 8MB, atau bahkan batas XML berformat 4MB. Namun, dengan campuran moderat dari peristiwa SQL, ring buffer XML akan tetap berukuran 2 hingga 3MB pada 1000 peristiwa dalam pengujian saya, dan masalahnya adalah seluruh buffer ini ditarik ke seluruh jaringan setiap kali ekstensi Profiler melakukan polling untuk menyegarkan kisinya , yang lebih lama dari setiap 1 detik atau durasi jajak pendapat sebelumnya. XML kemudian diuraikan sisi klien oleh ekstensi ADS Profiler untuk menentukan peristiwa mana yang baru sejak polling terakhir, dan peristiwa baru ditambahkan ke kisi.

Buffer cincin terisi hampir seketika bahkan pada server yang cukup sibuk, dan efek bersihnya adalah Anda akan dengan cepat menarik>40 megabit per detik di seluruh jaringan dari Azure SQL Database Anda . Ini berarti 300 megabyte per menit, atau 18 gigabyte per jam!

Klik jaringan dari ekstensi ADS Profiler (rentang 4 menit)

Ketakutan awal saya adalah bahwa ini dapat menyebabkan biaya keluar yang besar pada tagihan Azure berikutnya, namun, melihat langganan Azure kami sendiri, kami tidak dapat mengonfirmasi bahwa lalu lintas jaringan untuk Azure SQL DB dibebankan. Mike Wood (b|t) dari SentryOne, seorang Azure MVP, menghabiskan waktu berminggu-minggu untuk mencari jawabannya dan akhirnya mendapat kabar dari Microsoft bahwa memang network egress saat ini tidak dikenakan biaya untuk Azure SQL DB, meskipun hal ini dapat berubah sewaktu-waktu. Meski begitu, menurunkan 18 GB data kueri per jam tampaknya tidak bertanggung jawab, dan tentu saja dapat meredam sesi menonton pesta Netflix Anda berikutnya.

Meskipun Anda dapat menyetel filter melalui UI Profiler yang akan membuat data lebih mudah ditinjau, ini tidak akan mengurangi hit jaringan karena mereka beroperasi di sisi klien.

Sesi XE yang Diperbarui

Solusi cepat untuk mengurangi beban jaringan ADS Profiler dan membuat data lebih dapat digunakan untuk penyetelan kinerja kueri adalah dengan memperbarui ADS_Standard_Azure sesi XE. Di bawah ini adalah skrip yang akan:

  • Hapus acara yang tidak berguna:

    • sqlserver.attention
    • sqlserver.existing_connection
    • sqlserver.login
    • sqlserver.logout
    • sqlserver.sql_batch_starting
  • Tetapkan ambang batas durasi> 1 detik (1000000 mikrodetik) pada acara yang tersisa:

    • sqlserver.rpc_completed
    • sqlserver.sql_batch_completed
  • Kurangi ukuran maksimal penyangga cincin dari 1000 menjadi 10 peristiwa

    • Ini tidak akan pernah berfungsi dengan jejak asli karena 10 peristiwa akan dihasilkan dalam milidetik dan buffer cincin akan mendaur ulang terlalu cepat yang menyebabkan sebagian besar peristiwa hilang. Namun, dengan filter durasi 1 detik, aliran peristiwa akan jauh lebih rendah, dan 10 peristiwa akan bekerja dengan baik dengan interval polling 1 detik yang digunakan oleh ADS Profiler.
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
DROP EVENT sqlserver.attention,
DROP EVENT sqlserver.existing_connection,
DROP EVENT sqlserver.login,
DROP EVENT sqlserver.logout,
DROP EVENT sqlserver.rpc_completed,
DROP EVENT sqlserver.sql_batch_completed,
DROP EVENT sqlserver.sql_batch_starting
GO
 
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
ADD EVENT sqlserver.rpc_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id,sqlserver.username)
      WHERE (([package0].[equal_boolean]([sqlserver].[is_system],(0))) AND ([duration] >= (1000000)))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.query_hash,sqlserver.session_id,sqlserver.username)
      WHERE (([package0].[equal_boolean]([sqlserver].[is_system],(0))) AND ([duration] >= (1000000))))
GO
 
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
DROP TARGET package0.ring_buffer
GO
 
ALTER EVENT SESSION [ADS_Standard_Azure] ON DATABASE 
ADD TARGET package0.ring_buffer(SET max_events_limit=(10),max_memory=(51200))
GO

Setelah menerapkan skrip untuk memperbarui sesi XE, firehose akan segera dikurangi menjadi tetesan:

Berkurangnya hit jaringan setelah memperbarui sesi ADS Profiler XE

Alternatif Berat Lebih Ringan

SQL Sentry dan mitra SaaS-nya SentryOne Monitor adalah satu-satunya solusi lain yang saya ketahui untuk menangkap kueri dari Azure SQL Database, dan mereka melakukannya menggunakan pendekatan inovatif yang jauh lebih ringan daripada sesi XE yang dioptimalkan di atas untuk ADS Profiler. Di antara fitur lanjutan lainnya, Anda dapat dengan mudah mengagregasi berdasarkan nama host klien, aplikasi, dan login, dan secara otomatis menangkap rencana kueri untuk analisis dengan Plan Explorer yang terintegrasi.

Monitor SentryOne menampilkan kueri dan rencana yang diambil dari Database Azure SQL

Menutup

Microsoft telah menyatakan bahwa mereka akan terus meningkatkan ekstensi ADS Profiler, dan ketika mereka melakukannya, saya berharap mereka akan mengatasi masalah yang diuraikan di atas. Saya telah mencatat masalah ini di sini. Sementara itu, skrip yang diperbarui akan memberikan pengalaman pembuatan profil kueri yang lebih aman dan ramah bandwidth untuk Azure SQL Database.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Baca Tingkat Isolasi Tanpa Komitmen

  2. Salesforce SOQL dari Microsoft Office

  3. Plan Explorer 3.0 Webinar – Contoh dan Tanya Jawab

  4. Membuat Cluster Docker Swarm di Azure Container Service

  5. Tren Perangkat Keras Server Basis Data