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

Konfigurasi Cakupan Database SQL Server dan Koreksi Paket Otomatis

Pada artikel ini, kita akan memeriksa Konfigurasi Cakupan Basis Data dan Koreksi Paket Otomatis SQL Server 2017. Microsoft menambahkan fitur baru ke SQL Server 2017 yang meningkatkan kinerja kueri.

Kinerja kueri SQL Server terkait dengan kualitas dan akurasi rencana eksekusi. Saat kami menjalankan kueri, pengoptimal kueri menganalisis banyak rencana eksekusi dan kemudian memutuskan rencana eksekusi kueri yang optimal.

Estimasi Kardinalitas Warisan: Penaksir Kardinalitas memprediksi berapa banyak baris kueri yang akan dikembalikan, serta menentukan alokasi memori kueri.

Di SQL Server 2017, Versi Model Estimasi Kardinalitas default adalah 14.0, tetapi jika Anda ingin menggunakan versi 7.0 dari Penaksir Kardinalitas yang lebih lama, Anda dapat melakukannya dengan mengubah opsi Estimasi Kardinalitas Warisan di Konfigurasi Cakupan Basis Data bagian.

Nilai default dari Legacy Cardinality Estimation adalah OFF. Jadi jika Anda ingin menggunakan versi yang lebih lama, Anda harus mengaktifkannya ke AKTIF.

Atau, Anda dapat mengubah properti ini di T-SQL.

ALTER DATABASE CAKUPAN KONFIGURASI SET LEGACY_CARDINALITY_ESTIMATION =OFF|ON;

Namun, jika Anda mengaktifkan pengaturan ini, itu akan memengaruhi semua kueri. Akibatnya, ini dapat merusak kinerja kueri. Untuk mencegahnya, Anda dapat menggunakan petunjuk FORCE_LEGACY_CARDINALITY_ESTIMATION.

Saat kami menjalankan kueri ini di database WideWorldImporters, maka secara otomatis akan menggunakan versi baru dari estimasi kardinalitas.

SELECT [o].[CustomerID], o.LastEditedBy , [o].[OrderDate] FROM Sales.Orders oWHERE [o].[OrderDate]>='20140101'

Saat kami menambahkan FORCE_LEGACY_CARDINALITY_ESTIMATION ke kueri, pengoptimal kueri akan menggunakan versi estimasi kardinalitas sebelumnya atau terlama.

MAXDOP : kita dapat mengatur tingkat paralelisme maksimum untuk database individu. Sebelum fitur ini dibuat, kami hanya dapat mengkonfigurasi level server MAXDOP.

Petunjuk kueri MAXDOP memungkinkan kita menjalankan kueri secara paralel.

ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP =4; PERGI

Pengendus Parameter: Ketika waktu eksekusi kueri berubah secara dramatis dan perubahan waktu ini terkait dengan parameter kueri, ini disebut parameter sniffing.

Sekarang, kita akan membuat prosedur tersimpan pada database AdventureWorks. Kami akan mengirimkan parameter yang berbeda dan membandingkan rencana eksekusi.

JALANKAN PROSEDUR JIKA ADA Get_OrdersGOCREATE PROSEDUR Get_Orderes@ProductID INTASSELECT SalesOrderDetailID, OrderQtyFROM Sales.SalesOrderDetailWHERE ProductID =@ProductID;GO/*******Jangan gunakan skrip ini di server produksi!*******/ DBCC FREEPROCCACHE--Kueri MarsEXEC Get_OrderID_OrderQty @ProductID=870DBCC FREEPROCCACHE--Kueri VenusEXEC Get_OrderID_OrderQty @ProductID=897

Seperti yang ditunjukkan pada gambar di bawah ini, SQL Server menghasilkan rencana eksekusi yang berbeda untuk kueri yang sama. Rencana eksekusi Query Mars merekomendasikan indeks. Parameter kueri mengubah rencana eksekusi optimal.

Jalankan kueri ini dan lihat rencana eksekusi.

DBCC FREEPROCCACHE--Kueri MarsEXEC Get_OrderID_OrderQty @ProductID=870--Kueri VenusEXEC Get_OrderID_OrderQty @ProductID=897

Rencana eksekusi Query Venus sama dengan rencana eksekusi Query Mars. Ini adalah parameter sniffing karena rencana eksekusi yang di-cache dikompilasi untuk rencana eksekusi Query Mars. Untuk alasan ini, Query Venus menggunakan rencana eksekusi yang sama.

Sekarang, kita akan menonaktifkan parameter sniffing dan menjalankan kueri yang sama.

ALTER DATABASE CAKUPAN KONFIGURASI SET PARAMETER_SNIFFING =OFF;DBCC FREEPROCCACHE--Kueri MarsEXEC Get_OrderID_OrderQty @ProductID=870--Kueri VenusEXEC Get_OrderID_OrderQty @ProductID=897

Mari kita periksa:

Pengoptimal SQL Server Query menghasilkan rencana eksekusi optimal untuk Query Venus dan Query Mars. Pendekatan ini memberikan kinerja optimal untuk kueri.

Ada beberapa opsi untuk menghindari masalah ini:

  • OPSI(REKOMPILASI)
  • OPSI (OPTIMALKAN UNTUK(@VARIABLE=UNKNOWN))

Koreksi Rencana Otomatis

SQL Server 2017 menyertakan fitur baru yang disebut Koreksi Rencana Otomatis. Saat kami menjalankan kueri, pengoptimal kueri membuat rencana eksekusi. Untuk beberapa alasan, pengoptimal kueri memilih rencana eksekusi yang salah. Beberapa alasannya adalah sebagai berikut:

  • Kueri yang tidak memenuhi kriteria kinerja
  • Statistik kedaluwarsa
  • Indeks yang tidak sesuai

Ketika pengoptimal kueri SQL Server memutuskan untuk mengubah rencana eksekusi dan rencana eksekusi ini merusak kinerja, kinerja kueri disebut regresi rencana. Sebuah fitur baru hadir dengan SQL Server 2016. Alat ini membantu dalam memantau dan memecahkan masalah kinerja kueri dan pada saat yang sama menyimpan metrik kinerja dan penghitung dari eksekusi kueri.

Kami dapat mengaktifkan opsi ini di bawah properti database.

Sekarang, kita akan membuat demo fitur ini. Pertama-tama, bersihkan cache prosedur dan buat prosedur tersimpan.

/****************************************Jangan gunakan skrip ini di server produksi******************************************/GUNAKAN WideWorldImportersALTER DATABASE WideWorldImporters SET QUERY_STORE =AKTIF; ALTER DATABASE [WideWorldImporters] SET QUERY_STORE CLEAR ALLDBCC FREEPROCCACHE -- Perintah ini akan menghapus semua cache prosedur di SQL Server. Jangan mencoba di lingkungan produksi-- ALTER DATABASE WideWorldImporters SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN =OFF); JATUHKAN PROSEDUR JIKA ADA Test_CoddingSight2 GO CREATE PROC Test_CoddingSight2 @Id AS INT AS pilih jumlah([UnitPrice]*[Quantity]) dari Sales.OrderLines O INNER JOIN sales.Orders o1 ON o1.OrderID =o.OrderTypeID di mana o. ID

Pada langkah ini, kami akan menjalankan prosedur ini dengan parameter yang berbeda dan menemukan perbedaan waktu eksekusi.

--Kueri AlphaDBCC FREEPROCCACHE EXEC Test_CoddingSight2 7GO 80DBCC FREEPROCCACHE EXEC Test_CoddingSight2 -1--Kueri BetaEXEC Test_CoddingSight2 7GO 80

Seperti yang Anda lihat, kueri pertama diselesaikan dalam 12 detik, sedangkan kueri kedua diselesaikan dalam 33 detik. Alasan untuk perbedaan dramatis ini adalah karena pengoptimal kueri memilih rencana eksekusi yang tidak sesuai untuk Kueri Beta.

Mari kita bandingkan rencana eksekusi Query Alpha dan Query Beta.

Rencana eksekusi Alfa Kueri

Rencana eksekusi Beta Kueri

Pada gambar di atas, pengoptimal kueri membuat rencana eksekusi yang berbeda untuk kueri yang sama. Saat kita melihat Kueri yang Menghabiskan Sumber Daya Teratas , kita dapat melihat bahwa Kueri Beta menghabiskan lebih banyak sumber daya daripada Kueri Alfa.

Kueri di bawah ini akan menampilkan informasi mendetail tentang rekomendasi penyetelan.

PILIH nama, alasan, skor,JSON_VALUE(details, '$.implementationDetails.script') sebagai skrip, detail.* FROM sys.dm_db_tuning_recommendations CROSS APPLY OPENJSON(details, '$.planForceDetails') WITH ( query_id int '$ .queryId', regressed_plan_id int '$.regressedPlanId', last_good_plan_id int '$.recommendedPlanId') as detailsWHERE JSON_VALUE(state, '$.currentValue') ='Active'

Kolom alasan menunjukkan mengapa kita harus menerapkan rekomendasi ini.

Sekarang, kami akan menjalankan kembali Kueri Alfa dan Kueri Beta dengan koreksi rencana otomatis diaktifkan.

/***************************************Jangan gunakan skrip ini di server produksi******************************************/ALTER DATABASE [WideWorldImporters] SET QUERY_STORE CLEAR ALLDBCC FREEPROCCACHE /****************************************Aktifkan Koreksi Rencana Otomatis *****************************************/ALTER DATABASE WideWorldImporters SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN =PADA); --Kueri AlphaDBCC FREEPROCCACHE EXEC Test_CoddingSight2 7GO 80DBCC GRATISPROCCACHE EXEC Test_CoddingSight2 -1--Kueri BetaEXEC Test_CoddingSight2 7GO 80

Setelah demo ini, rencana eksekusi Query Alpha diterapkan ke Query Beta. Selain itu, waktu eksekusi Kueri Alfa dan Beta Kueri berdekatan satu sama lain. Kueri di bawah ini akan mengembalikan status koreksi rencana otomatis.

PILIH nama, alasan, skor,JSON_VALUE(status, '$.currentValue') sebagai status,JSON_VALUE(detail, '$.implementationDetails.script') sebagai skrip, detail.* FROM sys.dm_db_tuning_recommendations CROSS APPLY OPENJSON(detail , '$.planForceDetails') WITH ( query_id int '$.queryId', regressed_plan_id int '$.regressedPlanId', last_good_plan_id int '$.recommendedPlanId') as detailsWHERE JSON_VALUE(state, '$.currentValue')<.currentValue /pra> 

Selain itu, kami dapat menemukan beberapa informasi grafis di Kueri dengan Paket yang Dipaksa . Grafik ini mendefinisikan rencana dan kueri kueri paksa.

Referensi

Koreksi paket otomatis di SQL Server 2017

Estimasi Kardinalitas


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gabungkan beberapa baris menjadi satu baris

  2. OBJECTPROPERTY() vs OBJECTPROPERTYEX() di SQL Server:Apa Perbedaannya?

  3. Cara Mengonversi String ke Tanggal/Waktu di SQL Server menggunakan CONVERT()

  4. Hindari 4 Kesalahan Umum DBA Ini

  5. Masukkan Massal File Data Ke SQL Server