/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Q: Hvis Cursor er for langsomt... Hvad så?
Fra : ///JJ


Dato : 02-06-04 12:08

Jeg har følgende tabel:

rownumber - projectnumber - subproject - valueX

Den indeholder over 100.000 rækker med data. Jeg ønsker at minipulere data
således at der for hvert "projectnumber" kun findes et "subproject" med en
værdi i "valueX". Eks:

rownumber - projectnumber - subproject - valueX
10 - 200 - TypA - 5
11 - 200 - TypA - 5
12 - 200 - TypB - 8
13 - 200 - TypB - 8

Skal laves til:

rownumber - projectnumber - subproject - valueX
10 - 200 - TypA - 0
11 - 200 - TypA - 5
12 - 200 - TypB - 0
13 - 200 - TypB - 8

Det er fulstændig ligegyldigt hvilken af "subproject"-rækkerne der får
nulstillet sin valueX.

Pt. bruger jeg en Cursor-løkke der løber tabellen igennem, men det tager alt
for lang tid (langt over en time).

Hvad kan jeg gøre i stedet? Alle råd modtages glædeligt.

PS. Jeg kan ikke lave om på måden data bliver samlet op til tabellen på.
--


Mvh
///JJ



 
 
///JJ (02-06-2004)
Kommentar
Fra : ///JJ


Dato : 02-06-04 12:15

///JJ wrote:

Min Cursor-løkke ser sådan ud:

DECLARE SagCursor CURSOR FOR
SELECT rownumber, type, Proj
FROM sagbehandlet

OPEN SagCursor
FETCH NEXT FROM SagCursor INTO @Rownumber, @Type, @Proj
WHILE @@FETCH_STATUS = 0
BEGIN
set @cm=(select min(x) from sagbehandlet where proj=@proj and x>0)
if not isnull(@cm,0)=0
begin
set @c =(select sum(x) from sagbehandlet s where @type=s.type and
proj=@proj)
if @c>@cm
begin
update sagbehandlet set x=0 where rownumber=@rownumber
end
end
FETCH NEXT FROM SagCursor INTO @Rownumber, @Type, @Proj
END
CLOSE SagCursor
DEALLOCATE SagCursor


Mvh
///JJ



