|
|
|
| Есть база, в ней два объекта, оба - таблицы
одна просто таблица, а другая - прилинкованый текстовый файл.
Есть ещё внешний EXE-шник, написаный на VB , который подменяет
текстовик новым, очищает данные из первой таблицы, а потом пишет туда данные из второй т.е из прилинкованого текстовика (через ODBC)
Текстовик содержит 35000 записей и имеет размер 2,3 МБ
База после сжатия весит 7,5 мб
Проблема в том, что после одного цикла обновления данных база опухает до 70 мб. Весь процесс на Селероне 2,33 Мгц с 256 мб и WinXP занимает 25 секунд, что как грится не в какие ворота
Подскажите люди добрые, что за фигня такая? | |
|
| |
|
|
|
| Ну это в принципе нормально.
Что можно сделать:
- используйте JET вместо ODBC для линковки тестового файла
- Сжимайте базу после добавления | |
|
| |
|
|
|
| Текстовик прилинкован через JET
Это EXE-шник туда через ODBC лезет
Сжатие базы после добавления увеличит время выполнения, что не допустимо.
Здесь речь идёт об обновлении справочника товаров в кассовом терминале после завершения чека
Время , которое можно себе позволить - секунд семь, не больше, а тут 25
Блин! А так всё было красиво и не затейливо! Придётся оптимизировать логику работы | |
|
| |
|
|
|
|
| Сделано так
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 | |
|
| |
|
|
|
| Это в программе на VB исполняется?
Зачем оборачивать в транзакцию Execute, если ошибки вы не обрабатываете... RollbackTrans где, может вам и не нужна транзакция? Это тоже время.
Попробуйте использовать Execute c
adCmdText+adExecuteNoRecords
DBFConnection.Execute (tmpSql,,adCmdText+adExecuteNoRecords)
|
Ну в принципе если только пароль с MDB снять... возможно это немного ускорит. | |
|
| |
|
|
|
| Access резервирует определенное кол-во памяти при добавлении каждой записи. На это количество памяти увеличивается вес БД. Так вот после добавления записи в аксе не происходит очистка лишенй памяти и поэтому база остается распухшей.
Так что ничего страшного нет
+1 к совету osmora | |
|
| |
|
|
|
| MDB какой версии? Если его открыть в Access и выполнить запрос на добавление там - так же распухнет?
Я бы попробовал сделать это методами DAO. За одним и CompactDatabase можно выполнить. | |
|
| |