Update: Die Leistung eines DML-Vorgangs, das einen Trigger auslöst, möglicherweise verringern, wenn der Ausführungsplan für Trigger neu wiederholt kompiliert

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 870972 - Produkte anzeigen, auf die sich dieser Artikel bezieht
# Fehler: 470083 (SQL Server 8.0)
Alles erweitern | Alles schließen

Auf dieser Seite

Inhalt

Zusammenfassung

Dieser Artikel beschreibt die folgenden zu dieser Hotfix-Version:
  • Durch dieses Hotfixpaket behobenen Probleme
  • Voraussetzungen für die Installation des Hotfix-Pakets.
  • Gibt an, ob Sie Ihren Computer neu starten müssen nach der Installation des Hotfix-Pakets.
  • Wird das Hotfix-Paket durch andere Hotfix-Paket ersetzt?
  • Gibt an, ob Sie die Registrierungsänderungen vornehmen müssen.
  • Die Dateien, die im Hotfix-Paket enthalten sind.

Problembeschreibung

Wenn Sie eine Anweisung Data Manipulation Language (DML) wie z. B. ein UPDATE ausführen, INSERT oder DELETE-Anweisung, die einen Trigger auslöst, die Microsoft SQL Server-Programm Neukompilierungen der Triggerausführung planen, um die Leistung der Triggerausführung zu verbessern. Das wiederholte Neukompilierung der Ausführungsplan für Trigger kann jedoch die Leistung der Triggerausführung verringern.

Das wiederholte Neukompilierung der Ausführungsplan für Trigger kann auftreten, wenn folgende Bedingungen erfüllt sind:
  • Sie ausführen die DML-Anweisung mehrfach.
  • Die Anzahl der Zeilen, die von DML-Anweisung betroffen sind unterscheidet sich jedes Mal, das die DML-Anweisung ausgeführt wird.
Eine Liste der vorherigen Hotfixes finden Sie im Abschnitt "Microsoft SQL Server 2000 Post-Service Pack 3 oder Microsoft SQL Server 2000 Post-Service Pack 3a Hotfixes" im folgenden Artikel der Microsoft Knowledge Base:
290211So erhalten Sie das aktuellste SQL Server 2000 Service pack

Lösung

Informationen zu Service Packs

Installieren Sie das neueste Service Pack für Microsoft SQL Server 2000, um dieses Problem zu beheben. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
290211So erhalten Sie das neueste Service Pack für SQL Server 2000

Hotfix-Informationen

Voraussetzungen

Dieser Hotfix erfordert Microsoft SQL Server 2000 Service Pack 3 (SP3). Weitere Informationen dazu, wie Sie SQL Server 2000 Service Pack 3 erhalten finden Sie die folgende KB-Artikelnummer:
290211So erhalten Sie das aktuellste SQL Server 2000 Service pack

Informationen zum Neustart

Sie müssen Ihren Computer nicht neu starten, nachdem Sie diesen Hotfix installiert haben.

Hinweis: Nachdem Sie diesen Hotfix angewendet haben, müssen Sie das SQL Server 2000-Programm neu starten, das auf Ihrem Computer ausgeführt wird.

Dateiinformationen

Dieser Hotfix enthält nur die Dateien, die um die Probleme zu beheben, die in diesem Artikel aufgelistet erforderlich sind. Dieser Hotfix enthält möglicherweise nicht alle Dateien, die Sie benötigen, um ein Produkt vollständig auf den neuesten Stand zu aktualisieren.

Die englische Version dieses Hotfixes weist die Dateiattribute (oder höher Dateiattribute), die in der folgenden Tabelle aufgelistet werden. Die Datums- und Uhrzeitangaben für diese Dateien werden in Coordinated Universal Time aufgeführt (UTC). Wenn Sie sich die Dateiinformationen ansehen, werden diese Angaben in die lokale Zeit konvertiert. Um die Differenz zwischen UTC und der Ortszeit zu ermitteln verwenden Sie die Registerkarte Zeitzone des Tools ? Datum und Uhrzeit in der Systemsteuerung.
    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      

Hinweis: Aufgrund kann wechselseitiger Abhängigkeiten zwischen der aktuellste Hotfix, der diese Dateien enthält auch weitere Dateien enthalten.

Status

Microsoft hat bestätigt, dass dies einen Fehler in der Microsoft ist Produkte, die im Abschnitt "Gilt für" aufgelistet sind.

Dieses Problem wurde erstmals im Microsoft SQL Server 2000 Service Pack 4.

Weitere Informationen

Dieses Hotfix-Update verbessert die Schwellenwerte, an denen der Ausführungsplan einen Trigger erneut kompiliert wird. Zur Verbesserung der Schwellenwerte wirksam werden müssen Sie SQL Server-Ablaufverfolgungsflag 9055 nach der Installation dieses Hotfixes aktivieren. Verwenden Sie eine der folgenden Methoden, um das Ablaufverfolgungsflag 9055 für eine Instanz von SQL Server zu aktivieren:
  • Führen Sie die folgende Transact-SQL-Anweisung in SQL Query Analyzer auf die Instanz von SQL Server:
    DBCC TRACEON (9055, -1)
  • Hinzufügen von -T9055 auf die SQL Server-Start-Parameter.

