Avatar billede ofirpeter Nybegynder
01. juni 2010 - 11:56 Der er 10 kommentarer og
1 løsning

TSQL kald med den bedste performance?

Hej,
Jeg har brug for hjælp. Arbejder med en meget tung tabel, derfor leder jeg efter en smartere måde at gøre følgende på:

Jeg har to tabeller.

Tabel1:
Indeholdende en unik række med et ID og en dato.

ID - DATO
1  10-10-2009
2  03-12-2009

Tabel2:
Indeholdende mange rækker med til hver ID med mange datoer.

ID - DATO - Værdi
1  01-10-2009 - Hus
1  12-12-2009 - Have
1  01-11-2010 - Cykel
1  05-11-2010 - Busk
2  01-10-2009 - Blomst
2  01-12-2009 - Bil
2  01-11-2010 - Æble


Jeg vil se gerne plukke den værdi i tabel 2 der høre til den pågældende dato i tabel 1. Altså den værdi der ligger i det rigtige interval i tabel 2.

Tabellen skulle altså komme til at se således ud:

ID - DATO - Værdi
1  10-10-2009 - Hus
2  01-11-2009 - Bil

Problemet er at begge de tabeller jeg trækker fra er enormt store, så ligemeget hvad jeg prøver tager det adskillige timer.

En der sidder inde med et smart tip?
Avatar billede ofirpeter Nybegynder
01. juni 2010 - 11:57 #1
Fik lavet en fejl. Denne lille tabel skal selvfølgelig se således ud:

ID - DATO - Værdi
1  10-10-2009 - Hus
2  03-12-2009 - Bil
Avatar billede michael_stim Ekspert
01. juni 2010 - 12:00 #2
Det er vel begrænset hvor stor tabel 1 kan blive. 365 (366) * 10 = 3660, er 10 år. Men har du indexeret dine felter?
Avatar billede ofirpeter Nybegynder
01. juni 2010 - 12:31 #3
Der kan optræde adskillige af de samme datoer - blot med forskellige id's. Felterne er indexerede.
Avatar billede ofirpeter Nybegynder
01. juni 2010 - 12:58 #4
Jeg har forsøgt mig med dette:
(hvilket dog er alt for tungt)

select * from tabel1 a
left join  tabel2 b on a.id = b.id
where
b.dato = (select max(dato) from tabel2 c where a.dato > c.dato and a.id = c.id)
Avatar billede teepee Nybegynder
01. juni 2010 - 13:49 #5
Lad være med at joine tabellerne samme, du skal jo alligevel kun bruge én information. Det kan du få ved en subselect i din select statement:

(uden syntaxcheck)

select *, (select værdi from tabel2 b where dato=(select max(dato) from tabel2 c where a.dato > c.dato and c.id = a.id) and b.id = a.id) vaerdi
from tabel1 a
Avatar billede ofirpeter Nybegynder
01. juni 2010 - 14:23 #6
Hej teeppe,
Mange tak for dit svar. Oplever dog endnu dårligere performance ved denne metode.
Avatar billede teepee Nybegynder
01. juni 2010 - 14:50 #7
Hmm, og har du prøvet at lave en explain plan?
Avatar billede teepee Nybegynder
01. juni 2010 - 14:54 #8
Lige en lille bemærkning, du skriver at jobbet tager adskillige timer, men efter min sql er afprøvet lykkedes det dig at svare tilbage allerede efter en halv time ;-)
Avatar billede ofirpeter Nybegynder
01. juni 2010 - 16:34 #9
Explain plan giver mig ikke noget nævneværdigt. Det man forventer tager tid sluger stort set alt (joins og subs).

@teepee: Jeg kørte en test med ganske få id's for at få et billede af hastigheden.
Avatar billede janus_007 Nybegynder
01. juni 2010 - 16:53 #10
teepees koster: 0,01008908
modsat din egen: 0,02780276

teepes performer, som jeg lige ser det omkring 70-75 bedre.

ofirpeter-> Forklar hvordan du "oplever" dårligere performance?


For de nysgerrige så angiver tallet en blanding imellem:
Hvilke algoritmer der bruges til hvert trin.
Antallet af rækker som processeres af algoritmen
Hvordan data ligger fordelt i hver query.
Antallet af processorer på maskinen.
Hukommelse RAM
Avatar billede teepee Nybegynder
02. juni 2010 - 10:34 #11
Er der statistikker og indexes? Har du for nyligt fyldt millioner af rækker i tabellen uden at opdatere disse?
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