[ mojsony @ 10.03.2004. 10:10 ] @
Dakle,

u Access bazi imam preko 100000 slogova. Da bi se neki upit izvrsi potrebno mu je oko 20-30 sekundi, (normalno?) nekad i duze. Najgore je sto on mnogo trosi memorije cak i do 200 mb. (normalno?)
Upit je "select * from naziv_tabele".
Zbunjuje me to sto gledanjem te tabele u accessu memorija nije zauzeta vise od 30 Mb i ne traje duze od 4 sek!?

Pitanje:

Da li mu se nekako moze ograniciti memorija koju koristi, i kako da se ubrza?

p.s.

Programski jezik je Delphi 6.0, a u pitanju je tadoquery.

Hvala.
[ degojs @ 10.03.2004. 10:26 ] @
Zašto bi vršio upit:
SELECT * FROM naziv_tabele;
koji će da onda selektuje svih 100,000 zapisa. Šta ćeš sa toliko zapisa? Da ih prikažeš najednom, teško da će stati na ekran, a da ih printaš, nema potrebe da toliko zapisa dovlačiš "iz cuga", zar ne?

Da li dolazi u obzir mogućnost da ograničiš odabir korišćenjem WHERE klauze:

SELECT * FROM naziv_tabele WHERE uslov;

Acess verovatno čita samo one zapise koje ti onda i prikaže na ekranu (npr. 50 zapisa), a onda kako se ti pomeraš gore-dole kroz tabelu, on čita i prikazuje potrebne zapise. Pri tom Access verovatno nikad ne čita više od 50-tak zapisa, jer više ne može ni da ti prikaže na ekranu, a to možeš i ti da uradiš upotrebom WHERE. Dobro, možda Access čita nešto više zapisa (npr. 1000) kako bi ubrzao pregled istih, ali skoro je sigurno da ne čita sve zapise. Zamisli da imaš tabelu sa još više zapisa.. gde bi to sve stalo u memoriji?

Pozdrav
[ Simke @ 11.03.2004. 00:32 ] @
Takodje ako stavis indexe na polja na kojima cesto radis search (WHERE), ubrzaces query.
[ vbraca @ 11.03.2004. 15:03 ] @
Citat:
degojs:
Acess verovatno čita samo one zapise koje ti onda i prikaže na ekranu (npr. 50 zapisa), a onda kako se ti pomeraš gore-dole kroz tabelu, on čita i prikazuje potrebne zapise. Pri tom Access verovatno nikad ne čita više od 50-tak zapisa, jer više ne može ni da ti prikaže na ekranu, a to možeš i ti da uradiš upotrebom WHERE. Dobro, možda Access čita nešto više zapisa (npr. 1000) kako bi ubrzao pregled istih, ali skoro je sigurno da ne čita sve zapise. Zamisli da imaš tabelu sa još više zapisa.. gde bi to sve stalo u memoriji?


Nazalost sudeci po tekstovima, kao i licnom iskustvu, koji sa bave ovakvim problemima Access radi upravo suprotnu stvar - ono sto se nalazi u upitu Access prvo ucita (cini mi se da delimicno kesira podatke) pa tek onda obradjuje. Konkretno kod ovog upita - prvo pokretanje bi trebalo da bude primetno sporije od narednog (naravno ako probas dva puta da pokrenes isti upit zaredom).
Sigurno ste primetili i da kod podizanja aplikacije koja podatke cita sa mreze Access-u treba dosta vremena da se podigne - zapravo treba mu vremena da sa mreze prvo procita sve tabele i podatke u njima pa da Vam tek onda dozvoli pristup aplikaciji.
Naravno ako ti je brzina bitna za rad aplikacije sa velikom koicinom podataka uvek ti ostaje mogucnost da koristis neku drugu platformu za razvoj ...

Pozdrav,
[ degojs @ 11.03.2004. 18:00 ] @
Čemu onda služe indeksi u Access-u?

Konkretno, ako se uzmu dve tabele (u mom primeru 450,000 zapisa) koje su sa istovetnim podacima:

1) prva tabela
AutoID - primarni ključ, index
T1 - index
T2
2) druga tabela:
AutoID - primarni ključ, index
T1
T2

Ako se naprave dva upita SELECT * FROM ... WHERE T1=vrednost;

razlika u brzini je više nego očigledna (prvi slučaj je rezultat dao odmah, a drugi nakon 5 sekundi), a i potrošnja memorije takođe (prvi slučaj oko 2 MB, drugi oko 15 MB). Ništa se nije promenilo ni prilikom ponovnog upita na lokalnoj mašini. Ako je baza na serveru u mreži, prvi upit ponovo ide gotovo trenutno, a drugi je još sporiji (ovde jeste slučaj da je brži ponovljeni upit, ali DALEKO sporije nego kada je polje indeksirano). Sa memorijom opet isto: 2:15.

Što se samog pregleda tiče, ovde si u pravu: radi se verovatno o tome da Access učitava čitavu (ili dobar deo) tabelu ako u memoriji ima dovoljno mesta, što je ovde i bio slučaj. Bilo bi interesantno videti kako bi reagovao kada bi server imao npr. 128 MB RAMa, a baza bila recimo 500 MB. U ovom slučaju baza je oko 70 MB. Svejedno, zauzeće memorije i ovde je bilo značajno manje nego što je veličina same tabele.

Moj zaključak može samo da bude: WHERE i index.