Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse
Ut av nysgjerrighet, noen grunn til at DISTINCT ikke burde brukes? Enig i at det ikke burde være nødvendig hvis designet er godt, men ser likevel situasjoner der det kan være fornuftig.
Mange (inkludert siddis) har misforstått grunnen til at en ofte bør unngå distinct. Det har som regel ingenting med database design å gjøre, men med ytelse på spørringer. Enkelte spørringer kan yte bedre om man bruker en [NOT] EXISTS subquery i stedet for en DISTINCT.
Lenke til kommentar
Det har med database design å gjere då mange designer databaser som bruker duplikater i hutt og pine og *løyser* dette med å bruke DISTINCT
Det KAN ha med databasedesign å gjøre, men det er feil å sette likhetstegn mellom DISTINCT og feil databasedesign.
Lenke til kommentar
Då er meg og mine kollegaer svært ueinig med din påstand :)
Og det har dere lov å være :)

 

Jeg vil allikevel påstå at bruk av DISTINCT har sjeldent med dårlig databasedesign å gjøre, og mest med spørringen å gjøre. Eksempel:

 

Tabell 'Employee' (pseudo SQL):

EmployeeId int PK

Name varchar(50)

ManagerId int null (FK references EmployeeId)

 

Oppgave: Finn alle ansatte som har noen under seg i organisasjonen.

Svaralternativ 1 ved å bruke EXISTS:

select e.*
from Employee e
where exists(select * from Employee m where m.ManagerId=e.EmployeeId)

 

Svaralternativ 2 ved å bruke DISTINCT:

select distinct e.*
from Employee e
inner join Employee m on m.ManagerId=e.EmployeeId

 

Er databasedesignet dårlig bare fordi jeg kan løse oppgaven ved å bruke DISTINCT? Den eneste ulempen ved å bruke DISTINCT her er sannsynligvis ytelsen, selv om moderne DBMS vil sannsynligvis velge samme execution plan for begge disse spørringene.

 

Ordet er ditt/deres...

 

edit: og hvis vi ikke blir enige (dvs. at jeg har rett) så får vi møtes utenfor Snadderbua på Sola for et oppgjør ;)

 

edit 2: byttet om tittel for svaralternativ 1 og 2.

Endret av kaffenils
Lenke til kommentar

Det der er ikkje dårleg databasedesign!

 

Ta heller dette eksempelet:

 

Tabell document

 

id int PK

name varchar

document_type varchar

 

Tabellen har 100000000 rader, nå skal du hente ut alle typene(uten duplikater)

Då er det klart at det lønner seg å redesigne databasen.

Lenke til kommentar

Helt enig med deg i det eksempelet ditt sIDDIs. Det jeg er uenig i er at bruk av distinct i spørringer ofte er resultat av dårlig databasedesign.

 

Ta eksempelet ditt med dokument_type, men la oss for ordens skyld flytte document_type ut i en egen tabell, og heller ha en FK kolonne av type int i document tabellen.

Oppgaven med å finne ut hvilke dokumenttyper som er brukt kan løses med DISTINCT, men vil sannsynligvis være mye mer effektiv ved å SELECT fra dokumenttype tabellen og bruke EXISTS med subquery mot dokumenttabell. Om man velger å bruke DISTINCT eller EXISTS for å løse oppgaven så er det ikke databasemodellen det er noe galt med, derimot er det ressurskrevende å bruke DISTINCT.

 

Konklusjon: Bruk av DISTINCT skyldes som regel IKKE dårlig databasemodell, men dårlig forståelse av hva som skjer under panseret hos DBMSet.

Lenke til kommentar

Konklusjonen er ihvertfall at hvis du må bruke DISTINCT for å få en spørring til å returnere de dataene du vil, så burde du gjøre følgende:

- Sjekk om spørringen kan løses bedre med [NOT] EXISTS

- Sjekk om det kan lønne seg å redesigne databasen

 

Hvis du har mye data i databasen fra før av og kun skal skrive en ny spørring kan du sjekke hvor lang tid spørringen tar å kjøre før du gjør noen av disse sjekkene.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...