Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 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-сайт: hw.t-k.ru
 Профиль | | #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
    ;Data2.Recordset.MoveLast: Data2.Recordset.MoveFirst
    StatusBar1.Panels(2).Text = "Импорт новых данных (" & Data2.Recordset.RecordCount & ";)"
    StatusBar1.Refresh
    ProgressBar1.Min = 1: ProgressBar1.Max = Data2.Recordset.RecordCount + 1
    ;Data1.DatabaseName = Text2.Text
    ;Data1.RecordSource = "SELECT * FROM Setludi"
    ;Data1.Refresh
    
    With Data2.Recordset
        .MoveFirst
        ;Do While Not .EOF
            ;Data1.Recordset.AddNew
            
            ;Data1.Recordset!Q = !Q
            ;Data1.Recordset!QPRZ = !QPRZ
            ;Data1.Recordset!NDOG = !NDOG
            ;Data1.Recordset!NAMEWK = !NAMEWK
            ;Data1.Recordset!S_POL = !S_POL
            ;Data1.Recordset!N_POL = Trim(Str(!N_POL))
            ;Data1.Recordset!DP = !DP
            ;Data1.Recordset!Jt = !Jt
            ;Data1.Recordset!FAM = !FAM
            ;Data1.Recordset!IM = !IM
            ;Data1.Recordset!OT = !OT
            ;Data1.Recordset!DR = !DR
            ;Data1.Recordset!SN_PASP = !SN_PASP
            ;Data1.Recordset!W = !W
            ;Data1.Recordset!POSELEN = !POSELEN
            ;Data1.Recordset!SELSOVET = !SELSOVET
            ;Data1.Recordset!RAION = !RAION
            ;Data1.Recordset!GUBERN = !GUBERN
            ;Data1.Recordset!COUNTRY = !COUNTRY
            ;Data1.Recordset!STREET = !STREET
            ;Data1.Recordset!HOUSE = !HOUSE
            ;Data1.Recordset!KOR = !KOR
            ;Data1.Recordset!Str = !Str
            ;Data1.Recordset!FLAT = !FLAT
            
            ;Data1.Recordset.Update
            ;Data2.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-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 16.05.05 15:58
А что нельзя сразу всю базу импортировать? Зачем по записям то?

Ответить

Номер ответа: 8
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #12
Добавлено: 16.05.05 18:43

А каким макаром всю базу импортировать?

 Средствами драйвера БД наверное. Я не утверждаю, а спрашиваю. Драйвер это сделает за тебя гораздо быстрее. Например открыть в формате DBF и сохранить в формате MDB.


И как програмно сменить тип данных с числового на символьный?

 В DBF-ке, сразу за заголовком идёт описатель полей, в котором записаны размеры и типы полей для всей базы. Просто отсчитываешь нужное поле и перезаписываешь байт, определяющий его тип.


 А потом еще и trim для всего поля сделать???

 Хм, сделать trim для реляционной БД? Зачем интересно, если длина поля от этого всё равно не изменится? Какова длина числового поля и какова длина планируемого текстового?

Ответить

Номер ответа: 13
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #13 Добавлено: 16.05.05 20:18
Хм, сделать trim для реляционной БД? Зачем интересно, если длина поля от этого всё равно не изменится? Какова длина числового поля и какова длина планируемого текстового?


После преобразования численного поля в текстовое
перед числами добавляются пробелы (дополняет до длины
поля). Мне же надо дабы цифры стояли сначала.

Ответить

Номер ответа: 14
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #14 Добавлено: 16.05.05 20:22
Какова длина числового поля и какова длина планируемого текстового?


Что числовое, что текстовое - одинаковы. Надо просто поменять тип. Для поиска по LIKE. Заметил, что почему-то
с текстом выборка идет быстрее. А на первом пне очень ощутимо быстрее. :)

Ответить

Номер ответа: 15
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #15
Добавлено: 17.05.05 00:04
А если пользоваться не контролами, а подключить DAO через References...

Можно еще попробовать потестить скорость ADO vs DAO :) ? Благо код отличается несильно...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам