Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADO и Update / 25 сообщений из 28, страница 1 из 2
30.10.2006, 11:26
    #34090404
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Почему при обновлении таблицы, а именно при добавлении записей - это добавление с каждым разом все медленне и медленнее?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
l_objRecordSetAdd.CursorLocation = adUseServer
l_objRecordSetAdd.Open "SELECT * FROM customers WHERE .F. INTO CURSOR cur_add_", l_objDBCConnection, adOpenStatic, adLockOptimistic

If (l_objRecordSetAdd.State = adStateOpen) Then
   For ln_index =  0  To  2000 
      l_objRecordSetAdd.AddNew

      ' цикл присваивающий необходимые значения полям Recordset'а

      l_objRecordSetAdd.Update
      
      If (Err <>  0 ) Then
            l_objLog.m_WriteLine "Error - " & Err.Description
            l_objRecordSetAdd.CancelUpdate
            Err.Clear
      End If
   Next ln_index
End If


Вот это все хозяйство почему-то с 700 добавленной записи начинает постепенно замедляться, и все медленнее и медленнее добавляет. Делал и с отсоединенным рекордсетом, таже фигня. И с транзакцией и без, все тоже. Где собака порылась?
...
Рейтинг: 0 / 0
30.10.2006, 11:34
    #34090436
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Потому что нефиг юзать курсоры.
Вообще в первый раз вижу такое использование курсоров - SELECT INTO CURSOR
...
Рейтинг: 0 / 0
30.10.2006, 11:45
    #34090484
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
В таком случае как мне добавлять записи. А кроме добавления есть еще и модификация, причем тоже пакетная.
...
Рейтинг: 0 / 0
30.10.2006, 11:48
    #34090494
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Мне надо создать на сервере курсор аналогичный какой-либо таблице и заполнить его новыми записями, чтобы потом с этим курсором работать.
...
Рейтинг: 0 / 0
30.10.2006, 11:51
    #34090512
bubucha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
так а не нельзя одним инсертом вставить, нафига в цикле?
...
Рейтинг: 0 / 0
30.10.2006, 11:57
    #34090544
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Надо подумать, у меня просто не все значения могут присутствовать для вставки. И еще, чем так плох запрос

Код: plaintext
1.
l_objRecordSetAdd.Open "SELECT * FROM customers WHERE .F. INTO CURSOR cur_add_", l_objDBCConnection, adOpenStatic, adLockOptimistic

Собственно как раз и создает мне пустой курсор, идентичный таблице customers. И обратиться я потом к нему могу

Код: plaintext
1.
RecorSet.Open "SELECT * FROM cur_add_"
...
Рейтинг: 0 / 0
30.10.2006, 12:07
    #34090595
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Вам надо создать 2000 записей в БД с null-значениями во всех полях?
И это обязательно сделать на стороне сервера?
...
Рейтинг: 0 / 0
30.10.2006, 12:10
    #34090606
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Pr0teusМне надо создать на сервере курсор аналогичный какой-либо таблице и заполнить его новыми записями, чтобы потом с этим курсором работать.
Попытался представить себе ситуацию, при которой обычные SELECT, UPDATE и DELETE не справятся - и не смог. Зачем здесь курсор?
Бедный сервер...
...
Рейтинг: 0 / 0
30.10.2006, 12:22
    #34090657
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Мне надо создать на стороне сервера курсор и заполнить его более чем 2000 записями с не пустыми значениями (тут просто для примера привел). Долго все это дело работает и при новых итерациях все замедляется и замедляется, хотя и понятно - ведь все новая втавка в рекордсет занимает с каждым разом больше времени.
...
Рейтинг: 0 / 0
30.10.2006, 12:27
    #34090679
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
А зачем вставлять через курсор ? Есть же хранимка, есть connection.execute .
...
Рейтинг: 0 / 0
30.10.2006, 12:31
    #34090708
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
По поводу Execute я тоже подумал, но как полученный курсор сделать, чтобы он мог принимать записи по INSERT.

Код: plaintext
1.
2.
3.
l_strSQLTmp = "SELECT * FROM customers WHERE .F. INTO CURSOR cur_add_"
l_objDBCConnection.Execute(l_strSQLTmp)

...
Рейтинг: 0 / 0
30.10.2006, 12:33
    #34090718
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Еще раз повтояряюсь, мне нужен курсор идентичный таблице.
...
Рейтинг: 0 / 0
30.10.2006, 13:00
    #34090849
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Еще раз интересуюсь: чем обычная выборка из таблицы вас не устраивает?
...
Рейтинг: 0 / 0
30.10.2006, 13:04
    #34090875
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Меня обычная выборка всем устраивает. Но мне нужна не выборка, а курсор на сервере, чтобы в него перегнать большие данные за раз, а потом манипулировать ими, а именно делать уже из него выборки и сравнения с информацией, что храниться в той таблице, на основе которой он сделан.
...
Рейтинг: 0 / 0
30.10.2006, 13:09
    #34090896
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Pr0teusЕще раз повтояряюсь, мне нужен курсор идентичный таблице.Можно сделать временную таблицу идентичную нужной, пакетно добавить записи в нее, Pr0teusа потом манипулировать ими, а именно делать уже из него выборки и сравнения с информацией, что храниться в той таблице, на основе которойона сделана.
Без всяких курсоров и тормозов.
...
Рейтинг: 0 / 0
30.10.2006, 13:28
    #34090990
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Хорошо, и как мне сделать еще одну таблицу, ведь я не знаю ни ее полей, ни типов. Все что у меня есть это ее название и файл с данными для загрузки, при чем в нем могут быть информация только по части полей. Например в таблице храняться Фамилия и Имя, а в файле только Фамилия, и нужно эти новые Фамилии в сервер загрузить и только новые, т.е. те что есть в БД откидываются (это как пример).
...
Рейтинг: 0 / 0
30.10.2006, 13:53
    #34091099
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
cn.CursorLocation = adUseClient
cn.Open
cn.Execute "select top 0 * into #tmp from " & table 'Создается таблица
rs.Open "select * from #tmp", cn, adOpenStatic, adLockBathOptimistic 'Делается выборка
...
rs.AddNew 'Добавляются записи
...
rs.UpdateBatch 'Все загоняется в базу
А дальше сам, тебе виднее что с чем сравнивать.
...
Рейтинг: 0 / 0
30.10.2006, 14:11
    #34091183
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Мне это не поможет, т.к. БД - это Fox Pro 6
...
Рейтинг: 0 / 0
30.10.2006, 14:12
    #34091189
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Antonariy, не факт, что в СУБД, где работает синтаксис типа "WHERE .F. INTO CURSOR" присутствуют временные таблицы. Впрочем, ее можно заменить и на постоянную, а потом убить.
...
Рейтинг: 0 / 0
30.10.2006, 14:21
    #34091230
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Постоянная таблица - это самый крайний шаг, в БД не должно остаться ничего лишнего. Поэтому и хочеться временную структуру.
...
Рейтинг: 0 / 0
30.10.2006, 14:42
    #34091333
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Ёклмн, афтор, если б ты самого начала сказал, что это фокс, я бы вообще не лез с советами. По умолчанию SQL server или Access.
...
Рейтинг: 0 / 0
30.10.2006, 17:29
    #34092060
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Создается такое впечатление, что этот ADO не приспособлен для обновления больших объемов данных. Почему-то и память кушает и вставки теже замедляются. Да и в связке с Fox Pro 6 тоже не ахти. Хз в общем.
...
Рейтинг: 0 / 0
30.10.2006, 17:52
    #34092130
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
А зачем в ADO использовать.
Если это FOX, то файл можно писать напрямую. Открыли For Binary и поехали.
Вот пример
...
Рейтинг: 0 / 0
30.10.2006, 20:04
    #34092394
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Pr0teusСоздается такое впечатление, что этот ADO не приспособлен для обновления больших объемов данных. Почему-то и память кушает и вставки теже замедляются. Да и в связке с Fox Pro 6 тоже не ахти. Хз в общем.Не надо валить на ADO фоксовские проблемы. На sql сервер через updatebatch 2000 записей влетают меньше, чем за секунду через то же ADO. Почему замедляется уже объяснили, а память кушает потому, что курсор находится в памяти, и записи добавляются в память, тогда как временные таблицы того же sql сервера хранятся в базе tempdb, соответственно в файле tempdb_data.mdf.
...
Рейтинг: 0 / 0
30.10.2006, 21:58
    #34092486
Pr0teus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO и Update
Напрямую из Fox'а я не стал лишь потому, что ADO без проблем биндит данные, т.е. мне не надо заботиться о типах, т.к. загрузка идет из XML файла.
По поводу быстроты, то сделал тест, такой же цикл вставка 10000 записей в таблицу из 20 полей char все в 1-й транзакции, то прошло влет. Не могу врубиться почему, когда из XML вставляю поля, то съедается так много памяти и так все замедляется.
Хотя по отдельности все очень быстро.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADO и Update / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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