Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menjelajahi SQL Server 2016 Query Store GUI

Pengantar

Penyimpanan kueri adalah fitur baru, yang diperkenalkan di SQL Server 2016, yang memungkinkan administrator database meninjau kueri secara historis dan paket terkaitnya menggunakan GUI yang tersedia di SQL Server Management Studio, serta menganalisis kinerja kueri menggunakan Tampilan Manajemen Dinamis tertentu. Penyimpanan Kueri adalah opsi konfigurasi cakupan basis data dan tersedia untuk digunakan jika tingkat kompatibilitas basis data yang dimaksud adalah 130.

Query Store mirip dengan teknologi di platform database Oracle sebagai Automatic Workload Repository (AWR). AWR menangkap statistik kinerja pada skala yang bahkan lebih besar daripada Query Store dan memungkinkan administrator database untuk menganalisis kinerja secara historis. Konsep seperti periode retensi dan batas penyimpanan data yang dikumpulkan tersedia dalam arsitektur AWR seperti halnya di Query Store. Opsi konfigurasi utama berikut tersedia saat mengaktifkan Query Store:

  • Mode Operasi: Menentukan apakah Penyimpanan Kueri akan menerima data yang baru diambil (Mode Baca Tulis) atau hanya menyimpan data lama yang tersedia untuk laporan (Mode Hanya Baca)
  • Interval Penyiraman Data: Menentukan seberapa sering buffer memori Penyimpanan Kueri di-flush ke disk. Ingat bahwa data penyimpanan kueri disimpan dalam database tempat penyimpanan kueri diaktifkan. Nilai default adalah 15 menit.
  • Interval Pengumpulan Statistik: Menentukan seberapa sering statistik runtime toko kueri dikumpulkan.
  • Ukuran Maksimum: Menentukan seberapa banyak repositori untuk statistik Query Store dapat berkembang. Secara default, ini adalah 100MB.
  • Mode Pengambilan Toko Kueri: Menentukan perincian tangkapan kueri. ALL, AUTO, dan NONE adalah opsi yang tersedia. Nilai defaultnya adalah AUTO.
  • Mode Pembersihan Berbasis Ukuran: Menentukan apakah Penyimpanan Kueri akan menghapus data lama saat ukuran maksimum tercapai.
  • Ambang Kueri Lama: Menentukan jumlah hari penyimpanan Kueri menyimpan data. Nilai default disetel ke tiga puluh hari.

Gbr. 2 Opsi Penyimpanan Kueri

Penyimpanan kueri adalah fitur cakupan basis data yang dapat diaktifkan dengan menggunakan GUI (SQL Server Management Studio) atau dengan menjalankan perintah berikut:

ALTER DATABASE [WideWorldImporters] SET QUERY_STORE =AKTIF;

Telemetri kueri yang dikumpulkan oleh Penyimpanan Kueri disimpan dalam tabel sistem dalam database tempat Penyimpanan Kueri diaktifkan.

Contoh Kueri &Laporan Default

Sejauh ini semua yang saya tulis tersedia dari banyak sumber lain; beberapa di antaranya dapat ditemukan di bagian referensi.

Di bagian ini, kita akan melihat lebih dalam tentang apa yang sebenarnya dapat kita lakukan dengan Query Store setelah kita mengaktifkannya menggunakan contoh sederhana. Mari kita pertimbangkan dua pertanyaan berikut:

Daftar 1:Mengambil Catatan menggunakan Filter Tertentu

gunakan WideWorldImportersgoselecta.ContactPersonID,a.OrderDate,a.DeliveryMethodID,a.Comments,b.OrderedOutersfromPurchase.PurchaseOrders dan bergabunglah dengan Purchasing.PurchaseOrderLines berdasarkan.PurchaseOrderID=b.PurchaseOrderre=';gopplierReferensi'; pra> 

Daftar 2:Mengambil Catatan menggunakan Rentang

gunakan WideWorldImportersgoselecta.ContactPersonID,a.OrderDate,a.DeliveryMethodID,a.Comments,b.OrderedOutersfromPurchase.PurchaseOrders kemudian bergabung dengan Purchasing.PurchaseOrderLines berdasarkan.PurchaseOrderID=b.PurchaseOrderReference; /pra> 

Perhatikan versi alternatif dari kueri ini yang ditulis dalam huruf besar:

Daftar 1:Mengambil Catatan menggunakan Filter Tertentu (Huruf Besar)

