CORRECTIF : les performances d'une opération DML qui se déclenche un trigger peuvent diminuer lorsque le plan d'exécution déclencheur recompiles à plusieurs reprises

Traductions disponibles Traductions disponibles
Numéro d'article: 870972 - Voir les produits auxquels s'applique cet article
Bogue #: 470083 (SQL Server 8.0)
Agrandir tout | Réduire tout

Sommaire

Contenu de l'article

Résumé

Cet article décrit suivants concernant cette version de correctif logiciel :
  • Problèmes résolus par ce package de correctifs.
  • Conditions préalables à l'installation du correctif logiciel ;
  • Si vous devez redémarrer votre ordinateur après avoir installé le package de correctifs.
  • Si le package de correctifs est remplacé par un autre package de correctifs.
  • Si vous devez apporter les modifications du Registre.
  • Les fichiers qui sont contenus dans le package de correctifs.

Symptômes

Lorsque vous exécutez une instruction de langue (DML) de manipulation de données telle qu'une mise à jour, INSERT ou DELETE relevé qui se déclenche un trigger, les recompilations de programme Microsoft SQL Server l'exécution du déclencheur prévoyez d'améliorer les performances de l'exécution du déclencheur. Toutefois, la recompilation répétée du plan d'exécution déclencheur peut-être diminuer les performances de l'exécution du déclencheur.

La recompilation répétée du plan d'exécution déclencheur peut se produire lorsque les conditions suivantes sont remplies :
  • Vous exécutez l'instruction DML plusieurs fois.
  • Le nombre de lignes qui sont affectés par l'instruction DML diffère chaque exécution de l'instruction DML.
Pour obtenir une liste de correctifs logiciels antérieurs, consultez la section « Microsoft SQL Server 2000 postérieur au Service Pack 3 Microsoft SQL Server 2000 postérieur au Service Pack 3 a correctifs ou » dans l'article suivant de la base de connaissances Microsoft :
290211 Comment obtenir le pack de service SQL Server 2000 plus récent

Résolution

Informations sur le service pack

Pour résoudre ce problème, procurez-vous le dernier service pack Microsoft SQL Server 2000. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
290211 Comment obtenir le dernier pack de service SQL Server 2000

Informations sur le correctif

Conditions préalables

Ce correctif nécessite Microsoft SQL Server 2000 Service Pack 3 (SP3). Pour plus d'informations sur la façon d'obtenir SQL Server 2000 Service Pack 3, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
290211 Comment obtenir le pack de service SQL Server 2000 plus récent

Redémarrez les informations

Vous devez redémarrer votre ordinateur après avoir appliqué ce correctif.

note Après avoir appliqué ce correctif, vous devez redémarrer votre programme de SQL Server 2000 qui s'exécute sur votre ordinateur.

Informations sur le fichier de correctif

Ce correctif contient uniquement les fichiers nécessaires à la résolution des problèmes décrits dans cet article. Ce correctif peut ne pas contenir tous les fichiers nécessaires à la mise à jour complètement un produit vers la dernière version.

