Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация обработки данных, При обработке разных по объему таблиц 
V
    Опции темы
slang
Дата 12.1.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: нет
Всего: 0



Есть несколько таблиц с одинаковой структурой.
В процессе обработки (VBA) каждой записи таблицы скорость обработки очень зависит от объема данных в таблице. Так например 100 записей из таблицы с 20000 записей обрабатываются около минуты. Если в таблице около 2 млн. записей то таже сотня обрабатывается около 15 минут. Какие варианты получения записи существуют (наиболее оптимальные)?
Я использую:
Код


Dim dbBase As Database
Dim tdfК As TableDef
Dim rstК As Object

Set dbBase = CurrentDb
Set tbfК = dbBase.TableDefs(Таблица)
Set rstК = dbBase.OpenRecordset(Таблица)

rstК.MoveFirst
Do Until rstК.EOF
обработка
rstК.MoveNext
Loop



--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
Dremlin
Дата 12.1.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: нет
Всего: 4



Если нужно обработать всего 100 записей, то не стоит загружать всю таблицу. Отсекаешь запросом необходимые данные и только с ними работаешь.
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
slang
Дата 13.1.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: нет
Всего: 0



Dremlin, нет, нужно обрабатывать всю таблицу. 100 записей - для примера скорости (одна запись слишком быстро, а сколько времени будут обрабатываться все записи из большой таблицы я вообще не знаю)


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
dionisiu
Дата 13.1.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 13.5.2006
Где: Крым

Репутация: 1
Всего: 2



у меня была схожая проблема - две таблицы от 150 000 до 4 000 000 записей, причём в одной - три поля типа "код репликации", а в другой - четыре. Обработка сводилась к тому, что нужно было добавить в одну таблицу одну запись, а в другую - несколько записей, дублируя свежеполученный ключ первой таблицы необходимое число раз (зависило от количества записей временной таблицы).
Рекордсетом эти записи не обрабатывались по причине нехватки памяти (отследил программой контроля памяти) - пришлось сделать всю обработку на запросах. Насчёт скорости - не знаю, однако это работает, а рекордсеты убивали винду.
PM MAIL ICQ   Вверх
slang
Дата 13.1.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 7.3.2004

Репутация: нет
Всего: 0



Нашел проблему в коде.
В форме есть поле, отображающее прогресс выполнения
Код

Dim dbBase As Database
Dim tdfК As TableDef
Dim rstК As Object

Set dbBase = CurrentDb
Set tbfК = dbBase.TableDefs(Таблица)
Set rstК = dbBase.OpenRecordset(Таблица)

rstК.MoveFirst
Do Until rstК.EOF
Form_Обработка.Процент = Int(k / DCount("*", Таблица) * 100) & "%"
обработка
rstК.MoveNext
Loop

она то все и тормозила. теперь буду думать, как лучше показать прогресс, хотя это и не обязательно.


--------------------
Запчасти на иномарки www.avtograd55.ru.
Если есть время - зайдите и посоветуйте что исправить и что доработать.
PM MAIL WWW ICQ   Вверх
dionisiu
Дата 13.1.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 13.5.2006
Где: Крым

Репутация: 1
Всего: 2



а прогресБар на статус-строке не пробовал?

Инициация прогресБара на статус-строке:

Код

varReturn = SysCmd(acSysCmdInitMeter, "прогресс", pmet * 10)


приращение програсБара в теле цикла (перед NEXT, LOOP.....)


Код

varReturn = SysCmd(acSysCmdUpdateMeter, CInt(pgr * 10))


Деструктор прогресБара в конце процедуры

Код

varReturn = SysCmd(acSysCmdRemoveMeter)


а ещё F1
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.1687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.