FIX: Potrebbero diminuire le prestazioni di un'operazione DML che attiva un trigger quando il piano di esecuzione trigger ricompila ripetutamente

Traduzione articoli Traduzione articoli
Identificativo articolo: 870972 - Visualizza i prodotti a cui si riferisce l?articolo.
Bug #: 470083 (SQL Server 8.0)
Espandi tutto | Chiudi tutto

In questa pagina

Contenuto dell'articolo

Sommario

Questo articolo viene descritto il seguente su questa versione di aggiornamento rapido (hotfix):
  • I problemi risolti da questo pacchetto di aggiornamento rapido (hotfix).
  • Prerequisiti per l'installazione del pacchetto aggiornamento rapido (hotfix).
  • Se Ŕ necessario riavviare il computer dopo l'installazione del pacchetto di aggiornamento rapido (hotfix).
  • Sostituzione del pacchetto hotfix da qualsiasi altro pacchetto di aggiornamento rapido (hotfix).
  • NecessitÓ di apportare le modifiche del Registro di sistema.
  • I file contenuti nel pacchetto di aggiornamenti rapidi (hotfix).

Sintomi

Quando si esegue un'istruzione language (DML) di modifica dei dati, ad esempio un'istruzione UPDATE, INSERT o DELETE istruzione che attiva un trigger, ricompilazioni i programma di Microsoft SQL Server piano di esecuzione del trigger per migliorare le prestazioni dell'esecuzione del trigger. La ricompilazione del piano di esecuzione trigger ripetuta pu˛ tuttavia influire le prestazioni di esecuzione del trigger.

La ricompilazione del piano di esecuzione trigger ripetuta pu˛ verificarsi quando sono vere le seguenti condizioni:
  • Per eseguire l'istruzione DML pi¨ volte.
  • Il numero di righe interessate dall'istruzione DML Ŕ diverso ogni volta che viene eseguita l'istruzione DML.
Per un elenco degli aggiornamenti rapidi precedenti, vedere la sezione di "Microsoft SQL Server 2000 post-Service Pack 3 o Microsoft SQL Server 2000 al Pack aggiornamenti 3a rapidi" nell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
290211Come ottenere il service pack pi¨ recente per SQL Server 2000

Risoluzione

Informazioni sul Service pack

Per risolvere il problema, ottenere il service pack pi¨ recente per Microsoft SQL Server 2000. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
290211Come ottenere il service pack pi¨ recente per SQL Server 2000

Informazioni sull'hotfix

Prerequisiti

Questo aggiornamento rapido (hotfix) richiede Microsoft SQL Server 2000 Service Pack 3 (SP3). Per ulteriori informazioni su come ottenere SQL Server 2000 Service Pack 3, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
290211Come ottenere il service pack pi¨ recente per SQL Server 2000

Informazioni sul riavvio

Non Ŕ necessario riavviare il computer dopo avere applicato questo aggiornamento rapido (hotfix).

Nota Dopo avere applicato questo aggiornamento rapido (hotfix), Ŕ necessario riavviare il programma di SQL Server 2000 che Ŕ in esecuzione sul computer.

Informazioni sul file di hotfix

Questo aggiornamento rapido (hotfix) contiene solo i file necessari per correggere i problemi elencati nel presente articolo. Questo aggiornamento rapido (hotfix) non siano tutti i file necessari per aggiornare completamente un prodotto all'ultima build.

La versione di lingua inglese di questo aggiornamento rapido (hotfix) presenta gli attributi di file (o attributi successivi) elencati nella tabella riportata di seguito. Date e ore per questi file sono indicati nella coordinated universal time (UTC). Quando si visualizzano le informazioni sul file, viene convertito in ora locale. Per calcolare la differenza tra ora UTC e l'ora locale, utilizzare la scheda fuso orario dello strumento Data e ora del Pannello di controllo.
    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      

Nota A causa delle dipendenze fra i file, Ŕ possibile che l'aggiornamento rapido pi¨ recente contenente i file contengano ulteriori file.