La version anglaise de ce correctif dispose les attributs de fichier (ou attributs de fichier version ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont exprimées en temps universel coordinated (UTC). Lorsque vous affichez les informations de fichier, il est convertie en heure locale. Pour connaître le décalage entre l'heure UTC et l'heure locale, utilisez l'onglet Fuseau horaire dans l'outil Date et heure du Panneau de configuration.
    Date         Time   Version       Size       File name
   ------------------------------------------------------------------
   18-Jun-2004  14:14  2000.80.954.0    664,128  Autoplt.dll      
   18-Jun-2004  14:14  2000.80.954.0     78,400  Console.exe      
   18-Jun-2004  14:14  2000.80.954.0    315,968  Custtask.dll     
   18-Jun-2004  14:14  2000.80.954.0     33,340  Dbmslpcn.dll     
   08-Apr-2004  09:12                   786,432  Distmdl.ldf
   08-Apr-2004  09:12                 2,359,296  Distmdl.mdf
   10-Oct-2003  06:18                       180  Drop_repl_hotfix.sql
   18-Jun-2004  14:14  2000.80.954.0  1,905,216  Dtspkg.dll       
   18-Jun-2004  14:14  2000.80.954.0    528,960  Dtspump.dll      
   18-Jun-2004  14:14  2000.80.954.0  1,557,052  Dtsui.dll        
   18-Jun-2004  14:14  2000.80.954.0    639,552  Dtswiz.dll       
   10-Oct-2003  06:18                   747,927  Instdist.sql
   10-Oct-2003  06:18                     1,581  Inst_repl_hotfix.sql
   18-Jun-2004  14:14  2000.80.954.0    352,828  Isqlw.exe        
   18-Jun-2004  14:14  2000.80.954.0     82,492  Itwiz.exe        
   18-Jun-2004  14:14  2000.80.954.0     90,692  Msgprox.dll      
   19-May-2004  11:13  8.11.40209.0     209,408  Mssdi98.dll      
   18-Jun-2004  14:14  2000.80.954.0     62,024  Odsole70.dll     
   18-Jun-2004  14:15  2000.80.954.0     25,144  Opends60.dll     
   18-Jun-2004  14:14  2000.80.954.0     57,904  Osql.exe         
   18-Jun-2004  14:14  2000.80.954.0    279,104  Pfutil80.dll     
   10-Oct-2003  06:07                   550,780  Procsyst.sql
   08-Apr-2004  09:12                    12,305  Qfe469315.sql
   08-Apr-2004  09:12                    19,195  Qfe469571.sql
   17-Jun-2004  02:42                 1,105,167  Replmerg.sql
   18-Jun-2004  14:14  2000.80.954.0    221,768  Replprov.dll     
   18-Jun-2004  14:14  2000.80.954.0    307,784  Replrec.dll      
   16-Jun-2004  14:07  2000.80.954.0    159,813  Replres.rll
   10-Oct-2003  06:18                 1,087,150  Replsys.sql
   10-Oct-2003  06:18                   986,603  Repltran.sql
   18-Jun-2004  14:14  2000.80.954.0    287,304  Rinitcom.dll     
   18-Jun-2004  14:14  2000.80.954.0     78,416  Sdiclnt.dll      
   18-Jun-2004  14:14  2000.80.954.0     66,112  Semmap.dll       
   18-Jun-2004  14:14  2000.80.954.0     57,916  Semnt.dll        
   18-Jun-2004  14:14  2000.80.954.0    492,096  Semobj.dll       
   16-Jun-2004  14:44  2000.80.954.0    172,032  Semobj.rll
   18-Jun-2004  14:14  2000.80.954.0     53,832  Snapshot.exe     
   11-Mar-2004  14:40                   117,834  Sp3_serv_uni.sql
   18-Jun-2004  14:13  2000.80.954.0     28,672  Sqlagent.dll     
   18-Jun-2004  14:14  2000.80.954.0    311,872  Sqlagent.exe     
   18-Jun-2004  14:13  2000.80.954.0    168,001  Sqlakw32.dll     
   18-Jun-2004  14:14  2000.80.954.0     33,344  Sqlctr80.dll     
   18-Jun-2004  14:14  2000.80.954.0  4,215,360  Sqldmo.dll       
   18-Jun-2004  14:14                    25,172  Sqldumper.exe    
   16-Jun-2004  13:54  2000.80.954.0     28,672  Sqlevn70.rll
   18-Jun-2004  14:14  2000.80.954.0    180,792  Sqlmap70.dll     
   18-Jun-2004  14:14  2000.80.954.0    188,992  Sqlmmc.dll       
   16-Jun-2004  14:52  2000.80.954.0    479,232  Sqlmmc.rll
   18-Jun-2004  14:14  2000.80.954.0    401,984  Sqlqry.dll       
   18-Jun-2004  14:14  2000.80.954.0     57,920  Sqlrepss.dll     
   18-Jun-2004  14:14  2000.80.954.0  7,581,777  Sqlservr.exe     
   18-Jun-2004  14:14  2000.80.954.0    590,396  Sqlsort.dll      
   18-Jun-2004  14:14  2000.80.954.0     45,644  Sqlvdi.dll       
   18-Jun-2004  14:14  2000.80.954.0    106,588  Sqsrvres.dll     
   18-Jun-2004  14:14  2000.80.954.0     33,340  Ssmslpcn.dll     
   18-Jun-2004  14:14  2000.80.954.0     82,492  Ssnetlib.dll     
   18-Jun-2004  14:14  2000.80.954.0     25,148  Ssnmpn70.dll     
   18-Jun-2004  14:14  2000.80.954.0    123,456  Stardds.dll      
   18-Jun-2004  14:14  2000.80.954.0    158,240  Svrnetcn.dll     
   18-Jun-2004  14:14  2000.80.954.0     76,416  Svrnetcn.exe     
   18-Jun-2004  14:14  2000.80.954.0     49,228  Ums.dll          
   18-Jun-2004  14:14  2000.80.954.0     98,872  Xpweb70.dll      

note En raison des dépendances de fichiers, le correctif plus récent contenant ces fichiers peut également contenir des fichiers.

Statut

Microsoft a confirmé le que de ce bogue dans le Microsoft produits répertoriés dans la section « S'applique à ».

Ce problème a été corrigé dans Microsoft SQL Server 2000 Service Pack 4.

Plus d'informations

Cette mise à jour correctif améliore les seuils à laquelle le plan d'exécution d'un déclencheur est recompilé. Pour l'amélioration des seuils prenne effet, vous devez activer indicateur de suivi SQL Server 9055 après avoir installé ce correctif. Pour activer l'indicateur de suivi 9055 pour une instance de SQL Server, utilisez une des méthodes suivantes :
  • Exécutez l'instruction Transact-SQL suivante dans SQL Query Analyzer sur l'instance de SQL Server :
    DBCC TRACEON (9055, -1)
  • Ajouter -T9055 les paramètres de démarrage SQL Server.

Procédure pour reproduire le problème

Pour reproduire un scénario qui entraîne une recompilation de plan de l'exécution de déclencheur, procédez comme suit :
  1. Démarrez l'Analyseur de requêtes SQL et puis connectez-vous à une instance de SQL Server 2000.
  2. Créer une table et un déclencheur de mise à jour sur la table. Nom de la table en tant que cache_test et nommez le déclencheur de mise à jour en tant que cache_test_update . Pour ce faire, exécutez les instructions Transact-SQL suivantes :
    use pubs
    go
    set nocount on
    go
    if exists (select 1 from sysobjects where id = object_id('dbo.cache_test'))
    drop table dbo.cache_test
    go
    create table dbo.cache_test
    (
    id int not null,
    descr varchar(30) not null,
    rowcreateddt datetime not null default getdate(),
    rowcreatedby varchar(30) not null default right(system_user,30),
    testcolumn varchar(30) null,
    primary key (id)
    )
    go
    
    create trigger dbo.cache_test_update
    on dbo.cache_test
    for update
    as
    if exists ( select 1 from inserted where id = 98654 )
    print 'test'
    return
    go
  3. Insérer des enregistrements dans la table cache_test et supprimez tous les éléments à partir du cache de procédure.
  4. Mettre à jour une seule ligne dans la table cache_test et ensuite visualiser le plan pour cette mise à jour ligne unique qui se trouve dans le cache. Pour ce faire, exécutez les instructions Transact-SQL suivantes :
    update cache_test
    set testcolumn = 'testing '+cast(id as varchar)
    where id between 1 and 1
    go
    
    select SetOpts,UseCounts,* from master..SyscacheObjects where ObjId=Object_ID('cache_test_update') order by SetOpts, CacheObjType
    go
    SyscacheObjects où ordre ObjId=Object_ID('cache_test_update') par SetOpts, CacheObjType vous allez remarquer un résultat semblable au suivant :
    SetOpts UseCounts bucketid cacheobjtype     objtype  objid      dbid dbidexec uid refcounts usecounts pagesused lasttime maxexectime avgexectime lastreads lastwrites setopts langid dateformat status sqlbytes sql
    5371	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update
    5371	1	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    1	      1	        0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update
    
  5. Mettre à jour quatre lignes de la table cache_test et ensuite visualiser le plan pour cette mise à jour ligne multiple qui se trouve dans le cache. Pour ce faire, exécutez les instructions Transact-SQL suivantes :
    update cache_test
    set testcolumn = 'testing '+cast(id as varchar)
    where id between 1 and 4
    go
    
    select SetOpts,UseCounts,* from master..SyscacheObjects where ObjId=Object_ID('cache_test_update') order by SetOpts, CacheObjType
    go
    SyscacheObjects où ordre ObjId=Object_ID('cache_test_update') par SetOpts, CacheObjType accéder vous remarquerez un résultat semblable au suivant :
    SetOpts UseCounts bucketid cacheobjtype     objtype  objid      dbid dbidexec uid refcounts usecounts pagesused lasttime maxexectime avgexectime lastreads lastwrites setopts langid dateformat status sqlbytes sql
    4347	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update
    4347	1	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    1	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update
    5371	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update
    5371	1	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    1	      1 	0	 0	     0	         0	   0	      5371    0	     1	        0	34	cache_test_update
    
  6. Mise à jour des cinq lignes) dans la table cache_test et puis voir le plan de cette mise à jour de plusieurs lignes qui est dans le cache. Pour ce faire, exécutez les instructions Transact-SQL suivantes :
    update cache_test
    set testcolumn = 'testing '+cast(id as varchar)
    where id between 1 and 5
    go
    
    select SetOpts,UseCounts,* from master..SyscacheObjects where ObjId=Object_ID('cache_test_update') order by SetOpts, CacheObjType
    go
    
    SyscacheObjects où ordre ObjId=Object_ID('cache_test_update') par SetOpts, CacheObjType vous allez remarquer un résultat semblable au suivant :
    SetOpts UseCounts bucketid cacheobjtype     objtype  objid      dbid dbidexec uid refcounts usecounts pagesused lasttime maxexectime avgexectime lastreads lastwrites setopts langid dateformat status sqlbytes sql
    4347	1	  10394	   Compiled Plan    Trigger  1029578706	5    5	      1	  2	    1	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update
    4347	2	  10394	   Executable Plan  Trigger  1029578706	5    5	      1	  1	    2	      1	        0	 0	     0	         0	   0	      4347    0	     1	        0	34	cache_test_update
    

    Si vous comparez cette sortie avec le résultat de l'étape 5, vous pouvez remarquer les conditions suivantes qui peuvent permettre à la baisse des performances de l'exécution de déclencheur :
    • Le plan d'exécution qui correspond à la mise à jour ligne plusieurs dans la sortie de l'étape 5 est supprimé. Ce problème se produit parce que le plan d'exécution qui correspond à la mise à jour ligne plusieurs est recompilé pour créer un nouveau plan d'exécution.
    • Même si le plan d'exécution semble avoir été recompilée, la colonne usecounts indique que le plan exécutable a été utilisé deux fois. Qui n'est pas correct.
    • En outre, le plan d'exécution qui correspond à la mise à jour ligne unique a été supprimé à partir du cache.

Références

Pour plus d'informations, reportez-vous au site de Web) MSDN (Microsoft Developer Network suivant :
http://msdn2.microsoft.com/en-us/library/aa175244(SQL.80).aspx
Pour plus d'informations sur le schéma d'appellation des mises à jour de Microsoft SQL Server, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
822499 Nouveau modèle d'affectation de noms pour les packages de correctifs logiciels Microsoft SQL Server
Pour plus d'informations sur la terminologie utilisée par Microsoft lors de la correction après leur publication de logiciels, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
824684 Description de la terminologie standard utilisée pour décrire les mises à jour logicielles Microsoft
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
263889 Verrouille SQL bloquer en raison de [[COMPILATION]]

Propriétés

Numéro d'article: 870972 - Dernière mise à jour: vendredi 2 novembre 2007 - Version: 2.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2000 Édition Développeur
  • Microsoft SQL Server 2000 Standard
  • Microsoft SQL Server 2000 Édition Entreprise
  • Microsoft SQL Server 2000 Édition Personelle
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
Mots-clés : 
kbmt kbtrigger kbbug kbfix kbsqlserv2000presp4fix kbhotfixserver kbqfe KB870972 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 870972
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com