Maison >base de données >tutoriel mysql >Comment puis-je résoudre la dégradation des performances des procédures stockées SQL Server causée par le reniflage des paramètres ?

Comment puis-je résoudre la dégradation des performances des procédures stockées SQL Server causée par le reniflage des paramètres ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-31 00:39:38243parcourir

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

Dégradation des performances des procédures stockées SQL Server en raison du reniflage des paramètres

Le reniflage des paramètres est une technique d'optimisation utilisée par SQL Server pour améliorer les performances des requêtes en sélectionnant un plan d'exécution basé sur les valeurs des paramètres au moment de la première compilation de la procédure stockée. Cependant, dans certains cas, le reniflage des paramètres peut entraîner des problèmes de performances.

Considérez la procédure stockée suivante :

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

Lorsque cette procédure stockée est exécutée pour la première fois avec @MyDate comme NULL, la requête L'optimiseur génère un plan d'exécution optimisé pour cette valeur de paramètre particulière. Cependant, si la procédure stockée est ensuite exécutée avec une valeur différente pour @MyDate, l'optimiseur de requêtes risque de ne pas compiler un plan d'exécution optimal, ce qui entraînera une dégradation des performances.

Ce problème est connu sous le nom de « détection de paramètres qui a mal tourné ». . Dans l'exemple ci-dessus, même si @MyDate est en fait NULL lorsqu'il est utilisé dans la procédure stockée, le mauvais plan d'exécution généré sur la base de la compilation initiale reste en vigueur.

Pour résoudre ce problème, on peut désactiver le paramètre renifler en usurpant le paramètre :

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

Cette approche crée une copie du paramètre d'entrée et utilise cette copie pour le processus d'optimisation des requêtes, empêchant ainsi les paramètres biaisés reniflage.

Dans SQL Server 2008 et versions ultérieures, le reniflage des paramètres peut être optimisé à l'aide de l'indice OPTIMIZE FOR UNKNOWN :

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

Cet indice demande à l'optimiseur de requêtes de générer un plan d'exécution basé sur des éléments inconnus. valeurs des paramètres, éliminant ainsi le risque de problèmes de performances liés au reniflage des paramètres.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn