|
|
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Экспериментирую тут с заливкой большого объема данных в базу 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 строк в ту же таблицу занимает пару-тройку секунд? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2005, 23:32:36 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
30000? там пять нулей, да? :) попробуй просто использовать другую СУБД. Скажем, SQL-Server, может, Oracle... просто не стоит лишний раз при серьезной работе опираться на Microsoft... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2005, 04:26:30 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
XED30000? там пять нулей, да? :) попробуй просто использовать другую СУБД. Скажем, SQL-Server, может, Oracle... просто не стоит лишний раз при серьезной работе опираться на Microsoft... Да 30 000. Заливаю это дело через VB6 на компе с 512 мегами памяти и 800 пнем. Нужна именно локальная база в файловом формате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2005, 14:46:01 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Можно почти удвоить скорость заблокировав таблицу на время апдейта: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2005, 19:27:53 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Еще читал, что DAO работает на 30% быстрее с mdb. Но в общем, такая скорость примерно и получится и для MS SQL и для оракла. Для ускорения вставок таких объемов в них используются не совсем стандартные средства. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2005, 19:53:28 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
WorobjoffМожно почти удвоить скорость заблокировав таблицу на время апдейта: Код: plaintext 1. 2. Не, жалкие 20 секунд выигрыша получились. Да и UpdateBatch тут не катит, юзер в это время наблюдает как прога повесилась и за одно повесила систему слегка и он в панике начинает жать на все подряд или даже на ресет :) DAO тут впереди планеты всей, в разы! Проверил. Но не хочется с ним связываться, слишком много воплей по форумам что не на всякий комп встанет программа написанная с применением DAO. Или у народа руки кривые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2005, 20:17:39 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Послушай, браток, просто попробуй использовать более скоростные СУБД - Access для этой цели явно не подходит. И не в VB надо писать программу, работающую с этой БД. Это просто объективная реальность. Ты говоришь в первом сообщении, что если при использовании текстового файла время исчисляется единицами секунд... естественно! текстовый документ имеет последовательную структуру! А реляционные БД построены на ссылках и переходах - не зависимо от того имеются ли в ней ключи, индексы и прочая лабуда. Советую просто использовать другие инструменты - другую СУБД (оракл, например, либо SQLServer), ну а если игра вообще стоит свеч, то имеет смысл разработать специализированную систему хранения данных (раз уж ты говоришь об одной таблице) и писать специально под эту систему скоростные процедуры доступа, обернуть их в библиотеку и пользовать хоть бы даже в том же VB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 01:37:08 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
ребятки, я все понимаю - выходные, праздники... но такого я от вас не ожидал... :)) ну не подзревать же вас всех в том, что вы не знаете, с какой стороны подойти в таких случаях к Аксессу, а? ;)) 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 тоже сделан на микрософте. Кроме того, иттерационный способ добавления записей займет у него примерно столько же времени... У Оракла - аналогично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 09:38:58 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
у меня была похожая задача, правда я писал всего 5 000 записей, но длилось это несколько секун, точно не знаю сколько, не проверял. и дела я это так Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 10:01:35 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
XEDПослушай, браток, просто попробуй использовать более скоростные СУБД - Access для этой цели явно не подходит. И не в VB надо писать программу, работающую с этой БД. Это просто объективная реальность. Ты говоришь в первом сообщении, что если при использовании текстового файла время исчисляется единицами секунд... естественно! текстовый документ имеет последовательную структуру! А реляционные БД построены на ссылках и переходах - не зависимо от того имеются ли в ней ключи, индексы и прочая лабуда. Советую просто использовать другие инструменты - другую СУБД (оракл, например, либо SQLServer), ну а если игра вообще стоит свеч, то имеет смысл разработать специализированную систему хранения данных (раз уж ты говоришь об одной таблице) и писать специально под эту систему скоростные процедуры доступа, обернуть их в библиотеку и пользовать хоть бы даже в том же VB Благодарю за совет, но ты ничего не понял и делать нужно на Access. 30000 это крайний случай с которым может столкнуться программа, т.е. проверка ее на большой нагрузке. Насчет тектового файла ты опять же ничего не понял, советую перечитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 13:33:20 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
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) Предполагаю что экономятся сущие копейки, но за замечание спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 13:42:48 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Никаких debug.print, doevents в эксперементах не участвовало. Доказательством того что это тормоза библиотек в том что при отключении действий с рекордсетами, цикл по данным в массиве пролетает за пару секунд. Ээээ... Немного не то... Если внутри цикла обращения к данным нет ("debug.print... в эксперементах не участвовало"), то с уверенностью сказать, что тормозит получатель данных, нельзя. 1) Собственно вот, тормозит не получатель, а библиотека доступа, если я не очень криво выразился. Сомневаюсь (см.выше). Какая версия ADO? 2.1? 3) про ключи индексы и прочее я уже писал выше, для чистоты эксперимента их нет. Писали про ключи и индексы, а есть еще связи - в терминах Аксесса - это немного обособленная сущность :)) 4) Как раз это решение и найдено, но выглядит оно несколько некрасиво. Так же найдено второе решение, а именно DAO без всяких файлов уделал ADO в разы. Если оно быстрое, значит, красивое. Обернуть это все в функцию и будет совсем кузяво. 5) Я только за Access да и VB не так уж плох как его хают. А это я не Вам, а советчикам перехода на серверные СУБД. 6) Предполагаю что экономятся сущие копейки, но за замечание спасибо. Из копеек в цикле на 30 тыс. иттераций сложатся ощутимые десятки секунд. Тем более, если with...end with будет "выше", чем цикл прохода по НЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 15:16:10 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Специально проверил: и оракл и sql server работают медленнее ;-)). Если делать вставку через SQL. Отправить рекордсет в ексель - пара секунд. Импортировать лист екселя в аксесс - еще пара секунд. Против 48 секунд на языке SQL. К сожалению не знаю как сделать программно заставить mdb заглотить лист ексель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 08:55:55 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
WorobjoffСпециально проверил: и оракл и sql server работают медленнее ;-)). Если делать вставку через SQL. Отправить рекордсет в ексель - пара секунд. Импортировать лист екселя в аксесс - еще пара секунд. Против 48 секунд на языке SQL. К сожалению не знаю как сделать программно заставить mdb заглотить лист ексель. Нее, вот это я точно не вытерплю. Как вы можете сравнивать СУБД, которые лежат одна на локальном диске, другая установлена на сервере? Которые имеют абсолютно разные аппаратные требования (конфигурации машины и серверов вы не указали). Вы не указали наличие/отсутствие индексов. Количество текущих процессов на серверах. Уровень загрузки их процессоров на тот момент. Сколько выделено памяти под SQL и ORACLE? Или вы поставили на свою машинку с 256-ю метрами памяти и сиквел сервер, и оракл, и в итоге у вас получилось, что в аксесс быстрее пишется? Дык неправильно это. Ни в жизть не поверю, чтобы вставка записей на нормально настроенный сиквел сервер (а уж тем более на оракл) работала медленней, чем в аксесс. Как вы думаете, зачем их за такие деньги покупают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 09:54:01 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
авторНи в жизть не поверю, чтобы вставка записей на нормально настроенный сиквел сервер (а уж тем более на оракл) работала медленней, чем в аксесс. даже не нужно начинать в этом сильно сомневаться. "в среднем", без приложения "усилий", так и будет. авторКак вы думаете, зачем их за такие деньги покупают? - для того, чтобы обеспечить доступность данных для "очень большого количества клиентов" - для того, чтобы обеспечить манипуляцию очень большими объемами данных. - для обеспечения максимальной надежности хранилища данных. а скорость вставки - здесь даже не третье дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 10:05:23 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
А глупыйглупый - совсем не глупый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 10:23:58 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
глупыйглупый а скорость вставки - здесь даже не третье дело. Однако же на этих СУБД строят высокотранзакционыые системы со скоростями вставки в миллионы записей в сек. - и ничего не тормозит при этом. Вы что, в аксессе можете добиться таких скоростей? Так что не стоит заявлять, что "и оракл и sql server работают медленнее". To Worobjoff: так как же все-таки вы сравнивали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 10:32:52 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Melkiades глупыйглупый а скорость вставки - здесь даже не третье дело. Однако же на этих СУБД строят высокотранзакционыые системы со скоростями вставки в миллионы записей в сек. - и ничего не тормозит при этом. методом просто поковыривания пальцем в носу таких систем не построишь. это требует умственного усилия и некоторой потраты денег. Melkiades[ Вы что, в аксессе можете добиться таких скоростей? Так что не стоит заявлять, что "и оракл и sql server работают медленнее". насчет "работают медленнее" - лично я ни разу ничего похожего не сказал. я реагировал только на то, что - "может быть". что один и тот же код, построенный на АДО рекордсетах, в большинстве случаев не покажет "прироста производительности" при простой смене хранилища с mdb на любое серверное решение. Вот с эти я согласен. что же до абсолютных цифр - от локального мдб, для хорошо подобранных случаев в монопольном режиме 30000 - 50000 вставок в рекордсет на "обычном современном" компуктере достигается без особого напряжения. Чтобы опуститься ниже 500 - сейчас уже нужно приложить специальные усилия. "на сети" 10-20 тыс. для достаточно "коротких" записей - тоже вполне видимое значение. При том же коде и железе для любого "серверного" варианта нужно приложить немало ума, чтобы превысить, например, 2000. не говоря уже о "миллионах". (При "том же коде" в среднем, пожалуй, бесполезно сравниваться.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 11:13:21 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
MelkiadesTo Worobjoff: так как же все-таки вы сравнивали? UpdateButch во всех случаях. Oracle находится на другом компьютере и помощнее моего, сеть - сотка. SQL-Server - на моем. Вообще-то это логично. Одно лишь создание лога транзакции уже удваивает работу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 11:22:08 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
Worobjoff MelkiadesTo Worobjoff: так как же все-таки вы сравнивали? Вообще-то это логично. Одно лишь создание лога транзакции уже удваивает работу. Насколько я могу судить по кол-ву ваших сообщений (уж не обижайтесь), вы не сильны в знаниях ни сиквел сервера, ни оракла. Создание лога транзакций не только не удваивает работу, но и не увеличивает ее на сколько-нибудь ощутимое количество времени. К тому же средствами обоих серверов можно минимизировать кол-во записей в лог. Если уж на то пошло, то и в сиквел сервере и в оракле есть утилиты, позволяющие делать массовые вставки в БД без использования лога и отключающие индексы на время работы (BULK INSERT и SQL * Loader сответственно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 11:55:11 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
WorobjoffДля ускорения вставок таких объемов в них используются не совсем стандартные средства. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 12:13:31 |
|
||
|
Пишу 30000 строк в базу Access, как ускорить?
|
|||
|---|---|---|---|
|
#18+
WorobjoffДля ускорения вставок таких объемов в них используются не совсем стандартные средства. Согласен, но там эти средста по крайней мере есть. Опять же, не совсем стандартные для чего? Для SQL 92? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 12:20:53 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=33362257&tid=2166909]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
205ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 498ms |

| 0 / 0 |
