Avatar billede moba Nybegynder
23. november 2010 - 08:33 Der er 14 kommentarer

SQL statement forslag til performanceforbedringer?

Hejsa

Jeg sidder med et forespørgsel som fungere fint men er noget tung. Lidt forsimplet skal jeg forsøge at forklare problemet.

tabel 1 - medarbejdere
cprnr, bilregnr

tabel 2 - kørsel
bilregnr, dag, km

Om Tabel 1 Til en medarbejder kan der være knyttet en eller flere bilregnumre.

Om Tabel 2 Tabellen fortæller hvor mange km der er kørt i bilen en given dag.

Forespørgslen:
Jeg skal se alle cprnr hvortil der ALDRIG har været kørsel, dvs ingen km på nogen af dit bilregnr som er registreret til cprnr.

Jeg laver den således (i pseudo)
select alle cpr fra tabel1 left joiner på tabel2 hvor cpr = null
og hvor cpr not in (select alle cpr fra tabel1 inner join på tabel2 gruppere på cpr) gruppere på cpr

Kan dette gøres smartere?
Avatar billede bkp Nybegynder
23. november 2010 - 09:06 #1
En Join er en god løsning, så jeg tror du skal kigge mere på hvorfor din join er langsom.

Jeg går ud fra at bilregnr er en streng?

Jeg ville tilføje en "BilId int Identity(1,1)" som primær nøgle i en ekstra tabel, med bilregnr, og her linke medarbejder op imod denne id, og din kørselstabel også linke til denne bil tabel.

Samtidig vil jeg lægge et index på alle id felterne, det vil helt sikkert speede din forespørgsel op.

Husk at en sammenligning mellem streng altid er langsommere end imod en simpel numerisk id som ovenikøbet er en primær nøgle.
Avatar billede moba Nybegynder
23. november 2010 - 10:16 #2
Hejsa

jeg har ikke mulighed for at ændre på strukturen. Vil du mene at Join er bedre end  "Not in"?
Avatar billede bkp Nybegynder
23. november 2010 - 11:10 #3
Kommer meget an på index og nøgler, prøv at lave en Execution plan, den vil kunne fortælle dig mere om hvad det er der tager tid.
SET SHOWPLAN_ALL ON

GO

SELECT TOP 1000 *
  FROM .....


Se mere her:
http://www.sqlservercurry.com/2009/05/using-t-sql-to-display-execution-plans.html
Avatar billede bkp Nybegynder
23. november 2010 - 11:16 #4
Tjek om der er index på de felter som du linker sammen, eller søger på. Har du mulighed for at oprette et index?

Så ville jeg oprette et index på cpr og bilregnr.

Det gøres nemt således via TSQL:
CREATE UNIQUE CLUSTERED INDEX indexnavn ON tabel(felt)


http://msdn.microsoft.com/en-us/library/ms188783.aspx
Avatar billede bkp Nybegynder
23. november 2010 - 11:17 #5
Ovenstående er et unikt index, det skal det selvfølgelig ikke være hvis der er flere med samme værdi i dette felt, men så fjerner du UNIQUE parameteren, du kan se beskrivelse af parametre i ovenstående link.
Avatar billede Syska Mester
23. november 2010 - 16:05 #6
Det skal vel heller ikke være clustered ... det må vi antage han allerede har ( eller håbe )

mvh
Avatar billede a1a1 Novice
23. november 2010 - 16:21 #7
index, index...

vil gå ud fra at reg.nr. og cpr er char på hhv. 7 og 10 (evt. 11) tegn.
unique index på medarbejder tablellen (cpr) og på "bil" tabellen (hvis der er sådan en?), alm. index på kørsels tabellen (reg.nr, medarbejder (er der vel også?))

;o)
Avatar billede bkp Nybegynder
23. november 2010 - 16:25 #8
Hmm, så længe vi ikke har set hvordan tabeller er bygget op, så kan vi vel bare skyde med ideer i blinde :-)
Avatar billede Syska Mester
23. november 2010 - 16:31 #9
Der er ikke noget bedre Brian :-)

Hvem skriver en guide som folk burde læse inden de oprettede spørgsmål :-)
Avatar billede moba Nybegynder
23. november 2010 - 16:53 #10
Jeg vil arbejde videre med indeksering.

Fik og speedet forespørgslen gevalidgit op ved at left joine tabel 1 til tabel 2  - gruppere på tabel1.cpr og så sætte
having(tabel2.bilregnr)=0

Ser lige om jeg kan hitte ud af at lukke spørgsmål og give point...
Avatar billede moba Nybegynder
23. november 2010 - 16:54 #11
bpk send et svar
Avatar billede bkp Nybegynder
23. november 2010 - 17:04 #12
svar
Avatar billede bkp Nybegynder
23. november 2010 - 17:04 #13
æhh svar :-)
Avatar billede janus_007 Nybegynder
24. november 2010 - 20:38 #14
Not vil altid resultere i full table scan og så er dit index ligegyldigt :)
Post evt. sql'en her, så kan vi måske skrive den om!
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

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