|
автор: Improver (07.09.2006 в 00:00) |
|
| Подскажите, плз., по сабжу...
На базе одного из примеров сделал так (с сокращениями):
-----------
Sub transfer(strTableNameS As String, strTableNameN As String)
Dim db As Database
Dim rss As DAO.Recordset
Dim rsn As DAO.Recordset
Dim str As String
Dim lngRecordCount As Long
Dim fldField As DAO.Field
Set db = CurrentDb
Set rss = db.OpenRecordset(strTableNameS, dbOpenDynaset)
If rss.RecordCount <> 0 Then
Set rsn = db.OpenRecordset(strTableNameN, dbOpenDynaset)
rss.MoveLast
lngRecordCount = rss.RecordCount
rss.MoveFirst
Debug.Print "Количество записей в таблице """ & _
strTableNameS & """: " & lngRecordCount
Do Until rss.EOF
rsn.AddNew
For Each fldField In rss.Fields
If fldField.Value <> "" Then
rsn(fldField.Name) = fldField.Value
End If
Next fldField
rsn.Update
rss.MoveNext
Loop
rsn.Close
Else
Debug.Print "Таблица """ & strTableNameS & _
""" не содержит записей."
End If
Debug.Print "Конец обработки."
rss.Close
db.Close
Exit Sub
End Sub
------------
Скорость обработки -- тысяча строк таблицы за 9,5 минуты! А таблицы есть и в 100 тысяч строк...
Подскажите, как это можно оптимизировать, т.е. ускорить обработку? | |
|
| |
|
автор: osmor (07.09.2006 в 00:00) |
|
| sql запрос INSERT INTO таблица2
SELECT *
FROM таблица1;
добавит все записи из таблица1 в таблицу2 | |
|
| |
|
автор: osmor (07.09.2006 в 00:00) |
|
| и скажите где Вы такой пример взяли.... | |
|
| |
|
автор: Improver (08.09.2006 в 00:00) |
|
| Re: и скажите где Вы такой пример взяли.... Да тут же и взял, как за основу это: http://hiprog.com/access/article.asp?id=224
Писатель из меня еще тот... | |
|
| |
|
автор: osmor (08.09.2006 в 00:00) |
|
| ну это ж просто демонстрация работы с Recordset... его нельзя так буквально | |
|
| |
|
автор: Improver (25.09.2006 в 10:02) |
|
| А как надо? Что в приведенном фрагменте не так? | |
|
| |
|
автор: Improver (08.09.2006 в 00:00) |
|
| Re: sql запрос Хм... Надо будет попробовать...
А если еще понадобится поля изменять? (некоторые таблицы не совсем совпадают) | |
|
| |
|
автор: osmor (08.09.2006 в 00:00) |
|
| попробуте в конструкторе запросов построить запрос на добавление + Help по SQL если структура таблиц не одинаковая, тогда нужно будет указывать соответствие полей | |
|
| |
|
автор: Improver (25.09.2006 в 10:01) |
|
| Пока форум был недоступен испробовал несколько разных методов, работа в настоящее время фактически выполнена. Да, еще забыл сказать, что таблицы эти подключаются через ODBC. Вот выводы:
1. SQL-запрос, как это ни странно, ничуть не быстрее приведенного выше скрипта.
2. Если юзать ADODB вместо DAO, с прямым подключением к базам и промежуточным кешем и пакетной обработкой, то скорость можно поднять раз в десять, но он может обработать только часть таблиц, некоторые, по стечению обстоятельств, самые "жирные" не берет -- ошибка ODBC. :-(
3. Импорт исходной таблицы в Access дает повышение скорости обработки примерно на 25-50%, хотя и занимает определенное время.
4. Размещение баз на RAM-диске позволяет поднять скорость обработки примерно в четыре раза.
И самое неприятное -- при любом методе получаем неприятный вылет всего аццесса, как правило после 10-20 тыс. обработанных строк. Приходится продолжать с последней обработанной записи... | |
|
| |
|
|
|
| Кончено ODBC несколько меняет дело, но не сильно...
По моим представлениям, запрос должет работать на пару порядков быстрее скрипта(ну при ODBC возможно на порядок)
ПРи импорте данных в ACCESS уж точно запрос должен быть значительно быстрее.
Какой источник данных? Если Вы используете ADODB, то ван не нужно использовать ODBC (это альтернативные способы доступа)
Используйте всесто связанных таблиц "запрос к серверу", тогда работать будет быстрее, но запросы нужно будет писать используя синтаксис источника (т.е. если это MySQL то синтаксис запроса должен быть MYsql, а не ACCESS (JET)) | |
|
| |
|
автор: Improver (04.10.2006 в 08:11) |
|
| >Какой источник данных?
TopSpeed ODBC Driver. Базы данных были из Clarion.
>Если Вы используете ADODB, ...... Используйте всесто связанных
>таблиц "запрос к серверу", тогда работать будет быстрее, но запросы
>нужно будет писать используя синтаксис источника (т.е. если это MySQL то
>синтаксис запроса должен быть MYsql, а не ACCESS (JET))
Так, в принципе, и делал. Работет на порядок быстрее, но на некоторых таблицах вылетает ошибка. | |
|
| |
|
|
|
| >Так, в принципе, и делал. Работет на порядок быстрее, но на некоторых таблицах вылетает >ошибка.
Про Clarion знаю только то, что он есть ...
А какая ошибка? | |
|
| |