Üdv,
Előrebocsátom, hogy nem vagyok SQL-szakértő (sem).
A következőre futottam rá egy program írása során:
Van egy adatbázis tábla, mondjuk a következő mezőkkel:
index, value, option
Az index egy unique érték, a value egy integer, ami nem unique, az option pedig lehet 0 vagy 1.
A feladatom az volna, hogy minden olyan rekordhoz, amelynek az option értéke 0 találjam meg azt a rekordot, aminek a value értéke megegyezik a saját value-éval (tehát itt történik egy self join) és az option értéke 1, az indexe pedig kisebb a sajét indexnél. Eddig még rendben is volna, self-joinnal megkapom az összeset.
Viszont nekem csak egy darab kéne, mégpedig a legnagyobb ilyen indexű.
A legelső, legnaivabb megoldásnak az tűnik, hogy lekérdezem az összes ilyet, utána egy sort segítségével megkeresem a legnagyobbat. És ezt egyesével elvégzem minden olyan rekordra, amelynek 0 az option mezője. Nyilván lassú.
Hogyan lehetne ezt kulturáltan megcsinálni? Alapvetően körülbelül 500000 rekordhoz kéne megcsinálni ezt a párosítást.
Egy SQLite adatbázisról van szó.
- 5219 megtekintés
Hozzászólások
Hint1:
select a.termekkod, a.ar
from termekarak as a
where arazas_napja = (
select max( arazas_napja)
from termekarak as b
where b.termekkod = a.termekkod
);
Hint2: Indextábla nélkül dögrovás lesz, bárhogy csinálod.
Hint3: Biztos, hogy 500k rekord még az sqlite asztala?
- A hozzászóláshoz be kell jelentkezni
Köszönöm, átgondolom. Az indextáblának utánanézek, micsoda. Az oszlopok amúgy meg vannak indexelve, ugyanis az adatok nem változnak, nem szúrok bele újat.
Postgresql-lel is próbálgatom, sajnos határozottan lassabb. Pedig tud olyanokat, amik jól jönnek. A sebesség meg nem ártana, ha jó lenne.
- A hozzászóláshoz be kell jelentkezni
Közben valami ilyesmit megszültem magamtól is, a sebessége kétségbeejtő, ezen még dolgoznom kell.
- A hozzászóláshoz be kell jelentkezni
Nem vagyok egy db guru, de nem lenne jobb a sub query-t atirni, hogy ne fuggjon a kulso querytol? Mert akkor azt eleg lenne a db-nek egyszer lefuttatnia. Vmi ilyesmi (nem teszteltem):
select a.termekkod, a.ar from termekarak a
join (
select termekkod, max(arazas_napja) arazas_napja from termekarak group by termekkod
) b
on a.termekkod = b.termekkod and a.arazas_napja = b.arazas_napja
- A hozzászóláshoz be kell jelentkezni