Schritte zum Reproduzieren des Verhaltens

Gehen Sie folgendermaßen vor um ein Szenario zu reproduzieren, bei dem eine Neukompilierung Trigger Ausführung planen:
  1. Starten Sie SQL Query Analyzer, und dann eine Verbindung zu einer Instanz von SQL Server 2000 herstellen.
  2. Erstellen Sie eine Tabelle und ein Update-Trigger in der Tabelle. Benennen Sie die Tabelle als Cache_test und nennen Sie den Update-Trigger als Cache_test_update . Führen Sie hierzu die folgenden Transact-SQL-Anweisungen:
    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. Legen Sie einige Datensätze in der Tabelle Cache_test , und entfernen Sie alle Elemente aus dem Prozedur-Cache. To do this, run the following Transact-SQL statements:
    insert into cache_test (id, descr, testcolumn) select 1,'Descr 1','Test 1'
    insert into cache_test (id, descr, testcolumn) select 2,'Descr 2','Test 2'
    insert into cache_test (id, descr, testcolumn) select 3,'Descr 3','Test 3'
    insert into cache_test (id, descr, testcolumn) select 4,'Descr 4','Test 4'
    insert into cache_test (id, descr, testcolumn) select 5,'Descr 5','Test 5'
    insert into cache_test (id, descr, testcolumn) select 6,'Descr 6','Test 6'
    insert into cache_test (id, descr, testcolumn) select 7,'Descr 7','Test 7'
    insert into cache_test (id, descr, testcolumn) select 8,'Descr 8','Test 8'
    insert into cache_test (id, descr, testcolumn) select 9,'Descr 9','Test 9'
    insert into cache_test (id, descr, testcolumn) select 10,'Descr 10','Test 10'
    go
    
    dbcc freeproccache
  4. Aktualisieren einer einzelnen Zeile in der Tabelle Cache_test , und überprüfen Sie dann den Plan für diese Zeile Update, das im Cache befindet. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen: Update Cache_test
    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
    bemerken Sie eine Ausgabe, die der folgenden ähnelt:
    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. Aktualisieren Sie vier Zeilen in der Tabelle Cache_test , und überprüfen Sie dann den Plan für dieses Update mehrere Zeilen, die in den Cache ist. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen: Update Cache_test
    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
    Sie sehen eine Ausgabe, die der folgenden ähnelt:
    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. Aktualisieren Sie die fünf Zeilen) der Cache_test -Tabelle und dann finden Sie unter den Plan für dieses Update mehrere Zeile befindet, die im Cache. Führen Sie hierzu die folgenden Transact-SQL-Anweisungen: Update Cache_test
    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
    
    bemerken Sie eine Ausgabe, die der folgenden ähnelt:
    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
    

    Wenn Sie diese Ausgabe mit der Ausgabe in Schritt 5 vergleichen, können Sie die folgenden Bedingungen feststellen, die zu der Abnahme der Leistung der Triggerausführung führen könnte:
    • Der Ausführungsplan, der mehrere Zeilenaktualisierung in der Ausgabe des Schritt 5 entspricht wird gelöscht. Dieses Verhalten, weil der Ausführungsplan, der mehrere Zeilenaktualisierung entspricht neu kompiliert wird, um einen neuen Ausführungsplan zu erstellen.
    • Auch Eindruck der Ausführungsplan kompiliert wurde, haben, gibt die Usecounts -Spalte an, dass die ausführbare Datei für zwei Mal verwendet wurde. Dies ist nicht korrekt.
    • Darüber hinaus wurde der Ausführungsplan, der die einzelne Zeile Update entspricht, aus dem Cache gelöscht.

Informationsquellen

Weitere Informationen der folgenden Microsoft Developer Network (MSDN)-Website:
http://msdn2.microsoft.com/en-us/library/aa175244(SQL.80).aspx
Weitere Informationen über das Namensschema für Microsoft SQL Server-Updates finden Sie die folgende KB-Artikelnummer:
822499Neues Namensschema für Microsoft SQL Server-Softwareupdate-Paketen
Weitere Informationen zur Terminologie, die Microsoft bei der Korrektur von Software nach der Veröffentlichung verwendet, finden Sie die folgende KB-Artikelnummer:
824684Erläuterung von Standardbegriffen bei Microsoft Softwareupdates
Weitere Informationen finden Sie die folgende KB-Artikelnummer:
263889SQL aufgrund von [COMPILE] blockierende Sperren

Eigenschaften

Artikel-ID: 870972 - Geändert am: Freitag, 2. November 2007 - Version: 2.4
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
Keywords: 
kbmt kbtrigger kbbug kbfix kbsqlserv2000presp4fix kbhotfixserver kbqfe KB870972 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 870972
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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