Fråga : Enkelt mycket långsamt mellanläggsmeddelande

Hi Folks,

I've fick ett mycket enkelt mellanläggsmeddelande, som follows

Insert in i MyTable (StringID, StringText)
select 0, FACKLIG
select 1, FACKLIG
select 2, FACKLIG
select 3, FACKLIG
select 4,
select 5, FACKLIG
select 6, FACKLIG
select 7, FACKLIG
select 8,
select 9, FACKLIG
select 10, FACKLIG
select för N'123452.46093750'<-br/> för N'468330.90625000'<-br/> för N'152484.99609375'<-br/> för N'476937.99609375'<-br/> för br/> för N'30 D6-5FFC'< FACKLIG för N'AE79--9EED'
för N'10.5.0.75'<-br/> för N'00--21-9B-01-5C-C4'
för br/> för N'Microsoft XPS dokumentWriter'< FACKLIG för N'ActiveReports 6 '
för N'6.0.2250.0'<-br/> 11 UNIONER för

The för N'24'<-br/> ...... bär på för 1800 rekord, och varje meddelande är brutet ut in i grupperar av 100, precis så mig slår inte några begränsar på meddelande storleksanpassar eller numrerar av mellanlägget för unions.

This tar 4 understöder för att sätta in 1800 ror, why är detta så långsamt? (Ms-gormanden på TPC figurerar omkring etc., säkert det senast, och mest stor kunde klara av mer, än 450 ror per understöder!!),

The bordlägger har inga index, inga förhållanden:

skapar bordlägger MyTable
(
inte ogiltiga StringID int, nvarchar (4000) inte ogiltig
) för
StringText

I har ändring databasen logga till ”enkelt”, dess spring 2008 för Sql-bärareupplaga på en kvadrat kärnar ur 2.66 boxas med 4GB RAMMAR. Ingenting är annars rinnande på det boxas undantar visuellt hjälpmedelstudion 2010.

I har försökt”) värderar (”i stället för valt och mig har försökt det nya kommat baserade syntaxen 2008 multipelmellanlägget - alla samma idéer för det sql-för

Any? Något försök?
" klar "

Svar : Enkelt mycket långsamt mellanläggsmeddelande

Är här vad nollställer DBEN för varje testar.
Allt testar är 10000 mellanlägg.

dbccfreeproccache
dbccdropcleanbuffers
fastställd nocount på

;
tappa bordlägger MyTable3

      Skapa bordlägger MyTable3
      (
            Inte ogiltiga StringID int,
            StringText nvarchar (4000) inte ogiltigt
      )
;
=========================
test1 - union bildar, ett stort meddelande (10000 sköt ett) som frambrings using de nedanföra och några manuella tweaksna

förklara @iint-uppsättningen @i=1
stund@ien <� 10001="">börjar
trycket ”väljer ”+right (@i, 10) +”, varchar n-''' +convert ((max), newid ())+ ''' union”;
uppsättning @i=@i+1
avsluta
=========================

sätt in MyTable3
välj 1, N'A0B8022B--CFE9-43C9-97E5-DE89822AC32Funion
välj 2, N'F87C8670--1339-458E-8F1C-C2E9B717F4AAunion
välj 3, union för N'35 ACFFFC-52CF-4805-8C30-A4EB41F3A218
..........,
välj 10000.

Time - 7 minutes+ som dödas

=========================
test2 - ALL union bildar
=========================

Time - snabbare än över.  SORTERA därefter DISTINKT krävs inte.  Union på dess eget gör ett distinkt

=========================
test3 - ALL union bildar, 100 per grupperar, avskilt by;
=========================

Time - även snabbare.  Varje grupperar begås och tar inte bruk mycket in RAMMAR.  Dessutom Queryoptimizeren spenderar inte mycket tid på långa queries.  QO-tid går upp exponentially för långa queries.

=========================
truncate test4 - bordlägga, sätt in igen (efter från test3, utan nollställt)
=========================

Time - snabbare än 3.  QO måste inte att göra any att planera, alla 100 [queriesna för statisk elektricitet som] är kommande från, planerar cachen

=========================
test5 - using parameterised mellanlägg. QO planerar endast ett mellanlägg. Alla andra mellanlägg går planerar by
Mellanlägg som frambrings using

förklara @iint-uppsättningen @i=1
stund@ien <� 101="">börjar
mellanlägget MyTable3 för tryck”exec sp_executesql N '' värderar (@aen, @b) '', den n-'' @aen int, nvarchar @b (4000) '', @a='+-rätten (@i, 10) +”, varchar @b=N''' +convert ((max), newid ())+ '''';
uppsättning @i=@i+1
avsluta
=========================

Tagna Time - 6s! Snabbast.

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

Avslutningar

(1) Takes för Optimizer för Sql-serverQuery exponentially longer som sammanställer, längre querytexten.

(2) Stora mellanläggskvarter using union eller värderar (), (), () mönstrar sitter i en HÖG i minne, då dequeued från HÖG på mellanlägget - dåliga.

(3) Parameterized Queries är bra.  Förbättra, om du grupperar dem in i något att säga 10 mellanlägg, men varje mellanlägg som därefter skulle, kräver (för exemplet över) 20 parametrar i 10na grupperar mellanlägget.

** inget testa över, bara min gissning ** (4) Using en sp för mellanlägget, e.g usp_insert@a, @b, som gör, mellanlägget och din i stora partier skrivar är av bilda

execusp_insert 1, N'test text';
execusp_insert 2, N'test text';
etc.

ska var som fastar som de Parameterized mellanläggen using sp_executesql, därför att en SP sammanställas en gång endast och beträffande-used#.

nr. - som är källan av sniffaproblem för parameter….,
Andra lösningar  
 
programming4us programming4us