Страница: 1 | 2 |
Вопрос: Огромная база данных
Добавлено: 16.05.05 10:01
Автор вопроса: Arseny | ICQ: 298826769
Имеется очень большая база данных (1500000 записей, около 20 полей) в формате DBASE IV (dbf). Требуется преобразовать одно поле из числового в символьное, после чего импортировать ее в ACCESS, а потом создать порядка
10 индексов, как простых, так и составных.
Фишка в том, что все это я написал, но:
вся операция занимает около часа, тогда как вручную,
с использованием FoxPro и ACCESS - всего минут 30.
Вопрос: как ускорить сей процесс??? (использую DAO)
Ответы
Всего ответов: 27
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 16.05.05 11:22
Где-то что-то не ооптимально написал.
ЗЫ
Невидя кода, довольно трудно судить о том в чем же трабла
Номер ответа: 2
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #2
Добавлено: 16.05.05 11:48
Дык-к проще не куда: два компонента DATA,с помощью первого добавляется запись в mdb, с помощью второго читается из dbf и приравнивается новой записи, далее - переход на запись вперед.
Номер ответа: 3
Автор ответа:
ViktorZ
ICQ: 271202919
Вопросов: 56
Ответов: 837
Профиль | | #3
Добавлено: 16.05.05 11:58
Тебя код просят показать, а не рассказывать как ты делал.
Номер ответа: 4
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #4
Добавлено: 16.05.05 14:23
Function ImportDBF() As Boolean
 ata2.Recordset.MoveLast: Data2.Recordset.MoveFirst
StatusBar1.Panels(2).Text = "Импорт новых данных (" & Data2.Recordset.RecordCount & ""
StatusBar1.Refresh
ProgressBar1.Min = 1: ProgressBar1.Max = Data2.Recordset.RecordCount + 1
 ata1.DatabaseName = Text2.Text
 ata1.RecordSource = "SELECT * FROM Setludi"
 ata1.Refresh
With Data2.Recordset
.MoveFirst
 o While Not .EOF
 ata1.Recordset.AddNew
 ata1.Recordset!Q = !Q
 ata1.Recordset!QPRZ = !QPRZ
 ata1.Recordset!NDOG = !NDOG
 ata1.Recordset!NAMEWK = !NAMEWK
 ata1.Recordset!S_POL = !S_POL
 ata1.Recordset!N_POL = Trim(Str(!N_POL))
 ata1.Recordset!DP = !DP
 ata1.Recordset!Jt = !Jt
 ata1.Recordset!FAM = !FAM
 ata1.Recordset!IM = !IM
 ata1.Recordset!OT = !OT
 ata1.Recordset!DR = !DR
 ata1.Recordset!SN_PASP = !SN_PASP
 ata1.Recordset!W = !W
 ata1.Recordset!POSELEN = !POSELEN
 ata1.Recordset!SELSOVET = !SELSOVET
 ata1.Recordset!RAION = !RAION
 ata1.Recordset!GUBERN = !GUBERN
 ata1.Recordset!COUNTRY = !COUNTRY
 ata1.Recordset!STREET = !STREET
 ata1.Recordset!HOUSE = !HOUSE
 ata1.Recordset!KOR = !KOR
 ata1.Recordset!Str = !Str
 ata1.Recordset!FLAT = !FLAT
 ata1.Recordset.Update
 ata2.Recordset.MoveNext
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
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #5
Добавлено: 16.05.05 14:49
Data1.Recordset.Update не пробовал за цикл вынести? Чтобы не после каждой записи, а разом update делать?
Номер ответа: 6
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #6
Добавлено: 16.05.05 15:26
Я конечно попробую, но вроде он будет ругаться:
после каждого AddNew кажется должно быть UpDate?...
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 16.05.05 15:58
А что нельзя сразу всю базу импортировать? Зачем по записям то?
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 16.05.05 16:05
Требуется преобразовать одно поле из числового в символьное
Если длина поля не будет изменяться, то тип поля легко меняется в описателе полей.
Номер ответа: 9
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #9
Добавлено: 16.05.05 16:48
Не должен ругаться, AddNew - добавляет новую запись в Recordset, Update - сохраняет произведенные изменения/добавления Recordseta в базе. Выгодней все изменения/добавления разом сохранить, чем делать это после каждой записи отдельно. Т.е. сделать Update в конце, чтобы зафиксировать в базе последнее состояние Recordset'a.
Номер ответа: 10
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #10
Добавлено: 16.05.05 18:20
А каким макаром всю базу импортировать? И как програмно сменить тип данных с числового на символьный? А потом еще и trim для всего поля сделать???
Номер ответа: 11
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #11
Добавлено: 16.05.05 18:21
Если update делать ЗА циклом, то сохраняется последняя импортированная запись... Всего одна.
Номер ответа: 12
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #12
Добавлено: 16.05.05 18:43
А каким макаром всю базу импортировать?
Средствами драйвера БД наверное. Я не утверждаю, а спрашиваю. Драйвер это сделает за тебя гораздо быстрее. Например открыть в формате DBF и сохранить в формате MDB.
И как програмно сменить тип данных с числового на символьный?
В DBF-ке, сразу за заголовком идёт описатель полей, в котором записаны размеры и типы полей для всей базы. Просто отсчитываешь нужное поле и перезаписываешь байт, определяющий его тип.
А потом еще и trim для всего поля сделать???
Хм, сделать trim для реляционной БД? Зачем интересно, если длина поля от этого всё равно не изменится? Какова длина числового поля и какова длина планируемого текстового?
Номер ответа: 13
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #13
Добавлено: 16.05.05 20:18
После преобразования численного поля в текстовое
перед числами добавляются пробелы (дополняет до длины
поля). Мне же надо дабы цифры стояли сначала.
Номер ответа: 14
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #14
Добавлено: 16.05.05 20:22
Что числовое, что текстовое - одинаковы. Надо просто поменять тип. Для поиска по LIKE. Заметил, что почему-то
с текстом выборка идет быстрее. А на первом пне очень ощутимо быстрее.
Номер ответа: 15
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #15
Добавлено: 17.05.05 00:04
А если пользоваться не контролами, а подключить DAO через References...
Можно еще попробовать потестить скорость ADO vs DAO ? Благо код отличается несильно...