Hey all. Ik ben al behoorlijk lang bezig met een progje om m'n MP3's te managen. Daarbij zit natuurlijk een database. Bij het openen van een .m3u-bestand (playlist) heb ik dus een query nodig om van de bestandsnamen in de .m3u de informatie te zoeken uit de database.
Op dit moment gaat dit proces als volgt:
De eerste stap bestaat uit:
Hierin is Files een stringlist. Het adden van 300 piepkleine recordjes duurt ongeveer 5 seconden. Het tabelletje is slechts 86Kbytes groot. Dat moet toch veel en veel sneller kunnen? Maar hoe!?
Aan tweede stap kan ik niet bijzonder veel veranderen, maar duurt toch nog 6 seconden:
Eventueel kan ik hiervan een selectie-query maken (de select zelf is binnen 1 seconde klaar), en dan de temp-table vullen dmv appendrecord, zoals hiervoor. (Hopende dat iemand hiervoor iets snellers weet).
De derde stap is gewoon eentje die lang duurt (ook ongeveer 6 seconden). Hieraan is niet erg veel te veranderen denk ik. Voor de volledigheid maar even de bijbehorende query:
Ik draai dit op een P3-800, met 640MB. En de eerste twee stappen MOETEN gewoon sneller kunnen. Als ik in Paradox "SELECT TRACKID, UPPER(SHORTCUT) FROM MC_TRACKS" laat uitvoeren, dan heb ik binnen de seconde het antwoord in de antwoordtabel :PRIV:answer staan. Waarom duurt het bij "INSERT INTO MC_TEMP2 SELECT TRACKID, UPPER(SHORTCUT) FROM MC_TRACKS" dan 6 seconden voordat de antwoordtabel MC_TEMP2 klaar is!!!?
Op dit moment gaat dit proces als volgt:
- Maak een temp-table, met daarin volgnummer + Upper(bestandsnaam) (vanuit de m3u)
- Maak nog een temp-table, met daarin TrackID + Upper(bestandsnaam) (vanuit de DB)
- Als laatste volgt de dikke query, die alle gegevens ophaalt van bestandsnamen die overeenkomen in de m3u en de DB. Het veldje volgnummer in temp-table #1 wordt natuurlijk gebruikt om de originele volgorde in de m3u te behouden.
De eerste stap bestaat uit:
code:
1
2
3
| for i:=0 to Files.Count-1 do begin
T.AppendRecord([i+1,UpperCase(Files[i])]);
end; |
Hierin is Files een stringlist. Het adden van 300 piepkleine recordjes duurt ongeveer 5 seconden. Het tabelletje is slechts 86Kbytes groot. Dat moet toch veel en veel sneller kunnen? Maar hoe!?
Aan tweede stap kan ik niet bijzonder veel veranderen, maar duurt toch nog 6 seconden:
code:
1
2
| Q.SQL.Add('INSERT INTO MC_TEMP2 SELECT TRACKID, UPPER(SHORTCUT) FROM MC_TRACKS');
Q.ExecSQL; |
Eventueel kan ik hiervan een selectie-query maken (de select zelf is binnen 1 seconde klaar), en dan de temp-table vullen dmv appendrecord, zoals hiervoor. (Hopende dat iemand hiervoor iets snellers weet).
De derde stap is gewoon eentje die lang duurt (ook ongeveer 6 seconden). Hieraan is niet erg veel te veranderen denk ik. Voor de volledigheid maar even de bijbehorende query:
code:
1
2
3
4
5
| Q.SQL.Add('SELECT B.BANDNAME, A.ALBUMNAME, T.TRACKNR, T.TRACKNAME, T.TRACKLENGTH,');
Q.SQL.Add('A.ALBUMRELEASEDATE, T.COMMENT, G.GENRENAME, T.PLAYS, T.LASTPLAY, T.SHORTCUT, T.TRACKID, R.IDX FROM');
Q.SQL.Add('MC_TRACKS T, MC_ALBUMS A, MC_BANDS B, MC_GENRES G, MC_TEMP1 R, MC_TEMP2 S WHERE');
Q.SQL.Add('T.BANDID=B.BANDID AND T.ALBUMID=A.ALBUMID AND');
Q.SQL.Add('T.GENRE=G.GENREID AND T.TRACKID=S.TRACKID AND R.SHORTCUT=S.SHORTCUT ORDER BY R.IDX'); |
Ik draai dit op een P3-800, met 640MB. En de eerste twee stappen MOETEN gewoon sneller kunnen. Als ik in Paradox "SELECT TRACKID, UPPER(SHORTCUT) FROM MC_TRACKS" laat uitvoeren, dan heb ik binnen de seconde het antwoord in de antwoordtabel :PRIV:answer staan. Waarom duurt het bij "INSERT INTO MC_TEMP2 SELECT TRACKID, UPPER(SHORTCUT) FROM MC_TRACKS" dan 6 seconden voordat de antwoordtabel MC_TEMP2 klaar is!!!?
Siditamentis astuentis pactum.