Access SQL запрос - массив в базу?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Access SQL запрос - массив в базу?

Сообщение JohnK » 13.08.2010 (Пт) 21:01

Есть огромная таблица, порядка 300 000 строк и 8 столбцов. Как оптимизировать скорость загрузки этой таблицы в базу?
В моей программе эта таблица парсируется из большого файла, отпарсированная строка загоняется в базу. На то чтобы все это загнать уходит много времени (минут 10). Может можно как-то загнать все это пачками, скажем по 10 строк сразу или массивом?
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Access SQL запрос - массив в базу?

Сообщение FireFenix » 13.08.2010 (Пт) 21:27

Если парсится большой файл, то наверное проблема в самом парсинге...

10 строк сразу или массивом?

Транзакция? Насчёт профита в производительности - не знаю, но вроде должна быть чуток

Ещё можно заюзать мультипоточность...
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Access SQL запрос - массив в базу?

Сообщение iGrok » 13.08.2010 (Пт) 21:37

Импорт в самом аксессе не катит?

Вообще, можно попробовать сначала подготавливать csv-файл с нужными полями, а потом грузить его чем-то вроде
insert into [table] .. select ... from [filename] in [path]
Точный синтаксис не помню, но могу поискать.
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Access SQL запрос - массив в базу?

Сообщение SLIM » 13.08.2010 (Пт) 22:08

Если уж совсем критично, то можно подумать о чтении файла несколькими потоками и записи в несколько транзакций. Но все это будет очень сложно.
Проще и правда подязать и все.
Пишите жизнь на чистовик.....переписать не удастся.....

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Access SQL запрос - массив в базу?

Сообщение Andrey Fedorov » 13.08.2010 (Пт) 23:57

Полезные ссылочки на тему:

http://msdn.microsoft.com/en-us/library/ms709353.aspx
http://msdn.microsoft.com/en-us/library/ms974559.aspx

Ну и пример:

--------------------------------
Код: Выделить всё
Public Sub Main()
    Const sPathIn As String = "C:\Temp\"
    Const sPathOut As String = "C:\Temp\"
    Const sFileIn As String = "File.txt"
    Const sFileOut As String = "NewFile.txt"

    Dim cn As New ADODB.Connection, r As New ADODB.Recordset, _
        s As String, ss As String, sSchemaIni As String, i As Integer

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & sPathIn & ";" & _
          "Extended Properties=Text"

    ' Создадим файл откуда берем данные для теста
    For i = 0 To 100
        s = Mid$(Format$(Rnd, ".0000000"), 2)
        ss = ss & Mid$(s, 1, 1) & "," & Mid$(s, 2, 1) & "," & Mid$(s, 3, 1) & "." & CInt(Mid$(s, 4, 3)) & "," & Mid$(s, 7, 1) & vbCrLf
    Next i
    s = sPathOut & sFileIn
    If FileExists(s) Then Kill s
    SaveFile s, ss
   
    ' Удалим выходной файл
    s = sPathOut & sFileOut
    If FileExists(s) Then Kill s
   
    ' Создадим schema.ini
    sSchemaIni = sPathOut & "schema.ini"
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    ss = "[File.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf _
        & vbCrLf _
        & "[NewFile.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "NumberDigits=4" & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf
       
    SaveFile sSchemaIni, ss
   
    ' Импортируем данные
    On Error GoTo Err_
    r.Open "SELECT * INTO [" & sFileOut _
                    & "] IN '" & sPathOut & "' [Text;] " _
            & "FROM [" & sFileIn _
            & "] ORDER BY 1,2,3,4", cn, _
                    adOpenStatic, adLockReadOnly, adCmdText
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    Exit Sub

Err_:
    With cn.Errors(0)
        If .NativeError = -329323426 And .Number = -2147467259 Then Resume Next
    End With
    MsgBox Err.Description, vbCritical
End Sub

Private Function FileExists(sFile As String) As Boolean
    On Error Resume Next
    FileExists = ((GetAttr(sFile) And vbDirectory) = 0)
    If Err.Number Then Err.Clear
End Function

Private Sub SaveFile(sFile As String, sText As String)
    Dim iHFile As Integer
   
    iHFile = FreeFile
    Open sFile For Binary As #iHFile
    Put iHFile, , sText
    Close #iHFile
End Sub
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Access SQL запрос - массив в базу?

Сообщение JohnK » 13.08.2010 (Пт) 23:58

Парсинг csv файла не избежать так как я выбираю нужные мне поля.
Суть такая: есть (цифры для примера) 141 товар, у каждого товара есть подробности (прибыл, отправлен и тд) этих подробностей может быть до 4 000.
Я думал есть что-то на подобии механизма добавления массива в Exel. Там можно добавить массив и это раз в 100 быстрее чем если бы я добавлял их в цикле по одной строке.
Код: Выделить всё
...
'Массив  X(0 to tot,0 to 7)
tot=4000

XL.Range("C" & CStr(i) & ":J" & CStr(i + tot)).Value = X
...


P.S. В моем случае два этапа : Парсинг -> добавление в базу. В предлагаемом выше примере мне будет нужно следующее: Парсинг -> формирую файл -> Добавляю в базу.
Не уверен (будет время - попробую), но мне кажется что это только замедлит весь процесс.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Access SQL запрос - массив в базу?

Сообщение iGrok » 14.08.2010 (Сб) 0:42

Эмм.. То есть ты парсишь CSV???
За кой чёрт ты его парсишь, если ты можешь выдернуть нужные поля прямо в запросе не вставку из текстового файла?
Там Andrey Fedorov привёл пример чуть выше, только нужно не SELECT * FROM, а SELECT field1, field2, ..., fieldN FROM.

Или у csv нету заголовка?
label:
cli
jmp label

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Access SQL запрос - массив в базу?

Сообщение JohnK » 14.08.2010 (Сб) 6:44

Этот csv смешанный, т.е. в нем много таблиц которые мне не нужны, причем таблицы разных размерностей. Заголовка нет.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Access SQL запрос - массив в базу?

Сообщение iGrok » 14.08.2010 (Сб) 14:15

А. Ну тогда действительно надо попробовать импорт из сгенерированного тобой файла. Скорей всего это будет быстрее. Но надо тестировать.
label:
cli
jmp label


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 133

    TopList