» »

[SQL] počasna poizvedba

svetovid ::

Zdravo,
napisal sem poizvedbo katera prejme datum, spremenjen ip v decimalke in orginalen ip. Iz baze želim dobiti longitude ,latitude ter število dostopov.

SELECT DISTINCT GEOIP_LOC.LATITUDE, GEOIP_LOC.LONGITUDE, COUNT(LOGFILE.ID) AS ŠT_DOSTOPOV
FROM         GEOIP_LOC INNER JOIN  GEOIP_BLOCK 
ON GEOIP_LOC.ID = GEOIP_BLOCK.LOCID CROSS JOIN LOGFILE
WHERE     (@od <= LOGFILE.TIMESTR) AND (LOGFILE.TIMESTR <= @do) 
AND (@sprip BETWEEN GEOIP_BLOCK.STARTIP AND GEOIP_BLOCK.ENDIP) 
AND (LOGFILE.CLIENT_IP = @orgip)
GROUP BY GEOIP_LOC.LATITUDE, GEOIP_LOC.LONGITUDE


Ampak imam problem da je v bazi preko 400000 podatkov in je ta poizvedba zelo počasna, prosim če mi da kdo kakšen nasvet kako pohitriti zadevo :)


lp
  • spremenilo: svetovid ()

AndyS ::

Indexi na poljih iz pogoja

zavajon ::

Po mojem ti tukaj niti indexi ne bodo pomagali, ker uporabljaš CROSS JOIN.
Ta ti vrne kartezični produkt, torej št.recordov prve tabele krat št. recordov druge tabele. Če je tabela LOGFILE res log tabela, zna ta rasti kar hitro.
Glede na to, da ti iščeš število dostopov iz LOGFILE, bi bil po mojem INNER JOIN čisto ustrezen. Pa najbrž imaš kakšno polje, s katerim bi lahko joinal.

svetovid ::

AndyS je izjavil:

Indexi na poljih iz pogoja

Lahko bi se malo bolj razgovoril.

svetovid ::

zavajon je izjavil:

Po mojem ti tukaj niti indexi ne bodo pomagali, ker uporabljaš CROSS JOIN.
Ta ti vrne kartezični produkt, torej št.recordov prve tabele krat št. recordov druge tabele. Če je tabela LOGFILE res log tabela, zna ta rasti kar hitro.
Glede na to, da ti iščeš število dostopov iz LOGFILE, bi bil po mojem INNER JOIN čisto ustrezen. Pa najbrž imaš kakšno polje, s katerim bi lahko joinal.


Sem preveril, če bi lahko uporabil inner join ampak ne, nimam nobenega atribtura s katerim bi lahko joinau. Mislim da bi se dalo spremeniti okrog between stavka oz. < = in > = ampak sem brez idej...


Če želim obdelati vse podatke mi program vrne izjemo da je Timeout na poizvedbi. Zdaj jih obdelujem po urah. Več kot 4 ure na enkrat negre.

Zgodovina sprememb…

  • spremenilo: svetovid ()

zavajon ::

A po IP ne moreš joinat?
Če ne moreš povezati GEOIP_LOC in LOGFILE, ne boš mogel nikakor dobiti števila dostopov po GEOIP_LOC.LATITUDE, GEOIP_LOC.LONGITUDE

svetovid ::

V logfile je client_ip (navaden ip naslov), v GEOIP_BLOCK imam startip in endip ter locid. Ta locid je povezan z id v GEOIP_LOC. Tako da mi mora program pretvoriti navaden ip naslov v decimalnega.

Aja poizvedba mi vrača pravilne podatke samo zelo zelo počasi.

Zgodovina sprememb…

  • spremenilo: svetovid ()

zavajon ::

Potem pa poskusi z dodajanjem indexov na:
LOGFILE.TIMESTR
LOGFILE.CLIENT_IP
GEOIP_LOC.ID
GEOIP_BLOCK.LOCID

svetovid ::

Teh indexov pa res nezastopim. Ampak se občutno pozna na hitrosti poizvedbe :)

Hvala!

zavajon ::

Saj temu so indeksi namenjeni ;)

alexa-lol ::

jah namesto O(n) imas O(log n) za iskanje... in če imaš 400 000 se že pozna... je pa malo bolj zamudno dodajanje (O(log n))

AndyS ::

Odvisno od tipa strukture, ki jo index uporablja


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Baza & c#

Oddelek: Programiranje
212137 (1195) xardas
»

Prepoved za ogled spletne strani le nekaterim

Oddelek: Programiranje
6586 (528) fiction
»

[MySQL] Rabim hitrejšo SQL poizvedbo za 3 tabele!

Oddelek: Programiranje
7608 (467) shorvat
»

Lociranje in usmeritev obiskovalca glede na državo

Oddelek: Izdelava spletišč
14816 (526) Loki
»

SQL problem

Oddelek: Programiranje
9762 (599) Bossek

Več podobnih tem