/ 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
table relation performance
Fra : Jimmy


Dato : 11-07-05 21:56

Hey

Jeg har altid fokuseret på nogle gode index og så stored procedures for at
optimere performance.

Nu er jeg blevet bekendt med at man i MS SQL Server kan lave relationerne på
tabellerne med det samme mellem PK og FK når man designer og opretter
tabellerne, således at cascading deletes og alt sådan noget følges ad.

Men er der noget performance at hente ved at gøre dette?

Hvis ja, hvor meget?

Hvordan laver man disse relationer mellem tabellerne?

Slipper jeg så får at lave joins i mine sql kald?

På forhånd tak.


--


Jimmy



 
 
Nikolaj Hansen (12-07-2005)
Kommentar
Fra : Nikolaj Hansen


Dato : 12-07-05 01:00

Jimmy wrote:
> Jeg har altid fokuseret på nogle gode index og så stored procedures for at
> optimere performance.

Stored procedures behøver ikke altid at gøre dine queries hurtigere -
tværtimod.

Hvis det er et råt select, der henter data ud til en ekstern app, hvor
du arbejder med dem vil et alm. query tit være hurtigere.

Stored procs. giver mening, hvis du har noget, der bedst behandles
internt i databasen, før et ResultSet sendes til clienten.

> Nu er jeg blevet bekendt med at man i MS SQL Server kan lave relationerne på
> tabellerne med det samme mellem PK og FK når man designer og opretter
> tabellerne, således at cascading deletes og alt sådan noget følges ad.

Du kan relatere data i alle relationelle DBMS systemer - deraf navnet


Pas på med cascading deletes!!!! Du kan hurtigt ende med med en tom
database . Igen der skal være en grund til at bruge det.

> Men er der noget performance at hente ved at gøre dette?

Nej, tværtimod. Relationer går imod performance. Hver gang du eks. laver
en insert i en Foreign key column skal den checkes i master tabellen.

Til gengæld giver det bedre datakvalitet, i det du enforcer dine
constraints.

Du bør altid relatere dine data, det er hele ideen i et relationelt DBMS.

> Slipper jeg så får at lave joins i mine sql kald?

Nej. Jeg tror ikke du forstår ideen bag relational constraints (foreign
/primary keys) helt.

http://www.utexas.edu/its/windows/database/datamodeling/dm/keys.html

mvh

Nikolaj Hansen

Jimmy (12-07-2005)
Kommentar
Fra : Jimmy


Dato : 12-07-05 11:20

"Nikolaj Hansen" <barnabasdk@gmail.com> skrev i en meddelelse
news:QGDAe.59389$Fe7.194538@news000.worldonline.dk...
> Jimmy wrote:
>> Jeg har altid fokuseret på nogle gode index og så stored procedures for
>> at
>> optimere performance.
>
> Stored procedures behøver ikke altid at gøre dine queries hurtigere -
> tværtimod.
>
> Hvis det er et råt select, der henter data ud til en ekstern app, hvor
> du arbejder med dem vil et alm. query tit være hurtigere.

Jamen belastningen på netværket vil være en lille smule mindre til gengæld,
men det er selvfølgelig rigtigt at det ikke altid berettiger. :)

> Stored procs. giver mening, hvis du har noget, der bedst behandles
> internt i databasen, før et ResultSet sendes til clienten.
>
>> Nu er jeg blevet bekendt med at man i MS SQL Server kan lave relationerne
>> på
>> tabellerne med det samme mellem PK og FK når man designer og opretter
>> tabellerne, således at cascading deletes og alt sådan noget følges ad.
>
> Du kan relatere data i alle relationelle DBMS systemer - deraf navnet
>
> Pas på med cascading deletes!!!! Du kan hurtigt ende med med en tom
> database . Igen der skal være en grund til at bruge det.

Det skal jeg huske :)

>> Men er der noget performance at hente ved at gøre dette?
>
> Nej, tværtimod. Relationer går imod performance. Hver gang du eks. laver
> en insert i en Foreign key column skal den checkes i master tabellen.
>
> Til gengæld giver det bedre datakvalitet, i det du enforcer dine
> constraints.
>
> Du bør altid relatere dine data, det er hele ideen i et relationelt DBMS.

Jo selvfølgelig, men måden jeg plejer at gøre det på er at lave primary keys
i de forskellige tabeller og så bruge joins i mine sql kald til at koble
FKerne sammen med PKerne. Dvs. der står ingen steder at denne attr. er en
foreign key. Det definerer jeg først i mit sql kald.

>> Slipper jeg så får at lave joins i mine sql kald?
>
> Nej. Jeg tror ikke du forstår ideen bag relational constraints (foreign
> /primary keys) helt.
>
> http://www.utexas.edu/its/windows/database/datamodeling/dm/keys.html

Alt det har jeg styr på, det jeg var lidt ud efter var om det var en ide at
definere alle tingene up front i min database eller om jeg ikke vil vinde
noget synderligt ved det. Jeg kan vel ligeså godt fortsætte med at definere
det i mine sql kalds joins hvis jeg alligevel ikke vinder noget ved at
definere det up front i selve databasen.

Kan du følge mig?

Hvis der er fordele ved det, kan jeg så ikke få dig til at fortælle hvad de
er, for lige nu er jeg bare blevet overbevist om at jeg skal gøre som jeg
plejer, men et eller andet siger mig at det måske ikke er så smart. Jeg ved
bare ikke helt hvad, hehe... ;)


Jimmy



Kristian Damm Jensen (12-07-2005)
Kommentar
Fra : Kristian Damm Jensen


Dato : 12-07-05 11:37

Jimmy wrote:
> "Nikolaj Hansen" <barnabasdk@gmail.com> skrev i en meddelelse
> news:QGDAe.59389$Fe7.194538@news000.worldonline.dk...
> > Jimmy wrote:
> >> Jeg har altid fokuseret på nogle gode index og så stored procedures for
> >> at
> >> optimere performance.
> >
> > Stored procedures behøver ikke altid at gøre dine queries hurtigere -
> > tværtimod.
> >
> > Hvis det er et råt select, der henter data ud til en ekstern app, hvor
> > du arbejder med dem vil et alm. query tit være hurtigere.
>
> Jamen belastningen på netværket vil være en lille smule mindre til gengæld,
> men det er selvfølgelig rigtigt at det ikke altid berettiger. :)

I de fleste tilfælde er forskellen mellem en direkte query og et kald
til en stored procedure under alle omstændigheder så lille, at
effektivitetshensyn er af underordnet betydning ved valget.

Aspekter som sikkerhed, dataintegritet, vedligeholdelse, modularisering
og kodegenbrug er vigtigere.

<snip>

> >> Men er der noget performance at hente ved at gøre dette?
> >
> > Nej, tværtimod. Relationer går imod performance. Hver gang du eks. laver
> > en insert i en Foreign key column skal den checkes i master tabellen.
> >
> > Til gengæld giver det bedre datakvalitet, i det du enforcer dine
> > constraints.
> >
> > Du bør altid relatere dine data, det er hele ideen i et relationelt DBMS.
>
> Jo selvfølgelig, men måden jeg plejer at gøre det på er at lave primary keys
> i de forskellige tabeller og så bruge joins i mine sql kald til at koble
> FKerne sammen med PKerne. Dvs. der står ingen steder at denne attr. er en
> foreign key. Det definerer jeg først i mit sql kald.

Du blander fremmednøgler og join-betingelser sammen. De to begreber
har ikke noget med hinanden at gøre.

Fremmednøgler bruges til at klargøre i definitionen af datamodellen,
hvordan de forskellige relationer hænger sammen. Det kan - som du er
inde på - desuden bruges til at sikre dataintegritet.

Joins bruges til at knytte data i forskellige tabeller sammen, men det
er ikke altid at denne sammenknytning sker på baggrund af en
fremmednøgle, ligesom man udmærket kan komme ud for at skulle lave et
join, hvor man absolut ikke ønsker at inddrage fremmednøglen i
join-betingelsen.

<snip>

Kristian


Jimmy (14-07-2005)
Kommentar
Fra : Jimmy


Dato : 14-07-05 09:18

"Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
news:1121164640.729847.66240@z14g2000cwz.googlegroups.com...
Jimmy wrote:
> "Nikolaj Hansen" <barnabasdk@gmail.com> skrev i en meddelelse
> news:QGDAe.59389$Fe7.194538@news000.worldonline.dk...
> >> Men er der noget performance at hente ved at gøre dette?
> >
> > Nej, tværtimod. Relationer går imod performance. Hver gang du eks. laver
> > en insert i en Foreign key column skal den checkes i master tabellen.
> >
> > Til gengæld giver det bedre datakvalitet, i det du enforcer dine
> > constraints.
> >
> > Du bør altid relatere dine data, det er hele ideen i et relationelt
> > DBMS.
>
> Jo selvfølgelig, men måden jeg plejer at gøre det på er at lave primary
> keys
> i de forskellige tabeller og så bruge joins i mine sql kald til at koble
> FKerne sammen med PKerne. Dvs. der står ingen steder at denne attr. er en
> foreign key. Det definerer jeg først i mit sql kald.

Du blander fremmednøgler og join-betingelser sammen. De to begreber
har ikke noget med hinanden at gøre.

Fremmednøgler bruges til at klargøre i definitionen af datamodellen,
hvordan de forskellige relationer hænger sammen. Det kan - som du er
inde på - desuden bruges til at sikre dataintegritet.

Joins bruges til at knytte data i forskellige tabeller sammen, men det
er ikke altid at denne sammenknytning sker på baggrund af en
fremmednøgle, ligesom man udmærket kan komme ud for at skulle lave et
join, hvor man absolut ikke ønsker at inddrage fremmednøglen i
join-betingelsen.

Ok, det kan jeg egentlig godt se. Så det er på grund at dataintegriteten at
man definerer det up front. Det giver jo god mening. Der er altså intet
performance at hente ved at gøre det, men til gengæld sikrer jeg
dataintegritet.

Så skal jeg jo nok gøre det alligevel, men var faktisk ude efter at få mere
performance. Nå, men det må jeg jo finde ud af at gøre på en anden måde.

Tak for hjælpen


Jimmy



Kristian Damm Jensen (14-07-2005)
Kommentar
Fra : Kristian Damm Jensen


Dato : 14-07-05 09:28



Jimmy wrote:
> "Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
> news:1121164640.729847.66240@z14g2000cwz.googlegroups.com...
> Jimmy wrote:
> > "Nikolaj Hansen" <barnabasdk@gmail.com> skrev i en meddelelse
> > news:QGDAe.59389$Fe7.194538@news000.worldonline.dk...
> > >> Men er der noget performance at hente ved at gøre dette?
> > >
> > > Nej, tværtimod. Relationer går imod performance. Hver gang du eks.. laver
> > > en insert i en Foreign key column skal den checkes i master tabellen.
> > >
> > > Til gengæld giver det bedre datakvalitet, i det du enforcer dine
> > > constraints.
> > >
> > > Du bør altid relatere dine data, det er hele ideen i et relationelt
> > > DBMS.
> >
> > Jo selvfølgelig, men måden jeg plejer at gøre det på er at lave primary
> > keys
> > i de forskellige tabeller og så bruge joins i mine sql kald til at koble
> > FKerne sammen med PKerne. Dvs. der står ingen steder at denne attr. er en
> > foreign key. Det definerer jeg først i mit sql kald.
>
> Du blander fremmednøgler og join-betingelser sammen. De to begreber
> har ikke noget med hinanden at gøre.
>
> Fremmednøgler bruges til at klargøre i definitionen af datamodellen,
> hvordan de forskellige relationer hænger sammen. Det kan - som du er
> inde på - desuden bruges til at sikre dataintegritet.
>
> Joins bruges til at knytte data i forskellige tabeller sammen, men det
> er ikke altid at denne sammenknytning sker på baggrund af en
> fremmednøgle, ligesom man udmærket kan komme ud for at skulle lave et
> join, hvor man absolut ikke ønsker at inddrage fremmednøglen i
> join-betingelsen.
>
> Ok, det kan jeg egentlig godt se. Så det er på grund at dataintegriteten at
> man definerer det up front. Det giver jo god mening. Der er altså intet
> performance at hente ved at gøre det, men til gengæld sikrer jeg
> dataintegritet.

Nu overfortolker du, hvad jeg sagde. Der er - i nogle tilfælde -
performance at hente. Det er bare sjældent det, der er grunden til at
gøre det.

> Så skal jeg jo nok gøre det alligevel, men var faktisk ude efter at få mere
> performance. Nå, men det må jeg jo finde ud af at gøre på en anden måde.


Kristian


Jimmy (16-07-2005)
Kommentar
Fra : Jimmy


Dato : 16-07-05 10:47

"Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
news:1121329668.501407.198790@g43g2000cwa.googlegroups.com...


Jimmy wrote:
> "Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
> news:1121164640.729847.66240@z14g2000cwz.googlegroups.com...
> Jimmy wrote:
> > "Nikolaj Hansen" <barnabasdk@gmail.com> skrev i en meddelelse
> > news:QGDAe.59389$Fe7.194538@news000.worldonline.dk...
> Ok, det kan jeg egentlig godt se. Så det er på grund at dataintegriteten
> at
> man definerer det up front. Det giver jo god mening. Der er altså intet
> performance at hente ved at gøre det, men til gengæld sikrer jeg
> dataintegritet.

Nu overfortolker du, hvad jeg sagde. Der er - i nogle tilfælde -
performance at hente. Det er bare sjældent det, der er grunden til at
gøre det.

Okay. I nogle tilfælde. Hvilke tilfælde er der tale om?

Lyder som om at jeg skal gøre det under alle omstændigheder, men jeg kunne
godt tænke mig at vide i hvilke tilfælde vi taler performance?

Ellers tak for svarene indtil videre :)


Jimmy



Kristian Damm Jensen (16-07-2005)
Kommentar
Fra : Kristian Damm Jensen


Dato : 16-07-05 20:38

Jimmy wrote:
> "Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
> news:1121329668.501407.198790@g43g2000cwa.googlegroups.com...
>
>
> Jimmy wrote:
> > "Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
> > news:1121164640.729847.66240@z14g2000cwz.googlegroups.com...
> > Jimmy wrote:
> > > "Nikolaj Hansen" <barnabasdk@gmail.com> skrev i en meddelelse
> > > news:QGDAe.59389$Fe7.194538@news000.worldonline.dk...
> > Ok, det kan jeg egentlig godt se. Så det er på grund at dataintegriteten
> > at
> > man definerer det up front. Det giver jo god mening. Der er altså intet
> > performance at hente ved at gøre det, men til gengæld sikrer jeg
> > dataintegritet.
>
> Nu overfortolker du, hvad jeg sagde. Der er - i nogle tilfælde -
> performance at hente. Det er bare sjældent det, der er grunden til at
> gøre det.
>
> Okay. I nogle tilfælde. Hvilke tilfælde er der tale om?

I hvilke tilfælde er performance grunden til at man benytter stored
procedures?

Hvis du
(a) arbejder i et miljø, hvor du har valget. (Jeg gør ikke.)
(b) ikke har noget behov eller ønske om at modularisere koden
(c) ikke har noget behov eller ønske om at udnytte indbyggede
autorisationsmekanismer til at øge systemets sikkerhed
(d) ikke har behov for at lave transaktionsstyring, eller foretrækker
at lade klienten lave transaktionsstyring
.... etc.

så kan du havne i en situation, hvor det eneste spørgsmål der står
tilbage er "Vinder jeg noget i performance ved at omskrive dette til en
SP?" Svaret vil ofte være ja, men det er ikke givet. Det vil afhænge
af flere ting:
- hvor ofte skal den pågældende query køres?
Hvis den køres ofte, vil en sp ligge i cache og kunne udføres
umiddelbart. Hvis ikke skal den hentes frem og i al fald visse dele af
oversættelsen skal udføres inden den kan eksekveres; det vil
nedsætte fordelene ved en sp.
En query skal altid oversættes helt fra bunden.
- hvor stor er den?
Jo større query du skal sende over nettet, jo længere svartider.
En sp fylder i det store hele altid det samme.
- hvor kompleks er den?
- etc.
- sidst men ikke mindst: Hvordan behandler mit specifikke DBMS en query
hhv. en SP?

Kristian


Jimmy (17-07-2005)
Kommentar
Fra : Jimmy


Dato : 17-07-05 00:40

"Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
news:1121542650.686921.301810@g43g2000cwa.googlegroups.com...
Jimmy wrote:
> "Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
> news:1121329668.501407.198790@g43g2000cwa.googlegroups.com...
>
>
> Jimmy wrote:
> > "Kristian Damm Jensen" <kristiandamm@gmail.com> skrev i en meddelelse
> > news:1121164640.729847.66240@z14g2000cwz.googlegroups.com...
> > Jimmy wrote:
> > > "Nikolaj Hansen" <barnabasdk@gmail.com> skrev i en meddelelse
> > > news:QGDAe.59389$Fe7.194538@news000.worldonline.dk...
> > Ok, det kan jeg egentlig godt se. Så det er på grund at dataintegriteten
> > at
> > man definerer det up front. Det giver jo god mening. Der er altså intet
> > performance at hente ved at gøre det, men til gengæld sikrer jeg
> > dataintegritet.
>
> Nu overfortolker du, hvad jeg sagde. Der er - i nogle tilfælde -
> performance at hente. Det er bare sjældent det, der er grunden til at
> gøre det.
>
> Okay. I nogle tilfælde. Hvilke tilfælde er der tale om?

I hvilke tilfælde er performance grunden til at man benytter stored
procedures?

Hvis du
(a) arbejder i et miljø, hvor du har valget. (Jeg gør ikke.)
(b) ikke har noget behov eller ønske om at modularisere koden
(c) ikke har noget behov eller ønske om at udnytte indbyggede
autorisationsmekanismer til at øge systemets sikkerhed
(d) ikke har behov for at lave transaktionsstyring, eller foretrækker
at lade klienten lave transaktionsstyring
.... etc.

så kan du havne i en situation, hvor det eneste spørgsmål der står
tilbage er "Vinder jeg noget i performance ved at omskrive dette til en
SP?" Svaret vil ofte være ja, men det er ikke givet. Det vil afhænge
af flere ting:
- hvor ofte skal den pågældende query køres?
Hvis den køres ofte, vil en sp ligge i cache og kunne udføres
umiddelbart. Hvis ikke skal den hentes frem og i al fald visse dele af
oversættelsen skal udføres inden den kan eksekveres; det vil
nedsætte fordelene ved en sp.
En query skal altid oversættes helt fra bunden.
- hvor stor er den?
Jo større query du skal sende over nettet, jo længere svartider.
En sp fylder i det store hele altid det samme.
- hvor kompleks er den?
- etc.
- sidst men ikke mindst: Hvordan behandler mit specifikke DBMS en query
hhv. en SP?

Jeg er med... :)

Tak


Jimmy



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408188
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste