Avatar billede maxikoll Nybegynder
15. april 2003 - 18:42 Der 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.
Avatar billede disco_keld Nybegynder
15. april 2003 - 18:48 #1
Hvad vil du opdatere og hvorfor?

Bruger du Stored Procedures nu?

Mvh

DK
Avatar billede maxikoll Nybegynder
15. april 2003 - 18:52 #2
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.

Sådan noget i den dur.
Avatar billede disco_keld Nybegynder
15. april 2003 - 19:02 #3
Når du siger op mod hinanden, mener du så at de Relatere til hinanden tabellerne?

Updatere du din Db tabeller igennem et web interface, eller hvordan?

SPROC's (stored procedures) er alt for fede maxikoll!

I stedet for alt det inline SQL kode, så kalder man bare SPROC'n navn i command objektet!

koder du kun Classic ASP eller.........?
Avatar billede maxikoll Nybegynder
15. april 2003 - 19:03 #4
Ja, classic ASP i dette projekt.

Op imod hinanden kunne simpelt være at SELECT * fra tabel1 og så tjekke data derfra i en SELECT * fra tabel2.
Avatar billede terry Ekspert
15. april 2003 - 20:07 #5
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!
Avatar billede maxikoll Nybegynder
15. april 2003 - 20:15 #6
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.
Avatar billede terry Ekspert
15. april 2003 - 20:27 #7
WHY do you need two tables,why dont you put the NEW data directly into table1?
Avatar billede maxikoll Nybegynder
15. april 2003 - 20:31 #8
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?
Avatar billede terry Ekspert
15. april 2003 - 20:33 #9
Why dont you use DTS to import the text file into table1? It sounds like your making work for yourself doing things twice :o)
Avatar billede maxikoll Nybegynder
15. april 2003 - 20:36 #10
Sorry, what's DTS :)

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
Avatar billede terry Ekspert
15. april 2003 - 20:41 #11
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.
Avatar billede renesvane Nybegynder
16. april 2003 - 08:21 #12
Hejsa

Det er ikke noget problem at lave en sådan forespørgsel. Du kan lave det gennem Stored Procedures, eller bare gennem embedded SQL fra din ASP side.

Det er heller ikke noget problem at bruge IF ELSE ting i SQL. f.eks.

IF Kolonne1 = 'Y'
  BEGIN
    Kolonne1 = 'N'
  END
ELSE
  BEGIN
    Kolonne1 = 'P'
  END

Hvis du kommer med et mere konkret eksempel fra din kode, skal jeg nok hjælpe dig med syntaksen
Avatar billede janus_007 Nybegynder
16. april 2003 - 09:28 #13
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)
Avatar billede renesvane Nybegynder
16. april 2003 - 09:31 #14
Problemet er at uniqueID ikke må ændres, og det vil det gøre når tabellen droppes..
Avatar billede terry Ekspert
16. april 2003 - 10:11 #15
renesvane, are you saying you have two unique columns? If you only have one unique then how do you know what record to update?

When a record in table1 gets changed do you change a field so that its possible to see what records are changed or what?
Avatar billede renesvane Nybegynder
16. april 2003 - 10:13 #16
Undskyld jeg ikke lige fik sagt at det ikke er mig, der stiller spørgsmålet.

Jeg refererer bare til den forklaring maxikoll gav tidligere i et indlæg
Avatar billede janus_007 Nybegynder
16. april 2003 - 10:19 #17
Hvis tabellen skal være identisk skal den også have de samme id's og så betyder det jo intet at den droppes!!
Avatar billede terry Ekspert
16. april 2003 - 10:23 #18
OK renesvane :o) maxikoll can you comment please?
Avatar billede maxikoll Nybegynder
16. april 2003 - 11:43 #19
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.
Avatar billede janus_007 Nybegynder
16. april 2003 - 11:53 #20
Okay.. jaja hvis det er på den måde og det bare skal laves en smule pro, så brug merge replikering ;O)

Hvordan vedligeholder du identity i begge tabeller ??
Avatar billede janus_007 Nybegynder
16. april 2003 - 11:54 #21
Prøv evt. at poste din asp kode der gør det essentielle ved updaten, måske det kan være nemmere at forstå så!
Avatar billede maxikoll Nybegynder
16. april 2003 - 11:56 #22
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.
Avatar billede maxikoll Nybegynder
16. april 2003 - 12:01 #23
Example when using the text as source (import / new data)

Set myFileObject = Server.CreateObject("Scripting.FileSystemObject")
Set Fil = myFileObject.OpenTextFile("c:\Inetpub\wwwroot\Import\data.txt")

Fil.SkipLine

Do While Not Fil.AtEndOfStream

    strRecord = Fil.ReadLine

    CVR = Mid(strRecord, 2, 8)
    NewName = Mid(strRecord, 524, 25)

    Con.Execute("UPDATE test SET Name = '" & NewName & "' WHERE CVR = '" & CVR & "'" + adExecuteNoRecords)
   
Loop
Fil.Close


This just takes 24 hours looping the 200000 posts, but it's not the import that's slow, it's for the SQL to find the ID and then update, loop it...

But doing it with two tables is just as slow... Why I hoped it could be done in SQL only or in a totally new way.
Avatar billede janus_007 Nybegynder
16. april 2003 - 12:27 #24
Har du index på CVR ??, hvis ikke så sæt det på :O)

