I DA, DA, DA, čika Vanja je rešio problem
Znači, nećete mi verovati u čemu je bio problem!
Posle dvodnevnog drkanja počeo sam da sumnjam da je uopšte problem u relacionoj tabeli, jer sam probao sve varijante, a i jedan smer super radi.
Samo da podsetim, kada su sve tabele u memoriji onda super radi.
Zato sam uzeo pa sam prebacio samo relacionu tabelu u memoriju, a ove dve sa podacima ostavio na disku, da vidim šta se dešava.
I tada sam potvrdio da ipak nije problem u relacionoj tabeli, jer je i dalje smer sr->en bio spor!!!
I u tom trenutku je došlo do prosvetljenja!!!
U pitanju je, naime, sr<->en rečnik, i ako pogledate malo gore, rel_table.id1 i rel_table.id2 se dobijaju iz ?, koji se opet dobija na sledeći nacin:
Code:
SELECT id FROM en_table WHERE word = ?
i
SELECT id FROM sr_table WHERE word = ?
(ovde verovatno može da se uradi i optimizacija u smislu višestrukog (trostrukog) join-a)
Ja uopšte nisam indeksirao word polja jer sam smatrao da to nije krucijalno u ova 2 pomoćna query-ja.
I nije bilo za prvi pomoćni kveri jer su se pretraživale samo engleske reči, ALI drugi JE upravo predstavljao problem jer su to bile reči sa "našim slovima", UTF8 i zato je pretraga po njima bila duga!
Dakle, evo finalnog rešenja koje drži celu bazu na disku (dakle nije plain, zaštićeno je automatski) i performanse su DO JAJA:
Code:
CREATE CACHED TABLE en_table ( id INTEGER PRIMARY KEY, word VARCHAR(256))
CREATE INDEX enWord ON en_table(word)"
CREATE CACHED TABLE sr_table ( id INTEGER PRIMARY KEY, word VARCHAR(256))
CREATE INDEX srWord ON sr_table(word)
CREATE CACHED TABLE rel_table (id1 INTEGER, id2 INTEGER)
CREATE INDEX relIndex1 ON rel_table(id1)
CREATE INDEX relIndex2 ON rel_table(id2)
(nije škodilo da indeksiram i engleski word, kad sam već tu)
Code:
...
SELECT word FROM rel_table INNER JOIN sr_table ON rel_table.id2 = sr_table.id WHERE rel_table.id1 = ? ORDER BY word
...
SELECT id FROM en_table WHERE word = ?
i
...
SELECT word FROM rel_table INNER JOIN en_table ON rel_table.id1 = en_table.id WHERE rel_table.id2 = ? ORDER BY word
...
SELECT id FROM sr_table WHERE word = ?
E, kako je dobar osećaj kad provališ nešto, a dugo si se oko toga jebavao
Degojs, hvala na strpljenju
Pozdrav
[Ovu poruku je menjao Vanja Petreski dana 17.03.2006. u 19:11 GMT+1]