powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пишу 30000 строк в базу Access, как ускорить?
22 сообщений из 22, страница 1 из 1
Пишу 30000 строк в базу Access, как ускорить?
    #33362257
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Экспериментирую тут с заливкой большого объема данных в базу Access.
Данные заливаются в одну таблицу, которая не имеет ни ключей ни индексов.
Берутся данные из заполненного массива.
Пробовал следующие способы в порядке возрастания времени работы:

1) - 192 секунды
rst.Open strsql, cnnData, adOpenStatic, adLockBatchOptimistic
.AddNew
rst.UpdateBatch

2) - 228 секунд
rst.Open strsql, cnnData, adOpenKeyset, adLockOptimistic
.AddNew
.Update

3) - 248 секунд
cnnData.Execute strsql, , adCmdText + adExecuteNoRecords

4) - 254 секунды
cnnData.Execute strsql

Последние на равных почти, а кругом обещали что 3 быстрее 4. Ну да не в этом вопрос, как бы все это ускорить? И почему так долго, в то время когда импорт из текстового файла те же самые 30000 строк в ту же таблицу занимает пару-тройку секунд?
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362324
XED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
30000? там пять нулей, да? :)
попробуй просто использовать другую СУБД. Скажем, SQL-Server, может, Oracle... просто не стоит лишний раз при серьезной работе опираться на Microsoft...
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362522
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XED30000? там пять нулей, да? :)
попробуй просто использовать другую СУБД. Скажем, SQL-Server, может, Oracle... просто не стоит лишний раз при серьезной работе опираться на Microsoft...
Да 30 000. Заливаю это дело через VB6 на компе с 512 мегами памяти и 800 пнем. Нужна именно локальная база в файловом формате.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362643
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно почти удвоить скорость заблокировав таблицу на время апдейта:
Код: plaintext
1.
2.
   Conn1.BeginTrans
   rs.UpdateBatch
   Conn1.CommitTrans
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362649
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще читал, что DAO работает на 30% быстрее с mdb.
Но в общем, такая скорость примерно и получится и для MS SQL и для оракла.
Для ускорения вставок таких объемов в них используются не совсем стандартные средства.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362655
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffМожно почти удвоить скорость заблокировав таблицу на время апдейта:
Код: plaintext
1.
2.
   Conn1.BeginTrans
   rs.UpdateBatch
   Conn1.CommitTrans

Не, жалкие 20 секунд выигрыша получились. Да и UpdateBatch тут не катит, юзер в это время наблюдает как прога повесилась и за одно повесила систему слегка и он в панике начинает жать на все подряд или даже на ресет :)
DAO тут впереди планеты всей, в разы! Проверил. Но не хочется с ним связываться, слишком много воплей по форумам что не на всякий комп встанет программа написанная с применением DAO. Или у народа руки кривые.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362720
XED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Послушай, браток, просто попробуй использовать более скоростные СУБД - Access для этой цели явно не подходит. И не в VB надо писать программу, работающую с этой БД. Это просто объективная реальность. Ты говоришь в первом сообщении, что если при использовании текстового файла время исчисляется единицами секунд... естественно! текстовый документ имеет последовательную структуру! А реляционные БД построены на ссылках и переходах - не зависимо от того имеются ли в ней ключи, индексы и прочая лабуда.
Советую просто использовать другие инструменты - другую СУБД (оракл, например, либо SQLServer), ну а если игра вообще стоит свеч, то имеет смысл разработать специализированную систему хранения данных (раз уж ты говоришь об одной таблице) и писать специально под эту систему скоростные процедуры доступа, обернуть их в библиотеку и пользовать хоть бы даже в том же VB
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362751
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребятки, я все понимаю - выходные, праздники... но такого я от вас не ожидал... :)) ну не подзревать же вас всех в том, что вы не знаете, с какой стороны подойти в таких случаях к Аксессу, а? ;))

1. сколько занимают 30 тыс. иттераций без добавления записи в таблицу (если заменить ".AddNew" на "debug.print rst(0).value")? Вы уверены, что это тормоза получателя данных, а не источника?

2. где физически находится получатель данных и кто к нему в этот момент подключен кроме Вас?

3. какие индексы, ключи, ограничения и связи наложены на таблицу-получатель? или вы считаете,что их переопределение не занимает у СУБД времени?

4. (собственно предложение), перегон таких объемов для клиент-серверных приложений иттерационными циклами - нонсенс и вопрос о времени в этом случае вообще не должен подниматься. Как правило - это разовые задачи для начального наполнения БД - пресловутая "конвертация" данных, которую можно и подождать пару минут. Если же очень надо, и быстро, то подключайте эти 30 тыс. строк в качестве таблицы (в каком-нить файловом виде они ведь у Вас хранятся?) и используйте INSERT INTO ... SELECT FROM... Это решит Вашу "проблему" за 1...5 сек.

5. если руки не из того места растут, то микрософт (вообще) и аксесс (в частности) тут не при чем. Пока из доступных файл-серверных БД он натурально лучший - не стоит его хаить и рекомендовать переход с него на что-то другое... уверен, что на этом "чем-то другом" ситуация будет такой же...

6. автор, будьте последовательны: если Вы используете конструкцию with...end with, то используйте ее для всех методов объекта - это сэкономит толику ресурсов.

XED30000? там пять нулей, да? :)
попробуй просто использовать другую СУБД. Скажем, SQL-Server, может, Oracle... просто не стоит лишний раз при серьезной работе опираться на Microsoft...
SQL Server тоже сделан на микрософте. Кроме того, иттерационный способ добавления записей займет у него примерно столько же времени... У Оракла - аналогично.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362758
shady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня была похожая задача, правда я писал всего 5 000 записей, но длилось это несколько секун, точно не знаю сколько, не проверял.
и дела я это так
Код: plaintext
cnn.Execute "insert into tempDB SELECT top " & txt_print.Text & " * From users WHERE REG IN (" & s & ") and k_tov1 in (" & s1 & ") and (date >=" + d + ") and (date <=" + d2 + ") and (IND is not null) and (date_print is null) and (obr is not null)"
на счет перехода на SQL из за 30 000 записей... ?? нафига?? у меня в MS Access 120 000 записей, и постоянно прибавляется, правда не значительно... скорость работы не уменьшается (по крайней мере не заметно), да к тому же сказано что нужно локально.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362815
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XEDПослушай, браток, просто попробуй использовать более скоростные СУБД - Access для этой цели явно не подходит. И не в VB надо писать программу, работающую с этой БД. Это просто объективная реальность. Ты говоришь в первом сообщении, что если при использовании текстового файла время исчисляется единицами секунд... естественно! текстовый документ имеет последовательную структуру! А реляционные БД построены на ссылках и переходах - не зависимо от того имеются ли в ней ключи, индексы и прочая лабуда.
Советую просто использовать другие инструменты - другую СУБД (оракл, например, либо SQLServer), ну а если игра вообще стоит свеч, то имеет смысл разработать специализированную систему хранения данных (раз уж ты говоришь об одной таблице) и писать специально под эту систему скоростные процедуры доступа, обернуть их в библиотеку и пользовать хоть бы даже в том же VB
Благодарю за совет, но ты ничего не понял и делать нужно на Access. 30000 это крайний случай с которым может столкнуться программа, т.е. проверка ее на большой нагрузке. Насчет тектового файла ты опять же ничего не понял, советую перечитать.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362819
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nibblesребятки, я все понимаю - выходные, праздники... но такого я от вас не ожидал... :)) ну не подзревать же вас всех в том, что вы не знаете, с какой стороны подойти в таких случаях к Аксессу, а? ;))

1. сколько занимают 30 тыс. иттераций без добавления записи в таблицу (если заменить ".AddNew" на "debug.print rst(0).value")? Вы уверены, что это тормоза получателя данных, а не источника?

2. где физически находится получатель данных и кто к нему в этот момент подключен кроме Вас?

3. какие индексы, ключи, ограничения и связи наложены на таблицу-получатель? или вы считаете,что их переопределение не занимает у СУБД времени?

4. (собственно предложение), перегон таких объемов для клиент-серверных приложений иттерационными циклами - нонсенс и вопрос о времени в этом случае вообще не должен подниматься. Как правило - это разовые задачи для начального наполнения БД - пресловутая "конвертация" данных, которую можно и подождать пару минут. Если же очень надо, и быстро, то подключайте эти 30 тыс. строк в качестве таблицы (в каком-нить файловом виде они ведь у Вас хранятся?) и используйте INSERT INTO ... SELECT FROM... Это решит Вашу "проблему" за 1...5 сек.

5. если руки не из того места растут, то микрософт (вообще) и аксесс (в частности) тут не при чем. Пока из доступных файл-серверных БД он натурально лучший - не стоит его хаить и рекомендовать переход с него на что-то другое... уверен, что на этом "чем-то другом" ситуация будет такой же...

6. автор, будьте последовательны: если Вы используете конструкцию with...end with, то используйте ее для всех методов объекта - это сэкономит толику ресурсов.

XED30000? там пять нулей, да? :)
попробуй просто использовать другую СУБД. Скажем, SQL-Server, может, Oracle... просто не стоит лишний раз при серьезной работе опираться на Microsoft...
SQL Server тоже сделан на микрософте. Кроме того, иттерационный способ добавления записей займет у него примерно столько же времени... У Оракла - аналогично.
Щас все объясню.
Мы (я), не совсем уж дураки/дубы/кретины, нужное подчеркнуть :) Никаких debug.print, doevents в эксперементах не участвовало. Доказательством того что это тормоза библиотек в том что при отключении действий с рекордсетами, цикл по данным в массиве пролетает за пару секунд.
1) Собственно вот, тормозит не получатель, а библиотека доступа, если я не очень криво выразился.

2) Физически получатель лежит в той же апке что и программа и кроме меня к ней не цепляется никто.

3) про ключи индексы и прочее я уже писал выше, для чистоты эксперимента их нет.

4) Как раз это решение и найдено, но выглядит оно несколько некрасиво. Так же найдено второе решение, а именно DAO без всяких файлов уделал ADO в разы.

5) Я только за Access да и VB не так уж плох как его хают.

6) Предполагаю что экономятся сущие копейки, но за замечание спасибо.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33362850
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никаких debug.print, doevents в эксперементах не участвовало. Доказательством того что это тормоза библиотек в том что при отключении действий с рекордсетами, цикл по данным в массиве пролетает за пару секунд.
Ээээ... Немного не то... Если внутри цикла обращения к данным нет ("debug.print... в эксперементах не участвовало"), то с уверенностью сказать, что тормозит получатель данных, нельзя.

1) Собственно вот, тормозит не получатель, а библиотека доступа, если я не очень криво выразился.
Сомневаюсь (см.выше). Какая версия ADO? 2.1?

3) про ключи индексы и прочее я уже писал выше, для чистоты эксперимента их нет.
Писали про ключи и индексы, а есть еще связи - в терминах Аксесса - это немного обособленная сущность :))

4) Как раз это решение и найдено, но выглядит оно несколько некрасиво. Так же найдено второе решение, а именно DAO без всяких файлов уделал ADO в разы.
Если оно быстрое, значит, красивое. Обернуть это все в функцию и будет совсем кузяво.

5) Я только за Access да и VB не так уж плох как его хают.
А это я не Вам, а советчикам перехода на серверные СУБД.

6) Предполагаю что экономятся сущие копейки, но за замечание спасибо.
Из копеек в цикле на 30 тыс. иттераций сложатся ощутимые десятки секунд. Тем более, если with...end with будет "выше", чем цикл прохода по НЗ.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363290
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Специально проверил: и оракл и sql server работают медленнее ;-)). Если делать вставку через SQL.
Отправить рекордсет в ексель - пара секунд. Импортировать лист екселя в аксесс - еще пара секунд. Против 48 секунд на языке SQL.
К сожалению не знаю как сделать программно заставить mdb заглотить лист ексель.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363393
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffСпециально проверил: и оракл и sql server работают медленнее ;-)). Если делать вставку через SQL.
Отправить рекордсет в ексель - пара секунд. Импортировать лист екселя в аксесс - еще пара секунд. Против 48 секунд на языке SQL.
К сожалению не знаю как сделать программно заставить mdb заглотить лист ексель.
Нее, вот это я точно не вытерплю.
Как вы можете сравнивать СУБД, которые лежат одна на локальном диске, другая установлена на сервере? Которые имеют абсолютно разные аппаратные требования (конфигурации машины и серверов вы не указали). Вы не указали наличие/отсутствие индексов. Количество текущих процессов на серверах. Уровень загрузки их процессоров на тот момент. Сколько выделено памяти под SQL и ORACLE? Или вы поставили на свою машинку с 256-ю метрами памяти и сиквел сервер, и оракл, и в итоге у вас получилось, что в аксесс быстрее пишется? Дык неправильно это.
Ни в жизть не поверю, чтобы вставка записей на нормально настроенный сиквел сервер (а уж тем более на оракл) работала медленней, чем в аксесс.
Как вы думаете, зачем их за такие деньги покупают?
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363413
авторНи в жизть не поверю, чтобы вставка записей на нормально настроенный сиквел сервер (а уж тем более на оракл) работала медленней, чем в аксесс.
даже не нужно начинать в этом сильно сомневаться.
"в среднем", без приложения "усилий", так и будет.

авторКак вы думаете, зачем их за такие деньги покупают?

- для того, чтобы обеспечить доступность данных для "очень большого количества клиентов"
- для того, чтобы обеспечить манипуляцию очень большими объемами данных.
- для обеспечения максимальной надежности хранилища данных.

а скорость вставки - здесь даже не третье дело.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363447
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А глупыйглупый - совсем не глупый.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363469
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глупыйглупый
а скорость вставки - здесь даже не третье дело.
Однако же на этих СУБД строят высокотранзакционыые системы со скоростями вставки в миллионы записей в сек. - и ничего не тормозит при этом.
Вы что, в аксессе можете добиться таких скоростей? Так что не стоит заявлять, что "и оракл и sql server работают медленнее".

To Worobjoff: так как же все-таки вы сравнивали?
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363553
Melkiades глупыйглупый
а скорость вставки - здесь даже не третье дело.
Однако же на этих СУБД строят высокотранзакционыые системы со скоростями вставки в миллионы записей в сек. - и ничего не тормозит при этом.

методом просто поковыривания пальцем в носу таких систем не построишь.
это требует умственного усилия и некоторой потраты денег.

Melkiades[
Вы что, в аксессе можете добиться таких скоростей? Так что не стоит заявлять, что "и оракл и sql server работают медленнее".

насчет "работают медленнее" - лично я ни разу ничего похожего не сказал.

я реагировал только на то, что - "может быть".
что один и тот же код, построенный на АДО рекордсетах, в большинстве случаев не покажет "прироста производительности" при простой смене хранилища с mdb на любое серверное решение. Вот с эти я согласен.

что же до абсолютных цифр - от локального мдб, для хорошо подобранных случаев в монопольном режиме 30000 - 50000 вставок в рекордсет на "обычном современном" компуктере достигается без особого напряжения. Чтобы опуститься ниже 500 - сейчас уже нужно приложить специальные усилия.

"на сети" 10-20 тыс. для достаточно "коротких" записей - тоже вполне видимое значение.

При том же коде и железе для любого "серверного" варианта нужно приложить немало ума, чтобы превысить, например, 2000. не говоря уже о "миллионах".
(При "том же коде" в среднем, пожалуй, бесполезно сравниваться.)
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363576
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkiadesTo Worobjoff: так как же все-таки вы сравнивали?
UpdateButch во всех случаях.
Oracle находится на другом компьютере и помощнее моего, сеть - сотка.
SQL-Server - на моем.
Вообще-то это логично. Одно лишь создание лога транзакции уже удваивает работу.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363675
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Worobjoff MelkiadesTo Worobjoff: так как же все-таки вы сравнивали?
Вообще-то это логично. Одно лишь создание лога транзакции уже удваивает работу.
Насколько я могу судить по кол-ву ваших сообщений (уж не обижайтесь), вы не сильны в знаниях ни сиквел сервера, ни оракла. Создание лога транзакций не только не удваивает работу, но и не увеличивает ее на сколько-нибудь ощутимое количество времени. К тому же средствами обоих серверов можно минимизировать кол-во записей в лог.
Если уж на то пошло, то и в сиквел сервере и в оракле есть утилиты, позволяющие делать массовые вставки в БД без использования лога и отключающие индексы на время работы (BULK INSERT и SQL * Loader сответственно).
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363719
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffДля ускорения вставок таких объемов в них используются не совсем стандартные средства.
...
Рейтинг: 0 / 0
Пишу 30000 строк в базу Access, как ускорить?
    #33363731
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffДля ускорения вставок таких объемов в них используются не совсем стандартные средства.
Согласен, но там эти средста по крайней мере есть.
Опять же, не совсем стандартные для чего? Для SQL 92?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пишу 30000 строк в базу Access, как ускорить?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]