С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
1

Как ускорить запись в БД?

18.10.2015, 18:44. Показов 2078. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый всем день!
Имеем: БД Sybase SQL Anywhere 5, Access2003.
Подключаюсь через ODBC драйверы.
В Sybase может быть открыта только одна база (такая версия).
Задача: скопировать часть данных из основной БД в чистую для каких-либо нужд.
Выполняю: с помощью INSERT INTO копирую несколько таблиц в промежуточный MDB, закрываю основную БД, открываю новую пустую БД, копирую из MDB.
Проблема в том, что есть одна таблица, в которой около 1 млн записей. Из Sybase в MDB эта таблица копируется около 30 сек. А вот обратный процесс - 6 часов!
Помогите кто чем.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2015, 18:44
Ответы с готовыми решениями:

Как ускорить запись массива в файл?
Здравствуйте. Уважаемые программисты, помогите решить проблему с записью массивов в файлы. ...

VBS+MSSQL2008 - как ускорить запись большого количества данных в БД?
Доброго времени суток! В общем, есть задача записи в базу данных под mssql 2008 большого количества...

Mongodb, Mongoid как ускорить запись данных в Mongodb
Добрый вечер всем! Мне нужно записать в Mongodb 2.000.000 рядов информации, по очереди, один за...

Как ускорить запись данных в базу данных?
Добрый день. Есть следующий тестовый код: class MyClass { public int a; public int b;...

17
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
18.10.2015, 18:58 2
Попробуйте сжать и восстановить базу перед обратным копированием.
1
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.10.2015, 19:07 3
+1 к рекомендации ltv_1953. А также возможно, что таблица в мдб без ключей, на что скл-серверы как правило реагируют очень болезненно. Если ввести ключ в таблицу, то можно ждать ускорения перезаписи.
2
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
18.10.2015, 19:30  [ТС] 4
ltv_1953 В настройках MDB стоит "Сжимать при закрытии". Я его закрываю перед перезапуском БД Sybase.

mobile В этой большой таблице всего 3 поля, ключ сложный - по двум полям (но это в Sybase). В МДБ я копирую запросом SELECT INTO новая_таблица FROM таблица_сбс, а обратно - INSERT INTO из МДБ в существующую пустую таблицу. При копировании из МДБ WHERE и ORDER BY не использую, просто все записи.
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
18.10.2015, 19:39 5
Непонятно, что тормозит, выборки из mdb или добавление записей в Sybase. Если в таблицах Sybase много индексов или триггеры for insert замороченные, а данные в mdb заведомо корректны, то может перед добавлением их удалить, а потом добавить?
4
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.10.2015, 19:45 6
Саны4, несложно добавить индексы в мдб. Вручную или запросом
SQL
1
ALTER TABLE Таблица_в_МДБ ADD CONSTRAINT PrimaryKey PRIMARY KEY (Поле1,Поле2)
2
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
18.10.2015, 19:49  [ТС] 7
ltv_1953, mobile спасибо. Во вторник буду на работе проверю оба варианта. Отпишусь.
0
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.10.2015, 19:56 8
Есть еще версия тормозов обратной перезаписи. Если размер файла MDB близок к 2 гигабайтам, то в любом случае будет тормозить нещадно. Тогда имеет смысл делить на 2 файла с последовательной записью в сибэйз.
1
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
18.10.2015, 20:48  [ТС] 9
После копирования из Sybase размер MDB всего около 100 Мб.
0
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
20.10.2015, 21:03  [ТС] 10
И снова здравствуйте!
Ничего из вышеперечисленного не помогло.
Замечено - при копировании из MDB прогрессбар в Акцессе первые процентов 30-35 пролетает за 3 сек, затем до 50 % - минут 15, и всё - дальше еле-еле. Кстати, также очень долго идет удаление большого количества записей. Если копировать или удалять до 10 000 примерно записей, то все более-менее быстро. Наверное придется копировать кусками. Если таблица находится в MDB, таких проблем нет, только с Sybase. Думается, что в Sybase что-то с выделением памяти или настройками БД. Вдогонку - одна странность (или так должно быть): если из БД Sybase удалить записи (до 10 000), то размер базы не меняется, а если удалить больше - 20 - 30 тыс, то размер БД даже увеличивается.
0
шапоклякистка 8-го дня
3680 / 2240 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
21.10.2015, 17:25 11
Цитата Сообщение от Саны4 Посмотреть сообщение
а если удалить больше - 20 - 30 тыс, то размер БД даже увеличивается.
Может, причиной - ведение лога изменений для возможности восстановления?

Цитата Сообщение от Саны4 Посмотреть сообщение
а обратно - INSERT INTO из МДБ в существующую пустую таблицу.
А если не вставкой в существующую таблицу, а экспортом целиком всей таблицы (Внешние данные -> Экспорт в базу данных ODBC), а потом уже в Sybase или допилить структуру таблицы, или сделать Select из экспортированной в нужную?

И уже чисто из любопытства: а из Sybase сделать Select из .mdb - вообще возможно? Если да - мне кажется, будет быстрее, чем экспорт из аксес.
1
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
21.10.2015, 19:25  [ТС] 12
Может, причиной - ведение лога изменений для возможности восстановления?
Да нет, лог отключен.
а из Sybase сделать Select из .mdb - вообще возможно? Если да - мне кажется, будет быстрее, чем экспорт из аксес.
В Sybase есть утилитка SybaseCеntral, очень убогая (СУБД прошлого века начала 90-х), там есть экспорт/импорт только в текстовый файл. Да и задача стоит - из формы Акцесса нажатием одной кнопки - экспорт, другой - импорт. Вобщем помучав базу, порыв Инет, понял, что проблема в Sybase. Но БД чужая, ковырять нельзя. Наверное придется закрывать тему. Спасибо всем за участие!
0
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
21.10.2015, 23:41 13
Цитата Сообщение от Саны4 Посмотреть сообщение
Наверное придется копировать кусками
Предлагаю процедуру для копирования кусками
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub session()
    Dim N 'количество разбиений
    Dim K 'количество записей в большой таблице
    Dim tblname 'Имя аксовской большой таблицы
    Dim n1, n2, nmax, nn, s, sw, i
    Dim db As DAO.Database
    Dim t1, t2
    
    Set db = CurrentDb
    tblname = "BigTabl" 'имя таблицы в Access. Напишите истинное имя
    
    'Если нет счетчика добавляем.
    'Если в аксовской таблице уже есть счетчик, закомментируйте следующие 2 строки
    s = "alter table [" & tblname & "] add column id counter "
    db.Execute s
    
    'Находим максимальный и минимальный номера счетчика
    With db.OpenRecordset("select * from [" & tblname & "] order by id")
        n1 = .Fields("id")
        .MoveLast:
        nmax = .Fields("id")
    End With
    
    N = 10 'Можно задать любое другое количество сессий записи
 
    nn = nmax \ N
    n2 = K + nn
    t1 = VBA.Timer
    For i = 1 To N
        'Строка запроса на вставку в Sybase
        s = "insert into (...) ... from BigTabl ... "
        
        'Фильтр на количество записей в сессию
        sw = "where id between " & n1 & " and " & n2
        db.Execute s & vbCrLf & sw
        n1 = n2 + 1
        n2 = n1 + nn
        t2 = VBA.Timer
        
        'Напечатать начальный и конечный номера id в сессии и время вставки
        Debug.Print n1, n2, t2 - t1
        t1 = t2
    Next
End Sub
0
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
22.10.2015, 17:51  [ТС] 14
Цитата Сообщение от mobile Посмотреть сообщение
Предлагаю процедуру для копирования кусками
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub session()
    Dim N 'количество разбиений
    Dim K 'количество записей в большой таблице
    Dim tblname 'Имя аксовской большой таблицы
    Dim n1, n2, nmax, nn, s, sw, i
    Dim db As DAO.Database
    Dim t1, t2
    
    Set db = CurrentDb
    tblname = "BigTabl" 'имя таблицы в Access. Напишите истинное имя
    
    'Если нет счетчика добавляем.
    'Если в аксовской таблице уже есть счетчик, закомментируйте следующие 2 строки
    s = "alter table [" & tblname & "] add column id counter "
    db.Execute s
    
    'Находим максимальный и минимальный номера счетчика
    With db.OpenRecordset("select * from [" & tblname & "] order by id")
        n1 = .Fields("id")
        .MoveLast:
        nmax = .Fields("id")
    End With
    
    N = 10 'Можно задать любое другое количество сессий записи
 
    nn = nmax \ N
    n2 = K + nn
    t1 = VBA.Timer
    For i = 1 To N
        'Строка запроса на вставку в Sybase
        s = "insert into (...) ... from BigTabl ... "
        
        'Фильтр на количество записей в сессию
        sw = "where id between " & n1 & " and " & n2
        db.Execute s & vbCrLf & sw
        n1 = n2 + 1
        n2 = n1 + nn
        t2 = VBA.Timer
        
        'Напечатать начальный и конечный номера id в сессии и время вставки
        Debug.Print n1, n2, t2 - t1
        t1 = t2
    Next
End Sub
Предлагаю процедуру для копирования кусками
Спасибо за пример. Как счетчик можно же использовать Recordcount?
0
шапоклякистка 8-го дня
3680 / 2240 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
22.10.2015, 18:25 15
Цитата Сообщение от Саны4 Посмотреть сообщение
Спасибо за пример. Как счетчик можно же использовать Recordcount?
Вам нужно не количество записей, а значения ключа. Если ключа не было и вы создали его программно - то да, скорее всего, нумерация будет от 1 до числа записей. Но если ключ в таблице уже был - более чем вероятно, что номера не подряд.
0
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
22.10.2015, 18:50  [ТС] 16
Цитата Сообщение от texnik-san Посмотреть сообщение
Вам нужно не количество записей, а значения ключа.
Точно, повнимательней сейчас посмотрел.
Что ж, так и буду делать.

Добавлено через 14 минут
Вот еще задачка возникла.
Таблица А - 2 поля, коды приборов и данные из приборов, 12 000 записей.
Таблица Б - 2 поля те же, но в 1-м около 100 записей, 2-е пусто.
Нужно из таблицы А скопировать данные 2-го поля в те строки таблицы Б, где коды приборов совпадают.
Вроде внятно изложил.
Можно конечно перебором и сравнением, но что-то мне подсказывает, что можно проще и быстрее.
0
Эксперт MS Access
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
22.10.2015, 18:59 17
Например
SQL
1
UPDATE А INNER JOIN Б ON А.Код = Б.Код SET Б.Данные = А.Данные;
2
8 / 8 / 0
Регистрация: 18.10.2015
Сообщений: 21
22.10.2015, 19:09  [ТС] 18
Спасибо! Век живи - век учись...
0
22.10.2015, 19:09
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2015, 19:09
Помогаю со студенческими работами здесь

Ускорить запись в файл
Очень большое число вычисляется с помощью BigInteger около 2 секунд. а в файл записывается уже 2...

Ускорить запись в базу
Здравствуйте. Подскажите пожалуйста, как ускорить процесс записи информации в базу данных? А то...

ActiveQt - ускорить запись данных
Вообщем суть такая. Создал тестовый проект и записываю мусор в 10 листов по 10 столбцов по 2300...

Ускорить запись формул в ячейки
Доброго времени суток! Есть файл с большим количеством записей (около 100 000 строк и 40...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru