Vraag : De eenvoudige zeer langzame Verklaring van het Tussenvoegsel

Hallo hebben de Mensen,

I een zeer eenvoudige tussenvoegselverklaring, als volgt

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

The dragen voor 1800 verslagen, en elke verklaring is uitgebroken in partijen van 100, enkel zodat raakte ik geen grenzen op verklaringsgrootte of aantal van tussenvoegsel unions.

This 4 seconden om 1800 rijen, waarom is vergt zo langzaam dit op te nemen? (Lidstaten razen en tieren op ongeveer TPC cijfers enz., zeker kon het recentst en het grootst meer dan 450 rijen per seconde beheren!!)

The- lijst geen indexen, geen verhoudingen:

leidt tot Lijst MyTable
(
niet ongeldige StringID int.,
StringText nvarchar (4000) niet ongeldige
)

I heeft verandering gegevensbestand het registreren in „Eenvoudig“, zijn Sql 2008 ontwikkelaaruitgave die op een Kern 2.66 van de Vierling vakje met 4GB RAM in werking stellen. Niets anders loopt op die doos behalve Visuele Studio 2010.

I heeft geprobeerd“) waarden („in plaats van uitgezocht, en ik geprobeerd de nieuwe komma sql 2008 veelvoudige tussenvoegselsyntaxis - hebben alle zelfde ideeën

Any gebaseerd? Om het even wat te proberen?

Antwoord : De eenvoudige zeer langzame Verklaring van het Tussenvoegsel

Hier is wat OB vóór elke test terugstelt.
Alle tests zijn 10000 tussenvoegsels.

dbcc freeproccache
dbcc dropcleanbuffers
reeks nocount
GA
;
laat vallen lijst MyTable3
GA
      Cre�ër Lijst MyTable3
      (
            Niet ongeldige StringID int.,
            Nvarchar StringText (4000) niet verklaart nietig
      )
;
=========================
test1 - unievorm, één grote verklaring (10000 ontsproten één), geproduceerd gebruikend de onderstaande en een paar handkneepjes

verklaar @i int. vastgestelde @i=1
terwijl @i <� 10001="">begint
druk „uitgezochte „+right (@i, 10) +“, varchar N ''' +convert ((maximum), newid ())+ unie '''“;
vastgestelde @i=@i+1
eind
=========================

tussenvoegsel MyTable3
selecteer 1, unie N'A0B8022B-CFE9-43C9-97E5-DE89822AC32F
selecteer 2, unie N'F87C8670-1339-458E-8F1C-C2E9B717F4AA
selecteer 3, N'35 de unie van acfffc-52cf-4805-8c30-A4EB41F3A218
..........
selecteer 10000.

Tijd - 7 gedode minutes+,

=========================
test2 - unie AL vorm
=========================

Tijd - sneller dan hierboven.  Toen VERSCHILLENDE de SOORT wordt niet vereist.  De Unie op zijn doet verschillend

=========================
test3 - unie AL vorm, 100 per langs gescheiden partij;
=========================

Tijd - nog sneller.  Elke partij wordt begaan en neemt veel geen behandeling in RAM.  Voorts brengt optimizer van de Vraag veel tijd niet aan lange vragen door.  QO de tijd gaat exponentieel voor lange vragen uit.

=========================
test4 - beknot lijst, opnieuw opnemen (na van test3 zonder het terugstellen)
=========================

Tijd - sneller dan 3.  QO moet geen planning doen, alle 100 [statische] vragen die uit plangeheim voorgeheugen komen

=========================
test5 - het gebruiken bepaalde de parameters van tussenvoegsels. QO plant slechts één tussenvoegsel. Alle andere tussenvoegsels gaan door plan
Neemt het geproduceerde gebruiken op

verklaar @i int. vastgestelde @i=1
terwijl @i <� 101="">begint
druk „exec sp_executesql het tussenvoegselMyTable3 waarden van N '' (@a, @b) '', N '' @a int., @b nvarchar (4000) '', juiste @a='+ (@i, 10) +“, varchar @b=N ''' +convert ((maximum), newid ())+ '''';
vastgestelde @i=@i+1
eind
=========================

Gevergde tijd - 6s! Het snelst.

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

Conclusies

(1) Sql Optimizer van de Vraag van de Server neemt exponentieel langer om de vraagtekst langer te compileren.

(2) de grote tussenvoegselblokken die unie of waarden (), (), () gebruiken patronen zitten in een HOOP in geheugen, dan dequeued van HOOP op slecht tussenvoegsel -.

(3) de de parameters bepaalde van Vragen zijn goed.  Beter als u hen groepeert in zeg 10 tussenvoegsels, maar elk tussenvoegsel zou (bij het voorbeeld hierboven) dan 20 parameters in het 10 partijtussenvoegsel vereisen.

(4) ** Geen test hierboven, maar mijn gissing ** die SP voor het tussenvoegsel gebruiken, b.v. usp_insert is @a, @b die het tussenvoegsel en uw bulkmanuscript doet van de vorm

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

zo snel zoals de De parameters bepaalde van tussenvoegsels zijn zal die sp_executesql gebruiken, omdat SP eens slechts en re-used# wordt gecompileerd.

# - wat de bron van parameter het snuiven problemen…. is
Andere oplossingen  
 
programming4us programming4us