Questione : Dichiarazione semplice dell'inserto molto lenta

Ciao le gente, il

I hanno una dichiarazione molto semplice dell'inserto, come segue il

Insert nel
select 0, il
select 1, il
select 2, il
select 3, il
select 4, il
select 5, il
select 6, il
select 7, il
select 8, il
select 9, il
select 10, il
select di MyTable (StringID, StringText) del SINDACATO del Br/> di N'123452.46093750'< del SINDACATO del Br/> di N'468330.90625000'< del SINDACATO del Br/> di N'152484.99609375'< del SINDACATO del Br/> di N'476937.99609375'< del SINDACATO del Br/> di N'30 D6-5FFC'< del SINDACATO del Br/> di N'AE79-9EED'< del SINDACATO del Br/> di N'10.5.0.75'< del SINDACATO del Br/> di N'00-21-9B-01-5C-C4'< del SINDACATO del Br/> del Writer'< del documento di N'Microsoft XPS del SINDACATO del
di N'ActiveReports 6 ' del SINDACATO del Br/> di N'6.0.2250.0'< 11, SINDACATI del

The del Br/> di N'24'< ...... continuano per 1800 annotazioni ed ogni dichiarazione è scoppiata nelle serie di 100, appena in modo da non colpisco dei limiti sul formato di dichiarazione o numero dell'inserto di unions.

This richiede 4 secondi per inserire 1800 file, perché è questo così lento? (I farneticamenti del ms circa su TPC calcola ecc, certamente il più ritardato ed il più grande potrebbe dirigere più di 450 file al secondo!!)la tabella del

The non ha indici, nessun rapporti: il

genera la Tabella MyTable
(
StringID int non nullo,
del
StringText

I hanno cambiamento la base di dati annotare “a semplice„, la relativa edizione 2008 dello sviluppatore di Sql che funziona su una scatola del centro 2.66 del quadrato con il RAM 4GB. Nient'altro sta funzionando su quella scatola a meno che lo studio visivo 2010.

I abbia provato ") i valori (" anziché prescelto ed io hanno provato la sintassi multipla dell'inserto di sql basata nuovo virgola 2008 - tutte le stesse idee del

Any? Qualche cosa provare?
class= del

Risposta : Dichiarazione semplice dell'inserto molto lenta

Qui è che cosa ripristina il DB prima di ogni prova.
Tutte le prove sono 10000 inserti.

freeproccache del dbcc
dropcleanbuffers del dbcc
regolare il nocount sopra
ANDARE
;
cadere la tabella MyTable3
ANDARE
      Generare la Tabella MyTable3
      (
            StringID int non nullo,
            Posizione di segnale minimo nvarchar di StringText (4000) non
      )
;
=========================
test1 - forma del sindacato, una grande dichiarazione (10000 una sparata), generata using i ritocchi sotto ed alcuni manuali

dichiarare il @i il int @i=1 stabilito
mentre il @i <� 10001="">comincia
stampare “selezionano “+right (@i, 10)+„, ''' +convert (varchar (massimo), newid di N ())+ unione del '''„;
regolare @i=@i+1
estremità
=========================

inserire MyTable3
selezionare 1, unione di N'A0B8022B-CFE9-43C9-97E5-DE89822AC32F
selezionare 2, unione di N'F87C8670-1339-458E-8F1C-C2E9B717F4AA
selezionare 3, unione di N'35 ACFFFC-52CF-4805-8C30-A4EB41F3A218
..........
selezionare 10000.

Tempo - 7 minutes+, uccisi

=========================
test2 - unione TUTTA LA forma
=========================

Tempo - più velocemente sopra.  La SPECIE allora DISTINTA non è richiesta.  L'unione da sè fa un distinto

=========================
test3 - unione TUTTA LA forma, 100 per gruppo, separato vicino;
=========================

Tempo - ancora più velocemente.  Ogni gruppo è commesso e non prende molto il trattamento nel RAM.  Inoltre, l'ottimizzatore di domanda non passa molto tempo sulle domande lunghe.  Il tempo di QO va in su esponenzialmente per le domande lunghe.

=========================
test4 - la tabella troncata, inserisce ancora (seguendo da test3 senza risistemazione)
=========================

Il tempo - più velocemente di 3. QO non deve fare alcuna progettazione, tutte e 100 le domande [di elettricità statica] che vengono dal nascondiglio di programma

=========================
test5 - using gli inserti parametrizzati. QO progetta soltanto un inserto. Tutti gli altri inserti vanno dal programma
Inserti generati using

dichiarare il @i il int @i=1 stabilito
mentre il @i <� 101="">comincia
stampare “il exec i valori dell'inserto MyTable3 dello sp_executesql N '' (@a, @a int, @b del @b) '', N '' nvarchar (4000) '', @a='+ a destra (@i, 10)+„, ''' +convert (varchar (massimo), newid del @b=N ())+ '''';
regolare @i=@i+1
estremità
=========================

Tempo speso - 6s! Il più velocemente.

===================

Conclusioni

(1) l'ottimizzatore di domanda dell'assistente di Sql prende esponenzialmente più lungamente per compilare più lungo il testo di domanda.

(2) i grandi blocchetti dell'inserto using l'unione o i valori (), (), () modelli si siedono in un MUCCHIO nella memoria, quindi dequeued dal MUCCHIO sull'inserto - Male.

(3) le domande parametrizzate sono buone.  Migliorare se le ammucchiate in dite 10 inserti, ma ogni inserto allora richiedesse (per l'esempio qui sopra) 20 parametri nell'inserto 10 in lotti.

(4) ** Non c'è nessuna prova qui sopra, ma la mia congettura ** Using uno PS per l'inserto, per esempio il @a del usp_insert, @b che fa l'inserto ed il vostro scritto all'ingrosso della forma

usp_insert 1, text'; del exec di N'test
usp_insert 2, text'; del exec di N'test
ecc

essere velocemente quanto gli inserti parametrizzati using sp_executesql, perché uno PS è compilato una volta soltanto e re-used#.

# - che è la fonte di problemi di fiuto di parametro….
Altre soluzioni  
 
programming4us programming4us