C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Не создавать БД в ОЗУ
GoodWin
Отправлено: 09.10.2006, 12:27


Дежурный стрелочник

Группа: Участник
Сообщений: 50



Здраствуйте.
Я пользуюсь базами Access. Подключаюсь через TADOConnection.Создаю таблицу( TADOTable ), прописываю строку подключения и открываю ее <имя таблицы>->Active = true.
Во время ее выполнения фиксирую что количество свободной оператиивной памяти упало на 150 метров. Сама база весит на HDD около 60 метров. Т.е. очевидно что вся база загружается в оперативку. Так вот, собственно вопрос: как сделать так, чтобы этого не случалось, чтобы работа шла непосредственно с базой на винте, а не в оперативке?
Для малых баз это не так критично, а вот для больших...
olegenty
Отправлено: 09.10.2006, 12:44


Ветеран

Группа: Модератор
Сообщений: 2412



работа с таблицей таким способом означает, что фоново выполняется запрос типа
SQL
select * from [имя таблицы]


это не есть гуд, потому что зачем клиенту ВСЕ (предположим, что их немного — порядка единиц миллионов) записи из таблицы? что он будет с ними делать?

вывод — тебе нужно переходить на работу с запросами (TADOQuery). клиенту за раз бывает надо порядка единиц сотен записей. вот столько он и должен получать.
GoodWin
Отправлено: 09.10.2006, 16:21


Дежурный стрелочник

Группа: Участник
Сообщений: 50



Интересно, а зачем тогда вообще необходимо свойство CacheSize?? Я как понимаю, позволяет реже обращаться к источнику данных, использую кэш в оперативке.
И если все данные в оперативке, то почему так все медленно работает и все время обращается к винту?
Или я чего то не понимаю ?
У меня прога работает с базами материалов 3D объекта и когда происходит обновление материала, то приходится использовать Filter для поиска , но это работает намного медленне, чем то же реализовал я, создав в памяти класс строки в базе.
Просто неохота перебирать все исходники по новой и тратить пару дней для перевода на TADOQuery ( не я реализовывал, поэтому так долго предпологаю ).
Может есть какая-нибудь возможность отключить кеширование всех данных в TADOTable и разрешить ему обращаться только напрямую у винту.
Прошу извинить за ламерские вопросы, но с БД работал пока тока опосредованно.




olegenty
Отправлено: 10.10.2006, 07:13


Ветеран

Группа: Модератор
Сообщений: 2412



1. CacheSize — это ДОЗА (порция), размером в которую записи догружаются на клиента
2. Так медленно и к винту, потому что записи в ВИРТУАЛЬНОЙ памяти, а не в чистом виде в оперативной. Про своп никогда не слышал? Про файл подкачки? Так вот твои записи в файле подкачки, а он на винте. Отсюда и тормоза.
3. Filter надо заменить на WHERE в TADOQuery — получишь увеличение скорости работы в разы (иногда — в десятки и даже сотни раз).
GoodWin
Отправлено: 10.10.2006, 09:09


Дежурный стрелочник

Группа: Участник
Сообщений: 50



Все доступно и понятно, спасибо.
При ближайшей возможности буду переводить на TADOQuery.
С уважением, GoodWin.

Вернуться в Работа с базами данных в C++Builder