Нормализация данных - массовые вставки с использованием цикла

Есть ли у кого-нибудь какие-либо советы, которые могут помочь ускорить процесс разбивки таблицы и вставки большого количества записей в новую таблицу.

В настоящее время я использую Access и VBA для преобразования таблицы, содержащей записи с большой строкой (700+ символов), в новую таблицу, где каждый символ имеет свою собственную запись (строку). Я делаю это, перебирая строку по 1 символу за раз и вставляя в новую таблицу, используя простой DAO в VBA.

В настоящее время я работаю с небольшим подмножеством данных - 300 записей, каждая со строкой из 700 символов. Этот процесс занимает около 3 часов, поэтому он не будет масштабироваться до полного набора данных из 50 000 записей!

структура таблицы 1

идентификатор — строка 001 — abcdefg

становится

структура таблицы 2

id-строка 001-a 001-b 001-c. . . . . .

Я открыт для любых предложений, которые могли бы улучшить ситуацию.

Ваше здоровье

Фил


person Community    schedule 19.05.2009    source источник


Ответы (3)


Рассмотрим этот пример с использованием Northwind. Создайте таблицу с именем Sequence с INTEGER (Access = Long Integer) и заполните ее значениями от 1 до 20 (т.е. таблица из 20 строк). Затем используйте этот код SQL синтаксиса ACE/Jet для анализа каждой буквы фамилий сотрудников:

SELECT E1.EmployeeID, E1.LastName, S1.seq, MID(E1.LastName, S1.Seq, 1)
  FROM Employees AS E1, Sequence AS S1
 WHERE S1.seq BETWEEN 1 AND LEN(E1.LastName);
person onedaywhen    schedule 19.05.2009
comment
Это действительно хорошее решение! никогда бы не подумал об этом! Можно ли вставить дату через sql, которая увеличивается на 1 для каждой записи? - person ; 19.05.2009
comment
Это очень много дат! INSERT INTO Table2 (TextString, RecDate) SELECT STR & s.Seq & & Mid(Field2,s.Seq,1) AS t, Date()+s.Seq AS d FROM Table1, Sequence AS s WHERE s.Seq Между 1 И 700 - person Fionnuala; 19.05.2009
comment
Здоровья, ребята! Для справки я получил SELECT E1.STUD_ID, Mid(E1.marks,S1.Seq,1) AS Mark, Abs(-1+(S1.Seq Mod 2)) AS Period,dateadd(d,int(([ S1].[Seq]-1)/2),E1.marksstart_date) AS Mdate FROM Final_Lac_2007 AS E1, Sequence2 AS S1 WHERE (((S1.seq) Между 1 и Len([E1].[marks]))) ; Поскольку мне нужно было увеличивать дату каждый второй номер, поскольку я работаю с данными о посещаемости, которые имеют два сеанса в день. ушло с › 3 часов на ‹ 10 секунд :) - person ; 19.05.2009

При выполнении массовой вставки вы часто можете получить существенное повышение производительности, удаляя индексы таблицы, выполняя массовую вставку, а затем восстанавливая индексы. В одном случае, когда я вставил пару миллионов записей в таблицу MySQL, я увидел, что это сократило время выполнения с 17 часов до примерно 20 минут.

Я не могу конкретно посоветовать, что касается Access (я не использовал его со времен Access 2, 15 или около того лет назад), но общий метод применим практически к любому движку базы данных.

person Dave Sherohman    schedule 19.05.2009
comment
Привет, спасибо за подсказку, таблицы в настоящее время не имеют индексов, думаю, проблема с производительностью сводится к необходимости запускать отдельный оператор вставки для каждой записи. - person ; 19.05.2009

У нас есть процедура, которая транспонирует данные. Не уверен, оптимизирован ли код, но он работает значительно быстрее после сжатия файла.

Многократное удаление и перестроение таблиц значительно увеличивает размер файла .mdb.

person JeffO    schedule 19.05.2009