Вопрос: Огромная база данных | Добавлено: 16.05.05 10:01 |
Автор вопроса: ![]() |
Имеется очень большая база данных (1500000 записей, около 20 полей) в формате DBASE IV (dbf). Требуется преобразовать одно поле из числового в символьное, после чего импортировать ее в ACCESS, а потом создать порядка
10 индексов, как простых, так и составных. Фишка в том, что все это я написал, но: вся операция занимает около часа, тогда как вручную, с использованием FoxPro и ACCESS - всего минут 30. Вопрос: как ускорить сей процесс??? (использую DAO) |
Ответы | Всего ответов: 27 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 16.05.05 11:22 |
Где-то что-то не ооптимально написал.
ЗЫ Невидя кода, довольно трудно судить о том в чем же трабла ![]() |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ICQ: 298826769 Вопросов: 53 Ответов: 1732 |
Профиль | Цитата | #2 | Добавлено: 16.05.05 11:48 |
Дык-к проще не куда: два компонента DATA,с помощью первого добавляется запись в mdb, с помощью второго читается из dbf и приравнивается новой записи, далее - переход на запись вперед. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 271202919 Вопросов: 56 Ответов: 837 |
Профиль | Цитата | #3 | Добавлено: 16.05.05 11:58 |
Тебя код просят показать, а не рассказывать как ты делал. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ICQ: 298826769 Вопросов: 53 Ответов: 1732 |
Профиль | Цитата | #4 | Добавлено: 16.05.05 14:23 |
Function ImportDBF() As Boolean
![]() StatusBar1.Panels(2).Text = "Импорт новых данных (" & Data2.Recordset.RecordCount & " ![]() StatusBar1.Refresh ProgressBar1.Min = 1: ProgressBar1.Max = Data2.Recordset.RecordCount + 1 ![]() ![]() ![]() With Data2.Recordset .MoveFirst ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() If Data2.Recordset.AbsolutePosition <> -1 Then ProgressBar1.Value = Data2.Recordset.AbsolutePosition Loop End With StatusBar1.Panels(2).Text = "Импортировано: " & Data1.Recordset.RecordCount If Err.Number = 0 Then ImportDBF = True Else ImportDBF = False End If End Function |
Номер ответа: 5 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #5 | Добавлено: 16.05.05 14:49 |
Data1.Recordset.Update не пробовал за цикл вынести? Чтобы не после каждой записи, а разом update делать? |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ICQ: 298826769 Вопросов: 53 Ответов: 1732 |
Профиль | Цитата | #6 | Добавлено: 16.05.05 15:26 |
Я конечно попробую, но вроде он будет ругаться:
после каждого AddNew кажется должно быть UpDate?... |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 16.05.05 15:58 |
А что нельзя сразу всю базу импортировать? Зачем по записям то? |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 16.05.05 16:05 |
Требуется преобразовать одно поле из числового в символьное Если длина поля не будет изменяться, то тип поля легко меняется в описателе полей. |
Номер ответа: 9 Автор ответа: ![]() ![]() Вопросов: 0 Ответов: 1066 |
Профиль | Цитата | #9 | Добавлено: 16.05.05 16:48 |
Не должен ругаться, AddNew - добавляет новую запись в Recordset, Update - сохраняет произведенные изменения/добавления Recordseta в базе. Выгодней все изменения/добавления разом сохранить, чем делать это после каждой записи отдельно. Т.е. сделать Update в конце, чтобы зафиксировать в базе последнее состояние Recordset'a. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ICQ: 298826769 Вопросов: 53 Ответов: 1732 |
Профиль | Цитата | #10 | Добавлено: 16.05.05 18:20 |
А каким макаром всю базу импортировать? И как програмно сменить тип данных с числового на символьный? А потом еще и trim для всего поля сделать??? |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ICQ: 298826769 Вопросов: 53 Ответов: 1732 |
Профиль | Цитата | #11 | Добавлено: 16.05.05 18:21 |
Если update делать ЗА циклом, то сохраняется последняя импортированная запись... Всего одна. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 16.05.05 18:43 |
А каким макаром всю базу импортировать? Средствами драйвера БД наверное. Я не утверждаю, а спрашиваю. Драйвер это сделает за тебя гораздо быстрее. Например открыть в формате DBF и сохранить в формате MDB. И как програмно сменить тип данных с числового на символьный? В DBF-ке, сразу за заголовком идёт описатель полей, в котором записаны размеры и типы полей для всей базы. Просто отсчитываешь нужное поле и перезаписываешь байт, определяющий его тип. А потом еще и trim для всего поля сделать??? Хм, сделать trim для реляционной БД? Зачем интересно, если длина поля от этого всё равно не изменится? Какова длина числового поля и какова длина планируемого текстового? |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ICQ: 298826769 Вопросов: 53 Ответов: 1732 |
Профиль | Цитата | #13 | Добавлено: 16.05.05 20:18 |
Хм, сделать trim для реляционной БД? Зачем интересно, если длина поля от этого всё равно не изменится? Какова длина числового поля и какова длина планируемого текстового?
После преобразования численного поля в текстовое перед числами добавляются пробелы (дополняет до длины поля). Мне же надо дабы цифры стояли сначала. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ICQ: 298826769 Вопросов: 53 Ответов: 1732 |
Профиль | Цитата | #14 | Добавлено: 16.05.05 20:22 |
Какова длина числового поля и какова длина планируемого текстового?
Что числовое, что текстовое - одинаковы. Надо просто поменять тип. Для поиска по LIKE. Заметил, что почему-то с текстом выборка идет быстрее. А на первом пне очень ощутимо быстрее. ![]() |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 17.05.05 00:04 |
А если пользоваться не контролами, а подключить DAO через References...
Можно еще попробовать потестить скорость ADO vs DAO ![]() |
|