GUNAKAN WIDEWORLDIMPORTERSGOSELECTA.CONTACTPERSONID,A.ORDERDATE,A.DELIVERYMETHODID,A.COMMENTS,B.ORDEREDOUTERSFROMPURCHASING.PURCHASEORDERS AINNER BERGABUNG PURCHASING.PURCHASEORDERLINES BONDERWERIDER=ORREBIDER.PURCHASE 'GORLE. pra> 

Daftar 2:Mengambil Catatan menggunakan Rentang (Huruf Besar)

GUNAKAN WIDEWORLDIMPORTERSGOSELECTA.CONTACTPERSONID,A.ORDERDATE,A.DELIVERYMETHODID,A.COMMENTS,B.ORDEREDOUTERSFROMPURCHASING.PURCHASEORDERS AINNER GABUNG PURCHASING.PURCHASEORDERLINES. /pra> 

Seperti yang Anda lihat, kami menjalankan kueri ini beberapa kali menggunakan kata kunci GO. Jadi, kami memiliki sejumlah data yang masuk akal untuk dikerjakan. Hal pertama yang harus kita perhatikan saat menggunakan Query Store untuk menganalisis kinerja adalah bahwa ada enam laporan default yang dibangun ke dalam SQL Server 2016 Query Store seperti yang ditunjukkan pada Gambar 3.

Gbr. 3 Laporan Penyimpanan Kueri

Nama-nama laporan dijelaskan secara rinci dalam artikel sebelumnya serta dalam dokumentasi Microsoft. Data yang disediakan oleh laporan ini diambil dari Tampilan Manajemen Dinamis utama yang tercantum di bawah ini:

Rencanakan Statistik DMV

  • sys.query_store_query_text – berisi teks kueri unik yang dieksekusi terhadap database
  • sys.query_store_plan – berisi perkiraan rencana kueri dengan statistik waktu kompilasi
  • sys.query_context_settings – berisi beberapa kombinasi unik dari rencana yang memengaruhi pengaturan di mana kueri dieksekusi
  • sys.query_store_query – entri kueri yang dilacak dan dipaksakan secara terpisah di Toko Kueri

DMV Statistik Waktu Jalankan

  • sys.query_store_runtime_stats_interval – Query Store membagi waktu menjadi jendela waktu (interval) yang dibuat secara otomatis dan menyimpan statistik agregat pada interval tersebut untuk setiap rencana yang dijalankan
  • sys.query_store_runtime_stats – berisi statistik runtime agregat untuk rencana yang dieksekusi

Lebih banyak detail tentang cara menggunakan DMV ini tersedia di Dokumentasi Microsoft yang dirujuk. Dalam artikel ini, kita hanya akan menggunakan GUI sebagian besar.

Seperti yang dapat Anda lihat dari Gambar 4, kami meninjau laporan Konsumsi Sumber Daya Keseluruhan sementara di bagian berikutnya, kami akan mempersempit kueri yang kami daftarkan sebelumnya dan data yang dapat kami ambil dari kueri sederhana ini.

Gbr. 4 Laporan Konsumsi Sumber Daya Secara Keseluruhan

Menganalisis Query Menggunakan GUI

Beberapa hal penting yang harus dianggap berguna saat menggunakan Laporan Penyimpanan Kueri:

  • Anda dapat mengonfigurasi lingkungan dengan mengklik tombol yang disorot pada Gambar 4. Gambar 5 menunjukkan detail yang dapat kami ubah agar sesuai dengan kasus penggunaan kami:kriteria data yang akan dikembalikan, rentang tanggal, dan kumpulan data yang akan dikembalikan. Misalnya, jika saya ingin melihat dengan jelas ID Kueri yang terkait dengan kueri yang saya tinjau, saya ingin mengurangi kumpulan data saya dari 25 Teratas default menjadi 10 Teratas, misalnya.

    Gbr. 5 Opsi Konfigurasi Laporan

    Gbr. 6 25 Query Teratas yang Dieksekusi pada 1 Mei 2018

    Gbr. 7 Top 10 Query yang Dieksekusi pada 1 Mei 2018

  • Diagram batang sebagian besar menampilkan data dengan waktu pada sumbu x tetapi Anda dapat menelusuri titik data tertentu untuk melihat data berdasarkan ID Kueri. Setiap ID Kueri menentukan kueri tertentu. Penting untuk dicatat bahwa kueri diidentifikasi secara unik dengan meng-hashing teks. Jadi, kueri dalam huruf kecil berbeda dari kueri yang sama dalam huruf besar. Ini harus menjadi pengetahuan umum:kueri ad-hoc menjadi perhatian untuk cache paket dan juga buruk untuk penyimpanan kueri baik dari segi penggunaan ruang dan analisis yang tepat.

    Gbr. 8 Query pada Listing 1 (Huruf Kecil, Query 42480)

    Gbr. 9 Query pada Listing 3 (Kapital Besar, Query 42490)

  • Pengamatan penting ketiga adalah fakta bahwa ketika titik data disorot hijau, rencana eksekusi terperinci yang ditampilkan di panel bawah berkaitan dengan titik data tersebut. Pada Gambar 7, titik data ini mengacu pada ID Kueri 42481 yang sebelumnya telah kita jalankan (kueri lengkap ditunjukkan pada Daftar 2). Mengarahkan mouse ke titik data ini akan menampilkan kueri, ID-nya, dan jumlah paket yang terkait dengan kueri ini (lihat Gambar 8).

    Gambar 10 Rincian Kueri 42481

    Kueri kami dieksekusi 1391 kali karena ditangkap secara akurat oleh Query Store dan ditampilkan dalam sumbu y (jumlah eksekusi) dari diagram batang pada Gambar 10. Laporan ditarik saat kumpulan masih dijalankan. Jadi, kami tidak memiliki jumlah penuh (1500) yang memberi tahu kami bahwa ada pengambilan data waktu nyata setiap kali kueri dijalankan. Di sisi kanan, kita juga melihat Plan digunakan untuk beberapa eksekusi ini (Plan 675). Kami dapat memverifikasi ini menggunakan kueri di Listing 5.

