15. april 2003 - 18:42Der er
46 kommentarer og 2 løsninger
Hurtigste måde at køre en opdatering på i SQL?
Situationen er den at jeg har 2 tabeller med hver lidt under 200000 poster i og begge tabeller er stort set ens med data, men der kan være små forskelle. Derfor vil jeg gerne køre en opdatering eller noget smartere, der f.eks. kunne være at kun på SQL serveren køre en eller anden form for SELECT der tjekker og hvis opdaterer et felt med true/false. Kan det lade sig gøre? At lave noget lignende det, hvor man evt. skal bruge noget som IF ELSE osv som ASP har. Jeg vil bare tro at hvis SQL serveren kan klare det alene så vil det gå SÅ meget hurtigere. Kører jeg noget opdatering via ASP så tager det 24 timer :) for at tage 200000 poster. Dette skulle helst kunne gøres meget hurtigere. Jeg er lidt lost, så alle foreslag tager jeg gerne imod.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Lige nu bruger jeg ASP til at køre de 2 tabeller op imod hinanden, det er også acceptabelt, men så snart man skal køre en UPDATE i ASP så tager det 24 timer. Jeg er ikke så meget inde i Stored Procedures, men det var den vej jeg havde tænkt mig at gå.
F.eks. har jeg 2 tabeller med næsten ens data, de køres op imod hinanden og finder den noget der er nyt f.eks. skal den markere den som ny i den ene tabel.
mixikoll>I dont quite understand what fields your trying to update and when? Are you trying to make sure both tables are the same or what? If so, wht are they different? An idea as to what your doing may help us give some suggestions!
Ok, table1 and table2 is almost identical, but lets say table2 has newer data. Now... My system uses table1 and users are using it when I run the update perhaps. Therefore I have all the new data in another table2, matching table1 in design. I want to run the two tables up against each other to find out where there's new data, updates to table1... These updates has to be updated since I can't delete anything. That would cause a loss of the uniqueID or if they get a new ID all goes wrong. This update could easyly be done in plain ASP with alot of IF ELSE END IF and so on, but it's soooooooo slow.
I chose to put the new data into a new table since I guessed that updating through SQL server only would be the fastest way. Updating directly from the source file (a 600MB text file) and into table1 takes 24 hours. It has to find the uniqueID, then update - and so on. Although I made a view with only what I needed it took this long. I'm kinda out of ideas of what's the fastest way to do this update... Hoping on SQL only is wrong?
The text file isn't comma seperated or anything like it, it consists of one long line of over 2500 characters. I then say that from 1-8 is this, 9-20 is that and so on. DTS is importing through SQL manager or? The only important thing is that if the data has been changed by a user, new data can't be allowed to overwrite this - and if there's totaly new data it makes a new record for it.
That's why I used ASP to import and check but damn it's slow :D
DTS (Data Transformation Services) You can use it to import/export data into your database. If you take a look at Books Online for SQL server there is lots of help on this subject. Another solution is Triggers.
Hejsa.. Hvis du bare skal have synkroniseret Tabel1 med Tabel2 er det såre simpelt. Jeg vil foreslå dig at droppe tabellen og lave en select into, hvis du vælger at update tabellen vil det for det første tage meget længere tid, det vil højst tænkeligt fylde transaktionsloggen (afhængig af din rmodel) og sidst men absolut ikke mindst så vil det locke din tabel unødigt lang tid.
Gør sådan her. Table1 skal synkroniseres med ny data fra Table2
DROP TABLE Table1 SELECT * INTO Table1 FROM Table2
Med 200000 poster vil jeg regne med det tager ca. 30sek (alt afhængig af hardware og størrelse)
Imagine that table1 is the origional table with the 200000 post... After some time there's an update and I get the 200000 posts again. BUT this time, perhaps post ex. 143253 has been deleted in the update, since it doesn't excist anymore. Also if I change a post/record manually I ex. set a coloum with a bit to 1, indicating that it's been updated by a user. If so I can't overwrite it with the new updated data. These are just examples to show that table1 can't be dropped. They also have their unique ID's which are linked to other tables... That's why I need to update table1 with more than just a drop or overwrite. I need to check for some values and if so, do this or that. Doing this in ASP (on the same server as the SQL), takes 24 hours or more for it to check and update... and so on. This was done from the import file directly. I then thought it would be better if I took the new data, imported it to a matching table in design, and then ran the updates on the SQL server only, going around any ASP code. I just don't know how to "code" in SQL only, and where I should do it.
renesvane types that it's possible to do some IF - END, BEGIN and so on... this could be the way to go, but an update is probably still something that takes long I guess.
table2 can be dropped after the update, but table1 has an UniqueID (this must NOT be changed) and another ID, like a company has a CVR number. It's the second ID I use to check up against - the CVR or what it may be... As long as the auto ID isn't changed.
For jeg lige skal forstå det helt korrekt, vil det så være lad sig gørligt hvis du overfører alle rækker fra Tabel2 til Tabel1 med tilhørende unique id's, herefter kan man droppe Tabel2 og.. ?? Hvis det kun er et problem med identity, så kan det også snildt løses så de beholdes :O)
Eller hvad med en update join ?
update Table1 set Table1.name = Table2.name from Table1 inner join Table2 on Table1.CVR = Table2.CVR where Table2.columnupdated = 1
Nåja... selve update på den måde, skal gøres som jeg før viste !! update Table1 set Table1.name = Table2.name from Table1 inner join Table2 on Table1.CVR = Table2.CVR where Table2.columnupdated = 1
SQL2000, men hvorfor kan jeg ikke lave en opdaterings forespørgsel af en art når det drejer sig om 2 tabeller. Skal man gøre det i en Procedure eller hvordan? Laver man det i en Query på noget, eller i et view så får man slag lige meget hvad, også med den du lige har skrevet.
Sært... Bruger du QueryAnalyzeren ?? og hvis det er sql2000, så er det stadigvæk: update Table1 set Table1.name = Table2.name from Table1 inner join Table2 on Table1.CVR = Table2.CVR where Table2.columnupdated = 1
Hvis jeg bare vælger Query på noget og skriver sætning, paster den osv. Så er der intet/ingen af dem jeg får lov til. Man kan så heller ikke gemme en opdaterings forespørgsel som i Access, så skal man bruge noget Stored Procedure her?
Nu lykkedes det at exec den, det tog et lille minut at loope de 200000 poster - lidt bedre end 24 timer... Jeg vil lave den færdig så den gør som den skal og siger tak for hjælpen og alle de hurtige svar, deler lidt point ud :)
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.