hazet
8/2/2007 4:47:00 PM
Witam,
Mam dziwny problem. Napisalem aplikacje w Turbo C++ laczaca sie z
postresql za pomoca komponentow ADO. Po uruchomieniu aplikacja zajmuje
w pamieci ponad 120MB! Nie wiem co jest przyczyna. Na formularzu
DataModule mam: Obiekt TADOConnection, 5 obiektow TADODataset i 9
komponentow TADOCommand(dla kazdej tabeli mam 3 komponenty -ADODataSet
do pobierania danych ADOCommand z parametrami do wstawiania wiersza i
jeszcze jeden ADOCommand do updatowania rekordu). Problem polega na
tym iz nawet gdy nie ma w tabeli duzo rekordow to program zajmuje w
pamieci od 120-160MB, co jest raczej nienormalne dla takiego
programu?
Mam na glownym formularzu DBGrida, i w zaleznoci jaka zakladke
klinkniel uzytkownik to komponentowi DataSource przypisuje dany
DataSet danej tabeli, DBGrid jest ustawiony na datasource. W przypadku
gdy nie pobieram zadnych danych do datasetow to program zajmuje ok
9MB. Sadze ze problem moze byc w tym iz po prostu dane z tabeli tyle
zajmuja, mam tabele:
CREATE TABLE tab1
(
id serial NOT NULL PRIMARY_KEY,
pole1 character varying(255) NOT NULL,
pole2 character varying(255) NOT NULL,
pole3 real NOT NULL,
pole4character varying(255) NOT NULL,
pole5 character varying(100) NOT NULL,
pole6 character varying(255),
pole7 character varying(255) NOT NULL,
pole8 character varying(255),
pole9 character varying(255),
pole10 character varying(255),
pole11 integer NOT NULL,
pole12 integer NOT NULL,
pole13 real NOT NULL,
pole14 real NOT NULL,
pole15 character varying(100)
);
CREATE TABLE tab2
(
id serial NOT NULL PRIMARY KEY,
tab1_id integer NOT NULL REFERENCES tab1(id), -- klucz obcy z tabeli
1
pole1 real NOT NULL,
pole2 real NOT NULL,
pole3 integer NOT NULL,
pole4 integer NOT NULL,
)
w tabeli 1 mam nie duzo rekordow(np 2, 3), natomiast w tab2 jest ich
ok 190 i stanowia relacje z tab1.
lacze te tabele left joinem
SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.id = tab2.tab1_id ORDER BY
tab1.id
Mam oprocz tego jeszcze 3 mniejsze tabele.
Mozliwe jest zeby przy takiej ilosci danych po zapytaniu dane w
datasecie tyle zajmowaly?
Nie moge zamiast varchar zastosowac typu text poniewaz przy uzyciu
komonentow ADO DBGrid nie wyswietla takich napisow prawidolowo(zamiast
tekstu wyswietla sie WIDEMEMO). Co moze byc przyczyna takiej
pamieciochlonnosci i jak ewentualnie moge sobie z tym poradzic? Nie
jest to przeciez duza ilosc danych
PS. Mam jeszcze pytanie czy da sie jakos przyspieszyc dzialanie
komponentow ADO poniewaz pobieranie danych z bazy dosyc dlugo trwa.
pozdrawiam