Cantuman 5

GUNAKAN WideWorldImportersGOSELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*FROM sys.query_store_plan AS PlJOIN sys.query_store_query AS Qry ON Pl.query_id =Qry.query_text_store_query_idJOIN sys.query_store_query .query_text_idwhere Qry.query_id=42481;

Gbr. 11 ID Kueri dan ID Paket dari DMV

Sedikit Penyesuaian

Mari kita lihat kueri lainnya.

Saat kami menjalankan kueri di Listing 6 dan memeriksa detail dari Query Store, detail rencana eksekusi mengungkapkan bahwa kami memerlukan indeks untuk mendapatkan peningkatan 51%.

Daftar 6:Kueri Suboptimal

PILIH TOP (1000) [OrderLineID] ,[OrderID] ,[StockItemID] ,[Description] ,[PackageTypeID] ,[Quantity] ,[UnitPrice] ,[TaxRate] ,[PickedQuantity] ,[PickingCompletedWhen] ,[LastEditedBy ] ,[LastEditedWhen] DARI [WideWorldImporters].[Sales].[OrderLines] di mana unitPrice> 1000 GO 2000

Gbr. 12 Detail Query Sub-optimal

Gambar 13 Rencana Eksekusi Kueri yang Kurang Optimal

Setelah kami membuat indeks yang direkomendasikan menggunakan pernyataan di Listing 7, kami menyebabkan Pengoptimal Kueri membuat rencana eksekusi baru. Dalam hal ini, rencana eksekusi baru diharapkan dapat meningkatkan kinerja. Namun, ada kasus di mana perubahan tertentu dapat menyebabkan penurunan kinerja seperti perubahan signifikan dalam volume data yang secara efektif membatalkan statistik atau menurunkan jumlah indeks dan sebagainya. Kueri semacam itu dikatakan telah mengalami kemunduran dalam kinerja dan dapat diperiksa menggunakan laporan Kueri yang Diregresi di Penyimpanan Kueri.

Cantuman 7:Pembuatan Indeks

GUNAKAN [WideWorldImporters]GOCREATE NONCLUSTERED INDEX [Custom_IX_UnitPrice]ON [Sales].[OrderLines] ([UnitPrice])INCLUDE([OrderLineID],[OrderID],[StockItemID],[Deskripsi],[PackageTypeID],[Quantity ],[TaxRate],[PickedQuantity],[PickingCompletedWhen],[LastEditedBy],[LastEditedWhen])GO

Gbr. 14 Kueri yang Dioptimalkan (Perubahan Rencana Eksekusi)

Gbr. 15 Kueri yang Dioptimalkan (Dua Paket)

Gbr. 16 Kueri yang Dioptimalkan (Paket Paksa)

Ketika ada beberapa rencana untuk kueri seperti yang ditunjukkan pada Gambar 14 dan Gambar 16, kami dapat memberi tahu pengoptimal untuk selalu menggunakan rencana yang kami pilih dengan mengklik tombol Paksa Rencana. Ini adalah tugas yang sedikit membosankan di versi SQL Server sebelumnya.

