25. juni 2012 - 09:32Der er
10 kommentarer og 1 løsning
Importer og erstat tabel - bedste praksis?
Jeg har brug for en ledetråd til hvordan man bruger C# LINQ til at importere data til og fuldstændigt erstatter indholdet i en tabel i en MS SQL database med det man importerer (samtidigt med at andre processer kan læse i tabellen uforstyrret)? Noget i stil med: 1. Lav en tom kopi af tabellen. 2. Udfyld tabel kopien med importeret data. 3. Erstat den originale tabel med kopien.
1. med SMO (SQL Management Objects) kan du kopiere strukturen over i en ny tabel
2. Derefter importere du med SqlBulkCopy objekter direkte ind i din nye tabel
3. Derefter renamer du tabellerne.
---
Du vil få en del udfordringer hvis man kan lave ændringer i tabellen mens du importere, fordi, hvad skal der ske med ændringerne ?
såfremt der er specielle rettigheder på tabellen og constraints, skal disse overføres og opdateres under/efter flytningen. eventuelt kan man DISABLE CONTRAINTS og ENABLE dem bagefter igen.
alt i alt er det ikke nogen nem opgave - men det kan lade sig gøre :)
det kunne bare godt være der var lidt ting du gerne vil have uddybet :) - evt. mens du kigger på det.
Men du kan bare spørge senere selvom spørgsmålet er lukket
Et par tips med på vejen:
(2) SQL Databasens log indstillinger skal sættes til Bulk Log eller Simple Log, for at øge hastigheden
(2) hvis du har millioner af rækker, er den hurtigste måde at bruge BulkCopy på at: først prøve med 10.000 rækker, hvis den fejler, dele op i bidder af 100x100 og prøve med dem. Dem som så fejler bidder man op i 100x1 som så derved mindsker antallet af retry's
Hvorfor bruge C# Linq?, hvilken Sql Server version bruger du?
Montago -> Jeg tvivler stærkt på at det går hurtigere at ændre recovery modellen til simple, alle transaktioner skal skrives alligevel, men bulk logging er god :)
Den resterende del skal laves i C# - derfor vil jeg bruge linq. Der er ingen sql-server version endnu, men bliver sansynligvis 2008. Skrive hastigheden er ikke så vigtig.
Der findes ikke god pure linq måde at gøre dette på. Linq er jo også bare lidt sukker rundt om rugbrødet.
Hvis du tænker på Linq2Sql, L2S eller hvad den nu bliver kaldt ude i byen. Så begynd at løbe nu ... det er LANGSOMT. 1 row, 1 insert. LØB LANGT VÆK.
SqlBulkCopy er den eneste vej frem hvis du skal lave mange inserts.
Skal du lave insert og update ... så kig på MERGE i sql 2008 og frem, men det kræver lidt SQL skrevet i hånden, men kan bestemt anbefales(bruge det selv)
Du får ikke overstående til at køre godt ved at bruge en ORM til at lave store batch inserts. ( Måske NHibernate har noget, ved det ikke )
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.