Peter Lykkegaard (02-06-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 02-06-04 20:39


"///JJ" wrote

> Jeg har følgende tabel:
>
> rownumber - projectnumber - subproject - valueX
>
> Den indeholder over 100.000 rækker med data. Jeg ønsker at minipulere data
> således at der for hvert "projectnumber" kun findes et "subproject" med en
> værdi i "valueX".

Update JJ_Table SET ValueX = 0 WHERE RowNumber Not IN
(Select Max(Rownumber) from JJ_Table Group by ProjectNumber, SubProject)

Ville det du?

- Peter



///JJ (02-06-2004)
Kommentar
Fra : ///JJ


Dato : 02-06-04 21:43

"Peter Lykkegaard" <polonline@hotmail.com> wrote in message
news:40be2cca$0$532$edfadb0f@dread14.news.tele.dk...
>
> "///JJ" wrote
>
> > Jeg har følgende tabel:
> >
> > rownumber - projectnumber - subproject - valueX
> >
> > Den indeholder over 100.000 rækker med data. Jeg ønsker at minipulere
data
> > således at der for hvert "projectnumber" kun findes et "subproject" med
en
> > værdi i "valueX".
>
> Update JJ_Table SET ValueX = 0 WHERE RowNumber Not IN
> (Select Max(Rownumber) from JJ_Table Group by ProjectNumber, SubProject)
>
> Ville det du?

GENIALT! Tak til både dig og Kristian!
Jeg valgte din løsning da jeg vurderede den indeholdt mindst matematik for
sql-serveren.

--


Mvh
///JJ



Peter Lykkegaard (02-06-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 02-06-04 21:55


"///JJ" wrote

> GENIALT! Tak til både dig og Kristian!

Når du fedter med databaser så glem hvad du har lært i programmering mht
iteration etc
Du skal have fat i dine gamle matematikbøger og læse lidt på mængdelæren i
stedet

- Peter



///JJ (03-06-2004)
Kommentar
Fra : ///JJ


Dato : 03-06-04 02:15

Peter Lykkegaard wrote:
> "///JJ" wrote
>
>> GENIALT! Tak til både dig og Kristian!
>
> Når du fedter med databaser så glem hvad du har lært i programmering
> mht iteration etc
> Du skal have fat i dine gamle matematikbøger og læse lidt på
> mængdelæren i stedet

Jep - det kan jeg se - jeg tænker for meget i de vante baner.
--


Mvh
///JJ



Kristian Damm Jensen (03-06-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 03-06-04 12:12

"///JJ" <nospam@tdcadsl.dk> wrote in message news:<40be3bd6$0$181$edfadb0f@dtext01.news.tele.dk>...
> "Peter Lykkegaard" <polonline@hotmail.com> wrote in message
> news:40be2cca$0$532$edfadb0f@dread14.news.tele.dk...
> >
> > "///JJ" wrote
> >
> > > Jeg har følgende tabel:
> > >
> > > rownumber - projectnumber - subproject - valueX
> > >
> > > Den indeholder over 100.000 rækker med data. Jeg ønsker at minipulere
> data
> > > således at der for hvert "projectnumber" kun findes et "subproject" med
> en
> > > værdi i "valueX".
> >
> > Update JJ_Table SET ValueX = 0 WHERE RowNumber Not IN
> > (Select Max(Rownumber) from JJ_Table Group by ProjectNumber, SubProject)
> >
> > Ville det du?
>
> GENIALT! Tak til både dig og Kristian!
> Jeg valgte din løsning da jeg vurderede den indeholdt mindst matematik for
> sql-serveren.

Du skal være opmærksom på, at vore to løsninger ikke er identiske.
Peters løsning indeholder ikke noget join, og der er derfor ikke noget
sammenhæng mellem den værdi Max(rownumber) leverer og den række du
opdaterer. I min løsning er der grupperet i forhold til det
projekt/subprojekt du opdaterer.

VH
Kristian

///JJ (03-06-2004)
Kommentar
Fra : ///JJ


Dato : 03-06-04 12:50

Kristian Damm Jensen wrote:
>>> Update JJ_Table SET ValueX = 0 WHERE RowNumber Not IN
>>> (Select Max(Rownumber) from JJ_Table Group by ProjectNumber,
>>> SubProject)

> Du skal være opmærksom på, at vore to løsninger ikke er identiske.
> Peters løsning indeholder ikke noget join, og der er derfor ikke noget
> sammenhæng mellem den værdi Max(rownumber) leverer og den række du
> opdaterer. I min løsning er der grupperet i forhold til det
> projekt/subprojekt du opdaterer.

Der er også en group by i Peters forslag, omend den ikke bruges til at joine
med, så sørger den for at kun de deri fundne rækker opdateres. Løsningen
virker også tilfredsstillende - mener du der er risiko for fejl under
særlige omstændigheder?
--


Mvh
///JJ



Kristian Damm Jensen (03-06-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 03-06-04 19:37

"///JJ" <nospam@tdcadsl.dk> wrote in message news:<40bf1071$0$158$edfadb0f@dtext01.news.tele.dk>...
> Kristian Damm Jensen wrote:
> >>> Update JJ_Table SET ValueX = 0 WHERE RowNumber Not IN
> >>> (Select Max(Rownumber) from JJ_Table Group by ProjectNumber,
> >>> SubProject)
>
> > Du skal være opmærksom på, at vore to løsninger ikke er identiske.
> > Peters løsning indeholder ikke noget join, og der er derfor ikke noget
> > sammenhæng mellem den værdi Max(rownumber) leverer og den række du
> > opdaterer. I min løsning er der grupperet i forhold til det
> > projekt/subprojekt du opdaterer.
>
> Der er også en group by i Peters forslag, omend den ikke bruges til at joine
> med, så sørger den for at kun de deri fundne rækker opdateres. Løsningen
> virker også tilfredsstillende - mener du der er risiko for fejl under
> særlige omstændigheder?

Nej.

Jeg havde misforstået hvordan Peters løsning virker.

Kristian

Peter Lykkegaard (03-06-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 03-06-04 20:57


"Kristian Damm Jensen" wrote
> "///JJ" wrote

> > Der er også en group by i Peters forslag, omend den ikke bruges til
at joine
> > med, så sørger den for at kun de deri fundne rækker opdateres.
Løsningen
> > virker også tilfredsstillende - mener du der er risiko for fejl
under
> > særlige omstændigheder?
>
> Jeg havde misforstået hvordan Peters løsning virker.
>
Jeg må indrømme at jeg lavede nogle tests med en hel del records før jeg
turde slippe den løs

- Peter



Kristian Damm Jensen (02-06-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 02-06-04 21:14

"///JJ" <nospam@tdcadsl.dk> wrote in message news:<40bdb520$0$186$edfadb0f@dtext01.news.tele.dk>...
> Jeg har følgende tabel:
>
> rownumber - projectnumber - subproject - valueX
>
> Den indeholder over 100.000 rækker med data. Jeg ønsker at minipulere data
> således at der for hvert "projectnumber" kun findes et "subproject" med en
> værdi i "valueX". Eks:
>
> rownumber - projectnumber - subproject - valueX
> 10 - 200 - TypA - 5
> 11 - 200 - TypA - 5
> 12 - 200 - TypB - 8
> 13 - 200 - TypB - 8
>
> Skal laves til:
>
> rownumber - projectnumber - subproject - valueX
> 10 - 200 - TypA - 0
> 11 - 200 - TypA - 5
> 12 - 200 - TypB - 0
> 13 - 200 - TypB - 8
>
> Det er fulstændig ligegyldigt hvilken af "subproject"-rækkerne der får
> nulstillet sin valueX.
>
> Pt. bruger jeg en Cursor-løkke der løber tabellen igennem, men det tager alt
> for lang tid (langt over en time).
>
> Hvad kan jeg gøre i stedet? Alle råd modtages glædeligt.
>
> PS. Jeg kan ikke lave om på måden data bliver samlet op til tabellen på.

update T
set valueX = 0
where valuesX <
(select max(valueX)
from T T2
where T2.projectnumber = T.projectnumber
and T2.subproject = T1.subproject
group by T2.projektnumber, T2.subproject)

Med et ordentligt index, burde det ikke tage lang tid.

OBS. Afhængig af databasesystem skal self-joins i forbindelse med
updates udføres forskelligt. Jeg mener, at ovenstående overholder
ANSI-standarden; det er der til gengæld ikke ret mange
implementationer der gør.

VH
Kristian

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste