Man kan stille spørgsmålstegn for hvilken af de to modeller der er hurtigst.
Den første vil altid afvikle to statements: en select og en update, eller en select og en insert.
Den anden vil kun afvikle ét statement, hvis række findes i forvejen, og to hvis ikke den gør. Ulempen kan være, hvis SQL Serveren går ind og låser nogle ressourcer idet update'n afvikles. Hvis den gør det, er den anden model potentielt mere ressourcekrævende end den første.
Vær obs på at der ved store datamængder vil være meget langsomt hvis I bruger cursors til at løbe igennem hver enkelt record. Det kan betale sig at f.eks. med en temporær hjælpetabel holde styr på de records der skal opdateres, og derefter linke sig til denne hjælpetabel ved én Update sætnign og én insert sætning. Nekeltvis behandling af records ved hjælp af cursors tager oftest mange ganger så langt tid som bulk behandling af store mængder data.
lorentsny ... nu kommer jeg lidt i tvivl for det drejer sig om et par hundrer rækker hvergang der skal opdateres/indsættes. Så rent performance mæssigt skal jo bruge en hjælpe tabel. Men hvordan skal dette gøres?
jeg har en tabel med 3 kollonner: ID A B
1. jeg henter alle elementer der har ID = 10 .. det kan dreje sig om feks 50 rækker. 2. Indsætter dem i hjælpe tabel.
Det lyder lidt som om du ikke har et specielt godt design, hvis du skal lave sådan lidt tvivlsomme transactioner. Hvad er det du gerne vil opnå og i hvilken sammenhæng?
Det er faktisk en enkelt tabel det drejer sig om. Tabellen benyttes til at registere "Deltager til arrangement". Det vil sige at de tre kolloner i tabellen svarer til: ID = brugeren ID A = Mødenavn B = Ja/nej
Hvis der antages 10 møder en person allerede skal opdateres, og 5 nye møder der skal indsættes i databasen. tallene 10 og 5 er bare eksempler i praksis vil det nok dreje sig om større tal. Det er en forsimplet forklaring men håber at det giver mening.
Hvis det kun drejser sig om 250 rækker, tror jeg ikke du skal være bekymret for performance ved at bruge cursors. Behovet er større ved 10.000+ rækker. Hvis du har en hjælpetabel, kunne du lave en insert af ID i hjælpetabelle på alle rækker som du skal lave insert/update på. Derefter kan du ved at lave en join mellem hjælpetabel og din target tabel, opdatere alle rækker i hjælpetabellen, der eksisterer fra før i targettabellen, med en markering, således at du nu har en tabel hvor du ved hvilke records der skal opdateres, og dermed også hvilke rækker der skal insertes. Så joiner du din hjælpetabel med din source tabel, og laver update på alle rækker der findes, og derefter laver du én insert på alle nye rækker.
Du kna også klare noget tilsvarende uden hjælpetabel ved at bruge EXISTS, en så skal du joine source-tabellen med target tabel to gange, og hvis du har en rigtig stor target tabel, kan denne opertaion være mere krævende end at bruge en hjælpetabel.
Løsningen som jeg har beskrevet ovenfor er nok ikke nødvendig før du kommer op i source/target tabeller på over 1. mill records.
Synes godt om
Ny brugerNybegynder
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.