Oprettet fre. d. 28. december 2007 kl. 10:09:35

donkazz
donkazz (11.670 point. Point ude: 1.395)

Smarteste måde at opdatere flere hundredetusinde rækker på?

Hejsa!

Jeg har en tabel, som indeholder ca. 300.000 rækker. Hver række er tilknyttet et userId, som henviser til en anden tabel, nemlig brugertabellen.
Nu skal jeg så skrotte brugertabellen, da jeg har lavet en ANDEN brugertabel. De samme brugere findes i den nye tabel, blot med andre unikke id'er, så jeg skal på en eller anden måde have opdateret de 300.000 rækker til at passe på de nye id'er. ER der en snedig måde at gøre det på?
Umiddelbart ville jeg lave et udtræk i ASP og så loope igennem alle rækkerne, og så bruge en select case hvor jeg ser på det nuværende id, og så opdaterer rækken i forhold til hvad det skal være i stedet, men man skal ikke være meget skarp for at se at det godt kan blive en noget resourcekrævende operation, samt at faren for timeout jo så er der, hvilket ville være ret ærgeligt, skulle det ske midt i loopet..

What to do?

Skrevet fre. d. 28. december 2007 kl. 10:35:44| #1

keysersoze
keysersoze (310.141 point)
www.soze.dk
hvis du - som kategorien du har lagt spm i antyder - kører med mssql så hold asp langt væk fra denne operation. lav i stedet en stored procedure med mere eller mindre samme opbygning som du ville have gjort i asp (altså formentlig et loop) og pak det hele ind i en transaction så du kan køre rollback ved fejl.

Skrevet fre. d. 28. december 2007 kl. 10:41:15| #2

donkazz
donkazz (11.670 point)
Jeg forstod "stored procedure".. :-D

Kan du hjælpe mig lidt på vej? Hvad er en transaction i fagsprog?

Jeg har ingen anelse om hvordan jeg skal opbygge den stored procedure, jeg er mest vant til select from where ;-)

Skrevet fre. d. 28. december 2007 kl. 10:59:29| #3

keysersoze
keysersoze (310.141 point)
www.soze.dk
en transation er et slags alt eller intet scenarie - enten går alt godt (og databasen opdateres) eller også sker der slet ingenting (dvs ingen ændring af data indenfor transactionen). fx sådan (der er dog flere måder at stille det op på);

BEGIN TRY
  BEGIN TRANSACTION
    'DO THE WORK
    COMMIT TRANSACTION
END TRY

BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

En stored procedure i dit tilfælde vil nok ligne meget asp'en - du skal formentlig selecte fra en tabel (alm sql), lave et loop (lidt anderledes end asp), inserte data (alm sql), udtrække nyt id (alm sql) og update en anden tabel (alm sql). Tag en søgning på google og få lidt idé omkring opbygningen - så prøv at lav din SP og vend tilbage med evt spm :)

Skrevet fre. d. 28. december 2007 kl. 13:55:15| #4

donkazz
donkazz (11.670 point)
Nu har jeg siddet og luret på nettet, men jeg kan kun finde eksempler der looper igennem en tabel med en @counter, men på den måde kan jeg jo ikke selecte på rækkerne, da deres unikke id'er jo ikke nødvendigvis er fortløbende, f.eks. hvis der er slettet en række hist og pist...?

Skrevet fre. d. 28. december 2007 kl. 14:52:04| #5

hrc
hrc (33.287 point)
Du skal lave en cursor. Med den kan du loope gennem din gamle brugertabel som var det en for-next tingest. I øvrigt bør du nok krympe din log-tabel efter sådan en voluminøs operation. En stor (transaktions)log-fil er sløver din database og kan give "underlige" svartider; sådan en fil skal holdes nede.

Her et link (et godt link kan ikke gentages for tit) til TSQL 2005:

  http://msdn2.microsoft.com/ (...)

Mere specifikt skal du ind i dette link for at lære om cursorere:

  http://msdn2.microsoft.com/ (...)
  http://msdn2.microsoft.com/ (...)

(der er eksempler i bunden)

Humlen er dette:
DECLARE vend_cursor CURSOR
FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor
.. de glemte at vise at den også skal lukkes

Skrevet fre. d. 28. december 2007 kl. 15:15:56| #6

arne_v
arne_v (1.016.169 point)
Umiddelbart tænker jeg jo:

UPDATE stortabel SET stortabel.brugerid = (SELECT nybrugertabel.brugerid
FROM nybrugertabel,gammelbrugertabel
WHERE nybrugertabel.brugernavn=gammelbrugertabel.brugernavn AND gammelbrugertabel.brugerid=stortabel.brugerid)

Og enten lave det i en transktion eller på en kopi af den store tabel.

Skrevet fre. d. 28. december 2007 kl. 23:10:33| #7

hrc
hrc (33.287 point)
Man kan selvfølgeligt også bare lave det simpelt... Arnes eksempel skal nok virke (mon ikke han har prøvet det før?).

Skrevet lør. d. 29. december 2007 kl. 03:20:34| #8

arne_v
arne_v (1.016.169 point)
Jeg må bryde sammen og tilstå at jeg ikke har prøvet det af inden jeg postede.

Men jeg tror på ideen.

Skrevet man. d. 21. januar 2008 kl. 04:40:21| #9

arne_v
arne_v (1.016.169 point)
donkazz ?

Skrevet man. d. 21. januar 2008 kl. 15:32:05| #10

donkazz
donkazz (11.670 point)
Ja jeg forstod ikke meget af alt det her, men jeg må sætte mig mere ind i det via. de links I har givet mig når den store flyttedag kommer. :)

Tak for hjælpen, drop nogle svar, så ryger der points af til jer..

og undskyld den lange responstid, I ved vel hvordan det er når kuglerne flyver rundt om hovedet

Skrevet man. d. 21. januar 2008 kl. 22:33:51| #11

hrc
hrc (33.287 point)
Er jeg med i pointsene?

Skrevet man. d. 21. januar 2008 kl. 22:37:12| #12

donkazz
donkazz (11.670 point)
ja da... det er jo dine links jeg skal læse op på når jeg engang har luft i hovedet ;)

Skrevet man. d. 21. januar 2008 kl. 22:49:31| #13

arne_v
arne_v (1.016.169 point)
hvis den simple UPDATE virker

Skrevet tir. d. 22. januar 2008 kl. 09:46:05| #14

donkazz
donkazz (11.670 point)
Håber det er fair pointdeling, ellers må jeg skylde i banken ;)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Stored procedure og triggers

Oprettet den 22. maj 2012 kl. 10.11
htm giver 60 point for svar | Giv et svar »

SELECT by NEWID

Oprettet den 14. maj 2012 kl. 10.21
zentral giver 200 point for svar | Giv et svar »

Hvor finder jeg logfiler?

Oprettet den 14. maj 2012 kl. 10.07
hundevennen giver 100 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger