Avatar billede bdef Novice
02. august 2013 - 10:10 Der er 8 kommentarer og
1 løsning

Lock ved insert

Jeg har lavet et program som hælder data ind i en tabel på min database. Jeg hentede ingen fart ved at gøre programmet multitrådet, så nu tænker jeg at det kunne skyldes at SQL serveren kører table lock, ved insert.

Kan jeg ikke pille ved tabellen, så der kommer rowlock på istedet?
Avatar billede arne_v Ekspert
02. august 2013 - 12:40 #1
Databasen er noedt til at laase noget ved INSERT for at undgaa database korruption.

Og den kan ikke laase paa en raekke der ikke er indsat endnu.

Jeg tvivler dog paa at problemet er table lock.

Som hoved regel vil jeg forvente:

PC disk & loader tilgaar database lokalt => ingen forskel paa singlethreaded og multithreaded (fordi disken er flaskehalsen)

server IO system & loader tilgaar database over fysisk netvaerk => multithreaded hurtigere end single threaded (maaske op til dobbelt saa hurtigt)

Den klassiske maade at faa load performance op paa er at bundte flere inserts i en enkelt transaction. Det kan give ret store performance forbedringer - specielt naar kombineret med multithreaded.
Avatar billede bdef Novice
02. august 2013 - 12:51 #2
'Serveren' er en gammel maskine jeg havde i forvejen. Den har masser af CPU power i overskud, men disken er 'bare' en 250Gb / 7200 RPM disk. Jeg havde forventet en del mere end 125 inserts i sekundet, omend det næsten svarer til en rotation på disken.

Mit problem er at alle mine inserts kommer en af gangen, så jeg må nok leve med hastigheden.

Stik mig et svar.
Avatar billede arne_v Ekspert
02. august 2013 - 13:06 #3
Grundliggende betyder en transaction per insert at hver insert vil resultere i en fysisk IO for log og maaske en fysisk IO for data. Din disk kan kun goere saa meget som den kan.

En high performance database bruger mange spindler i RAID 10 (eller SSD nu om dage) og en RAID controller med write back cache med batteri backup i controlleren.
Avatar billede arne_v Ekspert
02. august 2013 - 13:06 #4
et svar
Avatar billede bdef Novice
03. august 2013 - 12:00 #5
Jeg kan så tilføje til tråden at skiftet til en USB stik jeg lige havde liggende har øget hastigheden fra ca. 8-10 mS/Row til 0,6-1,0ms/row, så det handler om skrivehastigheden på disken.

Læsning havde jeg intet problem med, da data fylder mindre en jeg har afsat RAM til. Dermed ligger alle data i RAM til læsningerne. Jeg havde nok bare troet at med så meget mere RAM end data, så skrev SQL serveren til RAM lageret og opdaterede på disken i klumper, når systemet var klar til det. Jeg kan dog godt se problemet ved det, hvis der sker et nedbrud.
Avatar billede arne_v Ekspert
03. august 2013 - 16:10 #6
Den eneste forsvarlige form for write back cache er i RAID controlleren med batteri backup i controlleren.
Avatar billede Syska Mester
05. august 2013 - 15:20 #7
Hvordan laver du dine inserts?

AqlBulkcopy fra .net kan hjælpe meget eller bare en sql merge.

Single sql inserts er mega langsomme.
Avatar billede arne_v Ekspert
06. august 2013 - 03:12 #8
Mange SQL INSERT i en enkelt transaktion performer langt bedre end en SQL INSERT per transaktion, da kun transaktion commit tvinger en fysisk disk write.

Bulkcopy (som jeg altid glemmer) gaar et skridt videre. Grundliggende saa er det det hele i en enkelt transaktion hvor kun meta data opdateringer skrives til transaktions log. Ved en normal bundtning af INSERT i en transaktion bliver alle opdateringerne stadig skrevet til disk bare i en stor klump. Med bulkcopy bliver klumpen ogsaa meget mindre.
Avatar billede Syska Mester
04. september 2013 - 18:03 #9
Det sker ikke hver dag man komme med råd som du har glemt Arne :-)

Men BulkCopy FTW ... derefter Merge ... og så INSERT i batches.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester