Frage : Einfache Einsatz-Aussage sehr langsam

Hallo haben Völker,

I eine sehr einfache Einsatzaussage, wie folgt

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

The ANSCHLÜSSE weitermachen für 1800 Aufzeichnungen, und jede Aussage wird in Reihen von 100 ausgebrochen, gerade also schlage ich keine Begrenzungen auf Aussagengröße, oder Zahl unions.

This des Einsatzes 4 Sekunden, um 1800 Reihen einzusetzen, warum ist nimmt dieses so langsam? (Mitgliedstaat-Geschimpfen auf ungefähr TPC stellt usw., sicher das späteste dar und am größten könnte mehr als 450 Reihen pro Sekunde handhaben!!)

The Tabelle hat keine Indizes, keine Verhältnisse:

stellen Tabelle MyTable
her (
StringID int nicht ungültig,
StringText nvarchar (4000) nicht ungültiges
)

I haben Änderung die Datenbank zu loggen an „einfachem“, seine Sql-Entwicklerausgabe 2008, die auf einen Kasten des Viererkabel-Kernes 2.66 mit RAM 4GB läuft. Nichts anderes läuft auf diesen Kasten, ausgenommen Sichtstudio 2010.

I ") Werte versucht haben („anstelle anstelle auserwähltem und von mir haben die neues Komma gegründete mehrfache Einsatzsyntax sql-2008 - alle gleichen

Any Ideen versucht? Alles zu versuchen?

Antwort : Einfache Einsatz-Aussage sehr langsam

Ist hier, was das DB vor jedem Test zurückstellt.
Alle Tests sind 10000 Einsätze.

dbcc freeproccache
dbcc dropcleanbuffers
nocount an einstellen
GEHEN
;
Tabelle MyTable3 fallenlassen
GEHEN
      Tabelle MyTable3 herstellen
      (
            StringID int nicht ungültig,
            StringText nvarchar (4000) nicht Null
      )
;
=========================
test1 - Anschlussform, eine grosse Aussage (10000 eine geschossen), erzeugt using below und einig Handbuch zwickt

@i int gesetztes @i=1 erklären
während @i <� 10001="">anfangen
drucken „vorwählt „+right (@i, 10)+“, das N ''' +convert (varchar (maximal), newid ())+ ''' Anschluss“;
@i=@i+1 einstellen
Ende
=========================

MyTable3 einsetzen
1, N'A0B8022B-CFE9-43C9-97E5-DE89822AC32F Anschluss vorwählen
2, N'F87C8670-1339-458E-8F1C-C2E9B717F4AA Anschluss vorwählen
3, N'35 ACFFFC-52CF-4805-8C30-A4EB41F3A218 Anschluss vorwählen
..........
10000 vorwählen.

Zeit - 7 minutes+, getötet

=========================
test2 - Anschluss ALLE Form
=========================

Zeit - schneller als oben.  Die EINDEUTIGE ART dann angefordert nicht t.  Anschluss eigenständig tut ein eindeutiges

=========================
test3 - Anschluss ALLE Form, 100 pro die Reihe, vorbei getrennt;
=========================

Zeit - sogar schneller.  Jede Reihe verpflichtet und nimmt nicht im RAM viel behandeln.  Außerdem verbringt Fragenoptimierer viel Zeit nicht auf langen Fragen.  QO Zeit anstrebt oben exponential lange Fragen e.

=========================
test4 - truncate Tabelle, einsetzen wieder en (folgend von test3 ohne Zurückstellen)
=========================

Zeit - schneller als 3. QO muss keine Planung, alle 100 [Static] Fragen tun, die vom Planpufferspeicher kommen

=========================
test5 - using parameterisierte Einsätze. QO plant nur einen Einsatz. Alle weiteren Einsätze gehen durch Plan
Einsätze erzeugt using

@i int gesetztes @i=1 erklären
während @i <� 101="">anfangen
„exec sp_executesql N '' Werte des Einsatzes MyTable3 (@a, @b) '', N '' @a int, das @b drucken nvarchar (4000) '', @a='+ nach rechts (@i, 10)+“, das @b=N ''' +convert (varchar (maximal), newid ())+ '''';
@i=@i+1 einstellen
Ende
=========================

Zeit genommen - 6s! Am schnellsten.

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

Zusammenfassungen

(1) dauert Sql-Bediener-Fragen-Optimierer exponential länger, um das länger zu kompilieren, der Fragentext.

(2) sitzen große Einsatzblöcke using Anschluss oder Werte (), (), () Muster in einem HAUFEN im Gedächtnis, dann vom HAUFEN aus der Warteschlange genommen auf Einsatz - Schlechtes.

(3) sind parameterisierte Fragen gut.  Verbessern, wenn Sie sie in sagen 10 Einsätze aufstapeln, aber jeder Einsatz dann (für das Beispiel oben) 20 Parameter im Einsatz mit 10 Reihen erfordern.

(4) ** Kein Test oben, aber meine Vermutung ** Using ein SP für den Einsatz, z.B. usp_insert @a, @b, das den Einsatz und Ihren Massenindex tut, ist von der Form

exec usp_insert 1, N'test text';
exec usp_insert 2, N'test text';
usw.

wie die parameterisierten Einsätze using sp_executesql so schnell sein, weil ein SP einmal nur und Re-used# kompiliert.

# - das ist die Quelle der Parameterschnüffelnprobleme….
Weitere Lösungen  
 
programming4us programming4us