Jeg kan også se du kalder UPDATE n-gange som udgør dit linecount i data.txt! Måske du skulle overveje at lave en noget større update eks.vis:

Set myFileObject = Server.CreateObject("Scripting.FileSystemObject")
Set Fil = myFileObject.OpenTextFile("c:\Inetpub\wwwroot\Import\data.txt")

Fil.SkipLine

Do While Not Fil.AtEndOfStream

    strRecord = Fil.ReadLine

    CVR = Mid(strRecord, 2, 8)
    NewName = Mid(strRecord, 524, 25)
    strSQL = strSQL & "UPDATE test SET Name = '" & NewName & "' WHERE CVR = '" & CVR & "';"

   
Loop
Fil.Close
    Con.Execute(strSQL)

Der er muligvis en begrænsning for antal kb der kan sendes afsted til executen, men det må du lige fifle lidt med :O)
Avatar billede janus_007 Nybegynder
16. april 2003 - 12:43 #25
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
Avatar billede maxikoll Nybegynder
16. april 2003 - 13:31 #26
Jeg prøver at rodde lidt med det, vender tilbage med et resultat eller flere spørgsmål nok - tak for hjælpen på forhånd.
Avatar billede maxikoll Nybegynder
16. april 2003 - 14:26 #27
Hvorfor kan man ikke det her i MS SQL, man kan nemt i Access :)

UPDATE    dbo.table1 INNER JOIN
                      dbo.table2ON (dbo.table1.ID1 = dbo.table2.ID1) AND (dbo.table1.ID2 = dbo.table2.ID2)
SET              dbo.table1.Name = dbo.table2.Name
Avatar billede maxikoll Nybegynder
16. april 2003 - 14:26 #28
eller

UPDATE dbo.table1 INNER JOIN
      dbo.table2 ON (dbo.table1.ID1 = dbo.table2.ID1) AND (dbo.table1.ID2 = dbo.table2.ID2)
SET    dbo.table1.Name = dbo.table2.Name
Avatar billede maxikoll Nybegynder
16. april 2003 - 14:31 #29
Er det noget med at man ikke kan lave en opdaterings forespørgsel i SQL på samme måde? Hvordan kan man ellers gøre det hvis det er :)
Avatar billede janus_007 Nybegynder
16. april 2003 - 14:42 #30
Der er nu ikke noget i vejen med dit join, det er helt legalt!.

Det er din SET    dbo.table1.Name = dbo.table2.Name, jeg går ud fra du vil ændre navn ?
i mssql skriver du :
sp_rename gammeltnavn, nytnavn
Avatar billede janus_007 Nybegynder
16. april 2003 - 14:44 #31
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
Avatar billede maxikoll Nybegynder
16. april 2003 - 14:45 #32
Jeg vil tage værdien fra kollonen Name i table1 og smide i kollonen Name i table2.
Avatar billede maxikoll Nybegynder
16. april 2003 - 14:46 #33
Når jeg laver den der From, brokker den sig over det. Prøver lige igen
Avatar billede maxikoll Nybegynder
16. april 2003 - 14:47 #34
"The Query Designer does not support the Optional FROM clause SQL construct."
Avatar billede janus_007 Nybegynder
16. april 2003 - 14:52 #35
Hvilken version SQLserver bruger du ?

update Table1 set Table1.name = Table2.name
inner join Table2 on Table1.CVR = Table2.CVR
where Table2.columnupdated = 1
Avatar billede maxikoll Nybegynder
16. april 2003 - 14:56 #36
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.

"Unable to parse query text."
Avatar billede janus_007 Nybegynder
16. april 2003 - 15:00 #37
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
Avatar billede maxikoll Nybegynder
16. april 2003 - 15:06 #38
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?
Avatar billede janus_007 Nybegynder
16. april 2003 - 15:20 #39
ja !!
create proc somename
as

blablabla


med inden du gør det så skal du kunne udføre updaten i query analyzeren ?? - Du har ikke svaret på om du bruger sådan en ??
Avatar billede maxikoll Nybegynder
16. april 2003 - 15:24 #40
Jeg sidder med SQL Server Enterprice Manager - ved ikke om den ligger der i - eller hvis hvor.
Avatar billede maxikoll Nybegynder
16. april 2003 - 15:28 #41
Den kan nemt oprettes som Stored P... ved bare ikke hvordan jeg kører den :D
Avatar billede janus_007 Nybegynder
16. april 2003 - 15:28 #42
Jamen du skal jo bruge den jeg sagde!!
EM funker ikke til den slags :O)

QueryAnalyzeren følger med, så mon ikke den ligger der et sted?
Avatar billede janus_007 Nybegynder
16. april 2003 - 15:29 #43
Hvis du skal kører en sp, så skriver du bare navnet i sql vinduet

exec somename
Avatar billede maxikoll Nybegynder
16. april 2003 - 15:34 #44
i sql vinduet, snakker vi også enterprise manageren? :/
Avatar billede maxikoll Nybegynder
16. april 2003 - 15:35 #45
nu fandt jeg analyseren, der virker din kode fint! :)
Avatar billede janus_007 Nybegynder
16. april 2003 - 15:35 #46
jeps.. Det var det jeg mente *S*
Avatar billede maxikoll Nybegynder
16. april 2003 - 15:39 #47
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 :)
Avatar billede janus_007 Nybegynder
16. april 2003 - 15:41 #48
Jamen det var jo det jeg sagde :O)

Det er lynsnapt at bruge en update join *S*
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