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

Bandingkan Paket Eksekusi di SQL Server

Database Administrator selalu berusaha untuk menyesuaikan kinerja query SQL Server. Langkah pertama dalam menyetel kinerja kueri adalah menganalisis rencana eksekusi kueri. Pada beberapa kondisi, SQL Server Query Optimizer dapat membuat rencana eksekusi yang berbeda. Pada titik ini, saya ingin menambahkan beberapa catatan tentang SQL Server Query Optimizer. SQL Server Query Optimizer adalah pengoptimal berbasis biaya yang menganalisis rencana eksekusi dan memutuskan rencana eksekusi optimal untuk kueri. Kata kunci penting untuk SQL Server Query Optimizer adalah rencana eksekusi optimal yang belum tentu merupakan rencana eksekusi terbaik. Itu sebabnya, jika SQL Server Query Optimizer mencoba mencari tahu rencana eksekusi terbaik untuk setiap kueri, dibutuhkan waktu ekstra dan menyebabkan kerusakan pada kinerja SQL Server Engine. Di SQL Server 2016, Microsoft menambahkan kemampuan baru ke SQL Server Management Studio, yang disebut Bandingkan Showplan. Fitur ini memungkinkan kita untuk membandingkan dua rencana eksekusi yang berbeda. Pada saat yang sama, kita dapat menggunakan opsi ini secara offline yang berarti kita tidak perlu menghubungkan instance SQL Server. Bayangkan Anda menulis kueri dan kueri ini berkinerja baik di lingkungan TEST tetapi di PROD (lingkungan produksi), kinerjanya sangat buruk. Untuk menangani masalah ini, kita perlu membandingkan rencana eksekusi. Sebelum fitur ini, kami biasa membuka dua SQL Server Management Studios dan membawa rencana eksekusi berdampingan tetapi metode ini sangat merepotkan.

Bagaimana cara membandingkan dua rencana eksekusi?

Dalam demonstrasi ini, kita akan menggunakan database AdventureWorks dan membandingkan dua rencana eksekusi yang memiliki Versi Model Estimasi Kardinalitas yang berbeda dan mendeteksi perbedaan ini dengan Bandingkan Showplan.

Pertama, kita akan membuka jendela kueri baru di SQL Server Management Studio dan klik Sertakan Rencana Eksekusi Aktual lalu jalankan kueri berikut.

SELECT 
        soh.[SalesPersonID]
        ,p.[FirstName] + ' ' + COALESCE(p.[MiddleName], '') + ' ' + p.[LastName] AS [FullName]
        ,e.[JobTitle]
        ,st.[Name] AS [SalesTerritory]
        ,soh.[SubTotal]
        ,YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear] 
    FROM [Sales].[SalesPerson] sp 
        INNER JOIN [Sales].[SalesOrderHeader] soh 
        ON sp.[BusinessEntityID] = soh.[SalesPersonID]
        INNER JOIN [Sales].[SalesTerritory] st 
        ON sp.[TerritoryID] = st.[TerritoryID] 
        INNER JOIN [HumanResources].[Employee] e 
        ON soh.[SalesPersonID] = e.[BusinessEntityID] 
		INNER JOIN [Person].[Person] p
		ON p.[BusinessEntityID] = sp.[BusinessEntityID]

Pada langkah ini, kita akan menyimpan rencana eksekusi pertama kita. Klik kanan di mana saja dalam rencana eksekusi dan klik Simpan Rencana Eksekusi Sebagai dan simpan rencana eksekusi sebagai ExecutionPlan_CE140.sqlplan.

Sekarang kita akan membuka tab kueri baru di SQL Server Management Studio dan menjalankan kueri di bawah ini. Dalam kueri ini, kami akan menambahkan petunjuk kueri FORCE_LEGACY_CARDINALITY_ESTIMATION di akhir kueri yang memaksa untuk menggunakan Versi Model Estimasi Kardinalitas yang lebih lama.
Tugas Estimasi Kardinalitas adalah untuk memprediksi berapa banyak baris yang akan dikembalikan oleh kueri kita.

SELECT 
        soh.[SalesPersonID]
        ,p.[FirstName] + ' ' + COALESCE(p.[MiddleName], '') + ' ' + p.[LastName] AS [FullName]
        ,e.[JobTitle]
        ,st.[Name] AS [SalesTerritory]
        ,soh.[SubTotal]
        ,YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear] 
    FROM [Sales].[SalesPerson] sp 
        INNER JOIN [Sales].[SalesOrderHeader] soh 
        ON sp.[BusinessEntityID] = soh.[SalesPersonID]
        INNER JOIN [Sales].[SalesTerritory] st 
        ON sp.[TerritoryID] = st.[TerritoryID] 
        INNER JOIN [HumanResources].[Employee] e 
        ON soh.[SalesPersonID] = e.[BusinessEntityID] 
INNER JOIN [Person].[Person] p
	ON p.[BusinessEntityID] = sp.[BusinessEntityID]
	OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'));

Kami akan mengklik Bandingkan Showplan dan pilih rencana eksekusi sebelumnya yang disimpan sebagai ExecutionPlan_CE140.sqlplan.

Gambar berikut mengilustrasikan layar pertama dari rencana perbandingan eksekusi SQL Server dan area yang disorot warna merah muda mendefinisikan operasi serupa.

Jika kita mengklik operator mana pun di layar rencana eksekusi di bawah atau di atas, SQL Server Management Studio menyoroti operator serupa lainnya. Di sisi kanan panel, Anda dapat menemukan properti dan detail perbandingan properti.

Pada langkah ini, kami akan mengubah opsi Analisis ShowPlan dan akan menyorot operator yang tidak cocok. Di bagian bawah layar, kita dapat melihat Analisis Showplan panel. Jika kami menghapus Sorot operasi serupa dan pilih Sorot operator yang tidak cocok dengan segmen serupa, SQL Server Management Studio menyoroti operator yang tak tertandingi. Setelah itu, klik Pilih operator di bawah dan di atas rencana eksekusi di panel. SQL Server Management Studio membandingkan properti dari operator yang dipilih dan menempatkan tanda pertidaksamaan ke nilai yang tidak identik.

Jika kita menganalisis layar ini lebih detail, yang pertama adalah Versi Model Estimasi Kardinalitas perbedaan. Versi kueri pertama adalah 70 dan versi kedua 140. Perbedaan ini memengaruhi Perkiraan Jumlah Baris . Alasan utama yang menyebabkan perbedaan Perkiraan Jumlah Baris adalah versi yang berbeda dari Estimasi Kardinalitas. Dengan demikian, versi Estimasi Kardinalitas secara langsung memengaruhi metrik estimasi kueri. Untuk perbandingan kueri ini, kita dapat menyimpulkan bahwa kueri yang versi Estimasi Kardinalitasnya 140 berkinerja lebih baik karena perkiraan jumlah baris mendekati Jumlah Baris Sebenarnya . Kasus ini dapat diklarifikasi dari tabel di bawah ini.

[id tabel=50 /]

Jika kita ingin melihat rencana eksekusi berdampingan pada layar yang sama, kita dapat mengklik Toggle Splitter Orientation .

Sekarang kita akan membuat demonstrasi lain. Kita akan melihat kueri di bawah ini dan membandingkan rencana eksekusi sebelum dan sesudah pembuatan indeks.
Saat kita melihat rencana eksekusi kueri di bawah, disarankan untuk membuat indeks non-cluster.

SELECT [CarrierTrackingNumber] 
FROM [Sales].[SalesOrderDetail] WHERE [SalesOrderDetailID]=12

Kami akan menerapkan indeks yang direkomendasikan dan menjalankan kembali kueri yang sama.

CREATE NONCLUSTERED INDEX Index_NC
ON [Sales].[SalesOrderDetail] ([SalesOrderDetailID])
GO
SELECT [CarrierTrackingNumber] 
FROM [Sales].[SalesOrderDetail] WHERE [SalesOrderDetailID]=12

Pada langkah terakhir ini, kita akan membandingkan rencana eksekusi.

Pada gambar di atas, kita dapat memperoleh beberapa informasi tentang rencana eksekusi. Namun perbedaan utamanya adalah Operasi Logika bidang. Salah satunya adalah Index Seek dan satu lagi adalah Pemindaian Indeks dan diferensiasi operasi ini menghasilkan nilai metrik taksiran dan aktual yang berbeda. Terakhir, operator Pencarian Indeks berkinerja lebih baik daripada operator Pemindaian Indeks.

Kesimpulan

Seperti yang kami sebutkan di artikel, fitur Bandingkan Showplan menawarkan beberapa manfaat bagi Pengembang atau Administrator Basis Data. Beberapa di antaranya dapat dihitung sebagai:

  • Sederhana untuk membandingkan dua perbedaan rencana eksekusi.
  • Sederhana untuk mendeteksi masalah kinerja kueri dalam Versi SQL Server yang berbeda.
  • Sederhana untuk mendeteksi masalah kinerja kueri di lingkungan yang berbeda.
  • Cukup mengklarifikasi perubahan rencana eksekusi sebelum dan sesudah pembuatan indeks.

Referensi

  • Estimasi Kardinalitas (SQL Server)
  • Panduan Arsitektur Pemrosesan Kueri

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Terhubung Ke SQL Server Dengan Otentikasi Windows Dari Mesin Linux Melalui JDBC

  2. Apa perbedaan antara indeks berkerumun dan tidak berkerumun?

  3. Perbarui Profil Email Database (SSMS)

  4. Kapan menggunakan KECUALI sebagai lawan NOT EXISTS di Transact SQL?

  5. cara melewati baris yang buruk di sumber file datar ssis