Rumah > pangkalan data > tutorial mysql > Bagaimana Saya Boleh Menyelesaikan Kemerosotan Prestasi Prosedur Tersimpan SQL Server yang Disebabkan oleh Menghidu Parameter?

Bagaimana Saya Boleh Menyelesaikan Kemerosotan Prestasi Prosedur Tersimpan SQL Server yang Disebabkan oleh Menghidu Parameter?

Barbara Streisand
Lepaskan: 2024-12-31 00:39:38
asal
257 orang telah melayarinya

How Can I Resolve SQL Server Stored Procedure Performance Degradation Caused by Parameter Sniffing?

SQL Server Stored Procedure Performance Degradasi disebabkan oleh Parameter Sniffing

Parameter sniffing ialah teknik pengoptimuman yang digunakan oleh SQL Server untuk meningkatkan prestasi pertanyaan dengan memilih pelan pelaksanaan berdasarkan nilai parameter pada masa prosedur tersimpan pertama kali disusun. Walau bagaimanapun, dalam keadaan tertentu, penghidu parameter boleh membawa kepada isu prestasi.

Pertimbangkan prosedur tersimpan berikut:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
    -- Do Something using @MyDate
Salin selepas log masuk

Apabila prosedur tersimpan ini mula-mula dilaksanakan dengan @MyDate sebagai NULL, pertanyaan pengoptimum menjana pelan pelaksanaan yang dioptimumkan untuk nilai parameter tertentu itu. Walau bagaimanapun, jika prosedur tersimpan kemudiannya dilaksanakan dengan nilai yang berbeza untuk @MyDate, pengoptimum pertanyaan mungkin tidak menyusun pelan pelaksanaan yang optimum, yang membawa kepada penurunan prestasi.

Isu ini dikenali sebagai "parameter sniffing gone bad" . Dalam contoh di atas, walaupun @MyDate sebenarnya NULL apabila digunakan dalam prosedur tersimpan, pelan pelaksanaan yang lemah yang dijana berdasarkan kompilasi awal kekal berkuat kuasa.

Untuk menyelesaikan isu ini, seseorang boleh melumpuhkan parameter menghidu dengan memalsukan parameter:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    DECLARE @MyDate_Copy DATETIME
    SET @MyDate_Copy = @MyDate
    IF @MyDate_Copy IS NULL SET @MyDate_Copy = CURRENT_TIMESTAMP
    -- Do Something using @MyDate_Copy
Salin selepas log masuk

Pendekatan ini mencipta salinan parameter input dan menggunakan salinan itu untuk pertanyaan proses pengoptimuman, menghalang penghidu parameter berat sebelah.

Dalam SQL Server 2008 dan kemudian, penghidu parameter boleh dioptimumkan menggunakan pembayang OPTIMIZE FOR UNKNOWN:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
WITH RECOMPILE, OPTIMIZE FOR UNKNOWN
AS
    -- Do Something using @MyDate
Salin selepas log masuk

Petua ini mengarahkan pengoptimum pertanyaan untuk menjana pelan pelaksanaan berdasarkan nilai parameter yang tidak diketahui, menghapuskan risiko parameter isu prestasi yang berkaitan dengan menghidu.

Atas ialah kandungan terperinci Bagaimana Saya Boleh Menyelesaikan Kemerosotan Prestasi Prosedur Tersimpan SQL Server yang Disebabkan oleh Menghidu Parameter?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan