Быстрое добавление уникальных записей в Access

Программирование на Visual Basic for Applications
MAGRAV
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 27.01.2011 (Чт) 11:57

Быстрое добавление уникальных записей в Access

Сообщение MAGRAV » 01.03.2019 (Пт) 8:38

Доброго времени суток форумчане!
Имею очень маленький опыт работы в Access, я не базист, но приличный опыт в VB, VBA.

На данный момент добавляю скриптом из Access данные из источников Excel или *.csv.
Ясное дело, что построчное добавление посредством INSERT INTO... дело не быстрое. На 2500 записей уходит порядка 3-5 минут в зависимости от тачки.
Это не годно совсем. А уж когда я каждый раз применяю DELETE FROM ... после каждого INSERT INTO, для удаления дубликатов, то ситуация само собой усугубляется в арифметической прогрессии по мере заполнения таблицы.

А готовлюсь я заполнять до нескольких сотен тысяч строк. И время на заполнение, к примеру, 800 000 записей я читаю нормальным 2 минуты, а не 12 недель, я ожидаю, в той конфигурации, что у меня.

Да я бы для себя проще поступил. Посредством коллекций+split+join из VBA-процедуры сформировал бы в список уникальных записей. И заняло бы это считанные секунды. Даже не желаемые 2 минуты. А потом бы единым куском закинул бы в Ассеss. И при каждом добавлении новых записей, выгружать всю таблицу целиком и повторять с ней предъидущие действия. Но это же не цивильный подход! За чем тогда SQL-запросы и Access. Они же должны быть эффективнее чем мои велосипеды?!

Подскажите в каком направлении двигаться?
Вложения
DB_рез_расч_ГДМ.rar
(178.05 Кб) Скачиваний: 169
URA_COMP_50_PERM_1_FRAC_mfx1.rar
(155.71 Кб) Скачиваний: 193
Уходя с аэродрома прихвати деталь для дома.

MAGRAV
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 27.01.2011 (Чт) 11:57

Re: Быстрое добавление уникальных записей в Access

Сообщение MAGRAV » 01.03.2019 (Пт) 12:43

Чувствую что кое где фигню порю:
Не надо каждый раз применять DELETE FROM ... после каждого INSERT INTO. :oops:

Но тем не менее вопрос по производительности остаётся открытым...

Можно ли в запросе INSERT INTO разом несколько записей сделать?
Уходя с аэродрома прихвати деталь для дома.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Быстрое добавление уникальных записей в Access

Сообщение ger_kar » 01.03.2019 (Пт) 20:20

1. Вопрос зачем нужно сначала добавлять записи, потом выявлять совпадения и удалять лишние вместо того, чтобы настроить индексирование или ключевые поля таким образом, чтобы в таблицу могли добавляться только уникальные записи? Тогда при добавлении записи, которая не является уникальной просто будет возникать ошибка, а сами данные в таблицу попадать не будут.
2.Насчет добавления записей. У вас запрос на добавление для каждой записи формируется заново и при этом выполняется куча не нужных строковых операций. Проще сформировать нужные параметрические запросы на добавление в самом Access и вызывать эти запросы просто передавая нужные значение как параметры. Будет гораздо быстрее. Можно добавить и таким способом. Сделать запрос вида "SELECT * FROM моя_таблица WHERE False", далее открыть рекордсет выполнив этот запрос. Так как условие в запросе всегда будет False, то такой рекордсет будет пустым. Далее в него добавлять записи и потом за один раз делать обновление внося данные в базу. Какой вариант будет быстрее - нужно ставить эксперимент. Плюс если таблицу настроить, так как указано в п.1, то при обновлении по второму варианту при возникновении ошибок нужно предусмотреть возможность обработки таких ошибок в событиях рекордсета. По этому первый путь проще.
Бороться и искать, найти и перепрятать

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Быстрое добавление уникальных записей в Access

Сообщение NashRus » 01.03.2019 (Пт) 23:41

в общем случае, судьба такой.
я тоже часто записи импортирую, медленно да.
Есть один только способ, BulkCopy. может и для Access он есть, в Sql юзаю.
а так...
Наличие первичного ключа проверяю по ошибки вставки, это быстрее чем селект запрашивать,
далее от логики, удалять, обновлять, вставлять.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Быстрое добавление уникальных записей в Access

Сообщение HandKot » 04.03.2019 (Пн) 8:13

для массовой вставки используется
DoCmd.TransferSpreadsheet
и DoCmd.TransferText
я в своё время использовал RunSavedImportExport
пихал в буфер, а там обрабатывал
I Have Nine Lives You Have One Only
THINK!

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Быстрое добавление уникальных записей в Access

Сообщение kibernetics » 04.03.2019 (Пн) 16:17

HandKot писал(а):для массовой вставки используется
DoCmd.TransferSpreadsheet
и DoCmd.TransferText
я в своё время использовал RunSavedImportExport
пихал в буфер, а там обрабатывал

А как это выглядит технически? В смысле, как использовать DoCmd в коннекшене?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Быстрое добавление уникальных записей в Access

Сообщение HandKot » 05.03.2019 (Вт) 7:54

kibernetics писал(а):А как это выглядит технически? В смысле, как использовать DoCmd в коннекшене?

думаю никак. Это объект Accessa
I Have Nine Lives You Have One Only
THINK!

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Быстрое добавление уникальных записей в Access

Сообщение kibernetics » 05.03.2019 (Вт) 11:17

Тогда, если ТС работает с данными из XLS/CSV, то вариант вставлять напрямую с этих таблиц,
Код: Выделить всё
       Dim AccessConn As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test Files\db1 XP.mdb")

        AccessConn.Open()

        'New table
        Dim AccessCommand As New System.Data.OleDb.OleDbCommand("SELECT * INTO [tbl1] FROM
        [Text;DATABASE=C:\Documents and Settings\...\My Documents\My Database\Text].[tbl1.txt]", AccessConn)
        'Existing table
        'Dim AccessCommand As New System.Data.OleDb.OleDbCommand("INSERT INTO [tbl1] (F1, F2, F3) 
        SELECT F1, F2, F3 FROM [Text;DATABASE=C:\Documents and Settings\...\My Documents\My Database\Text].[tbl1.txt]", AccessConn)

        AccessCommand.ExecuteNonQuery()
        AccessConn.Close()

ну и файл schema.ini должен содержать приблизительно такие сведения:
[*][tbl1.txt]
ColNameHeader=False
Format=TabDelimited
CharacterSet=ANSI

MAGRAV
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 27.01.2011 (Чт) 11:57

Re: Быстрое добавление уникальных записей в Access

Сообщение MAGRAV » 14.03.2019 (Чт) 14:42

ger_kar, Попробовал сделать всё, как описывалось. Совсем закрутился забыл отписать о результатах. С записью непосредственно в рекордсет действительно быстрее чем INSERT INTO раза в 2-3. Но что то с ошибкой завершалось и изменения не сохранялись. Передавать переменные параметры не пробовал. Воспользовался TransferSpreadsheet, как уже тут упоминали. Вот это то что надо!
Вложения
DB.7z
(111.74 Кб) Скачиваний: 200
Уходя с аэродрома прихвати деталь для дома.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

    TopList