Status

Microsoft ha confermato che questo un bug in Microsoft i prodotti sono elencati nella sezione "Si applica a".

Questo problema Ŕ stato innanzitutto corretto in SQL Server 2000 Service Pack 4.

Informazioni

Questo aggiornamento di aggiornamento rapido (hotfix) consente di migliorare le soglie in cui il piano di esecuzione di un trigger viene ricompilato. Per le soglie miglioramento abbiano effetto, Ŕ necessario attivare flag di traccia SQL Server 9055 dopo avere installato questo hotfix. Per attivare il flag di traccia 9055 per un'istanza di SQL Server, utilizzare uno dei metodi descritti di seguito:
  • Eseguire la seguente istruzione di Transact-SQL in SQL Query Analyzer nell'istanza di SQL Server:
    DBCC TRACEON (9055, -1)
  • Aggiungere -T9055 ai parametri di avvio di SQL Server.

Procedura per riprodurre il problema.

Per riprodurre uno scenario che provoca una ricompilazione di piano di esecuzione di trigger, attenersi alla seguente procedura:
  1. Avviare SQL Query Analyzer e quindi connettersi a un'istanza di SQL Server 2000.
  2. Creare una tabella e un trigger di aggiornamento nella tabella. Nome della tabella come cache_test e il trigger di aggiornamento come cache_test_update il nome. A tale scopo, eseguire le seguenti istruzioni Transact-SQL:
    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. Inserire alcuni record nella tabella cache_test e rimuovere tutti gli elementi dalla cache delle procedure. 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. Aggiornare una singola riga nella tabella cache_test e quindi visualizzare il piano per questo aggiornamento per la singola riga nella cache. A tale scopo, eseguire le seguenti istruzioni Transact-SQL:
    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
    si nota un output simile al seguente:
    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. Aggiorna le quattro righe nella tabella cache_test e verificare il piano per questo aggiornamento di pi¨ righe che si trova nella cache. A tale scopo, eseguire le seguenti istruzioni Transact-SQL:
    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
    si noterÓ un output simile al seguente:
    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. Aggiornamento cinque righe) nella tabella cache_test e verificare il piano per questo aggiornamento di pi¨ righe che Ŕ nella cache. A tale scopo, eseguire le seguenti istruzioni Transact-SQL:
    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
    
    si nota un output simile al seguente:
    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
    

    Se si confronta questo output con l'output nel passaggio 5, si noterÓ che potrebbero causare la riduzione delle prestazioni dell'esecuzione del trigger seguenti condizioni:
    • Viene eliminato il piano di esecuzione corrisponde all'aggiornamento riga pi¨ nell'output del passaggio 5. Questo comportamento si verifica perchÚ il piano di esecuzione corrisponde all'aggiornamento riga pi¨ viene ricompilato per creare un nuovo piano di esecuzione.
    • Anche se sono stati ricompilati viene visualizzato il piano di esecuzione, la colonna di usecounts indica di che il piano eseguibile Ŕ stato utilizzato due volte. Non Ŕ corretto.
    • Inoltre, il piano di esecuzione corrisponde all'aggiornamento singola riga Ŕ stato eliminato dalla cache.

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/aa175244(SQL.80).aspx
Per ulteriori informazioni sullo schema di denominazione degli aggiornamenti di Microsoft SQL Server, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
822499Nuovo schema di denominazione per i pacchetti di aggiornamento software di Microsoft SQL Server
Per ulteriori informazioni sulla terminologia utilizzata da Microsoft correzione software dopo il rilascio, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
824684Descrizione della terminologia standard utilizzata per descrivere gli aggiornamenti software Microsoft
Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
263889Blocchi di blocchi a causa di [[compilazione]] SQL

ProprietÓ

Identificativo articolo: 870972 - Ultima modifica: venerdý 2 novembre 2007 - Revisione: 2.4
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbmt kbtrigger kbbug kbfix kbsqlserv2000presp4fix kbhotfixserver kbqfe KB870972 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 870972
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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