Seperti yang Anda lihat dari Gbr. 17, Query Store memungkinkan kami untuk membandingkan berbagai paket yang terkait dengan kueri menggunakan sejumlah metrik.

Gbr. 17 Membandingkan Rencana Eksekusi

Sekali lagi, kita dapat menggunakan kueri di Listing 8 untuk memverifikasi paket yang terkait dengan ID kueri ini menggunakan DMV. (Lihat Gambar 11)

Daftar 8:Paket Terkait dengan Kueri 42497

GUNAKAN WideWorldImportersGOSELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*FROM sys.query_store_plan AS PlJOIN sys.query_store_query AS Qry ON Pl.query_id =Qry.query_text_store_query_idJOIN sys.query_store_query .query_text_idwhere Qry.query_id=42497;

Menjelajahi Variasi

Laporan berguna lainnya yang disediakan oleh Toko Kueri adalah Kueri Dengan Variasi Tinggi. Laporan ini menunjukkan kepada kita seberapa jauh jarak metrik yang diinginkan untuk kueri tertentu selama periode tertentu. Ini sangat berguna untuk analisis historis kinerja. Dengan menggunakan pernyataan di Listing 9, kami menghasilkan data yang dapat memberikan gambaran seperti apa variasi itu. Langkah-langkah dalam prosedur cukup membuat tabel kecil dan kemudian menyisipkan catatan menggunakan ukuran batch yang berbeda.

Daftar 9:Paket Terkait dengan Kueri 42497

gunakan WideWorldImportersgo-- Buat tabel Tablecreate tableone(ID int identity(1000,1),FirstName varchar(30),LastName varchar(30),CountryCode char(2),HireDate datetime2 default getdate());-- Sisipkan record dalam Batches of Different Sizesinsert into tableone values ​​('Kenneth','Igiri','NG',getdate());GO 10000insert into tableone values ​​('Kwame','Boateng','GH', getdate());GO 10masukkan nilai tableone ('Philip','Onu','NG',getdate());GO 100000masukkan nilai tableone ('Kwesi','Armah','GH', getdate());GO 100 

Penyimpanan Kueri menunjukkan kepada kami detail seperti nilai minimum dan maksimum metrik ini untuk interval eksekusi tertentu dari kueri yang kami minati. Dalam contoh ini, kami menemukan bahwa ini hanyalah hasil dari jumlah batch per eksekusi (perhatikan bahwa parameter sebenarnya digunakan untuk mengeksekusi pernyataan INSERT). Dalam produksi, faktor lain dapat menjadi penyebab variasi tersebut.

Gbr. 18 Variasi Durasi

Gambar 19 Variasi Penulisan Logika

Gbr. 20 Variasi Pembacaan Fisik

Kesimpulan

Pada artikel ini, kami telah meninjau lingkungan GUI SQL Server 2016 Query Store dan beberapa hal yang dapat kami simpulkan mengenai kinerja instance kami (sehubungan dengan SQL) menggunakan Query Store. Ada beberapa artikel di Internet yang menunjukkan kasus penggunaan yang lebih canggih dan penjelasan internal yang jauh lebih dalam. Artikel ini harus bermanfaat bagi DBA tingkat menengah yang ingin lebih dulu menggunakan Query Store untuk evaluasi/penyesuaian kinerja.

Referensi

  • Praktik Terbaik dengan Toko Kueri
  • Cristiman, L. (2016) Penyimpanan Kueri – Pengaturan dan Batas
  • Memantau Kinerja dengan Menggunakan Toko Kueri
  • Tampilan Katalog Toko Kueri
  • Prosedur Penyimpanan Toko Kueri
  • Query Store – Cara Kerja dan Cara Menggunakannya
  • Skenario Penggunaan Toko Kueri
  • Van de Lar, E. (2016) Penyimpanan Kueri SQL Server 2016:Memaksa Rencana Eksekusi Menggunakan Penyimpanan Kueri

Alat yang berguna:

dbForge Query Builder untuk SQL Server – memungkinkan pengguna membuat kueri SQL yang kompleks dengan cepat dan mudah melalui antarmuka visual yang intuitif tanpa penulisan kode manual.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Excel VBA untuk menjalankan kueri SQL

  2. Bagaimana cara menambahkan atribut khusus ke string koneksi SQL?

  3. Bagaimana cara membuat daftar contoh SQL Server yang tersedia menggunakan SMO di C #?

  4. Dapatkan Nilai Batas untuk Tabel yang Dipartisi di SQL Server (T-SQL)

  5. Gunakan SET TEXTSIZE untuk Membatasi Data yang Dikembalikan untuk Setiap Baris di SQL Server