Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как то странно пухнет база
 
 автор: als   (19.05.2008 в 05:04)   личное сообщение
 
 

Есть база, в ней два объекта, оба - таблицы
одна просто таблица, а другая - прилинкованый текстовый файл.
Есть ещё внешний EXE-шник, написаный на VB , который подменяет
текстовик новым, очищает данные из первой таблицы, а потом пишет туда данные из второй т.е из прилинкованого текстовика (через ODBC)
Текстовик содержит 35000 записей и имеет размер 2,3 МБ
База после сжатия весит 7,5 мб
Проблема в том, что после одного цикла обновления данных база опухает до 70 мб. Весь процесс на Селероне 2,33 Мгц с 256 мб и WinXP занимает 25 секунд, что как грится не в какие ворота

Подскажите люди добрые, что за фигня такая?

  Ответить  
 
 автор: osmor   (19.05.2008 в 09:00)   личное сообщение
 
 

Ну это в принципе нормально.
Что можно сделать:
- используйте JET вместо ODBC для линковки тестового файла
- Сжимайте базу после добавления

  Ответить  
 
 автор: als   (19.05.2008 в 14:44)   личное сообщение
 
 

Текстовик прилинкован через JET
Это EXE-шник туда через ODBC лезет
Сжатие базы после добавления увеличит время выполнения, что не допустимо.
Здесь речь идёт об обновлении справочника товаров в кассовом терминале после завершения чека
Время , которое можно себе позволить - секунд семь, не больше, а тут 25
Блин! А так всё было красиво и не затейливо! Придётся оптимизировать логику работы

  Ответить  
 
 автор: osmor   (19.05.2008 в 15:01)   личное сообщение
 
 

Добавляете запросом?

  Ответить  
 
 автор: als   (19.05.2008 в 18:34)   личное сообщение
 
 

Сделано так
Private Sub LoadGoods()
Dim SFile As String
Dim DFile As String
Dim MyFile As String
Dim MyPath As String
Dim MyName As String
Dim tmpSql As String
Dim DBFConnection As ADODB.Connection
Dim DConnection
SFile = "C:\Bufer\sect1.txt"

MyFile = Dir("C:\Bufer\sect1.txt")


If MyFile <> "" Then
DFile = "C:\Bufer\sect1.tmp"

Name SFile As DFile
SFile = "C:\Bufer\sect1.tmp"
DFile = "C:\sect1.txt"
FileCopy SFile, DFile
Kill SFile
DConnection = Me.cdbGoods.ConnectionString
bBeep = False
bAllowOperate = True
Set DBFConnection = New ADODB.Connection
DBFConnection.Open (DConnection + ";Password=system5")

tmpSql = "DELETE * FROM Goods"
DBFConnection.BeginTrans
DBFConnection.Execute (tmpSql)
DBFConnection.CommitTrans

tmpSql = "INSERT INTO Goods ( ID, Name, Price, Otd, LastPrice) SELECT Goods1.ID, Goods1.NAME, Goods1.PRICE, Goods1.OTD, Goods1.PRICE FROM Goods1;"

DBFConnection.BeginTrans
DBFConnection.Execute (tmpSql)
DBFConnection.CommitTrans

Me.cdbGoods.Refresh
DBFConnection.Close
End If


End Sub

  Ответить  
 
 автор: osmor   (20.05.2008 в 09:24)   личное сообщение
 
 

Это в программе на VB исполняется?
Зачем оборачивать в транзакцию Execute, если ошибки вы не обрабатываете... RollbackTrans где, может вам и не нужна транзакция? Это тоже время.
Попробуйте использовать Execute c
adCmdText+adExecuteNoRecords

DBFConnection.Execute (tmpSql,,adCmdText+adExecuteNoRecords)

Ну в принципе если только пароль с MDB снять... возможно это немного ускорит.

  Ответить  
 
 автор: FORMAT   (19.05.2008 в 10:52)   личное сообщение
 
 

Access резервирует определенное кол-во памяти при добавлении каждой записи. На это количество памяти увеличивается вес БД. Так вот после добавления записи в аксе не происходит очистка лишенй памяти и поэтому база остается распухшей.
Так что ничего страшного нет
+1 к совету osmora

  Ответить  
 
 автор: Анатолий (Киев)   (22.05.2008 в 19:47)   личное сообщение
 
 

MDB какой версии? Если его открыть в Access и выполнить запрос на добавление там - так же распухнет?
Я бы попробовал сделать это методами DAO. За одним и CompactDatabase можно выполнить.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList