Как оптимизировать работу с БД?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Как оптимизировать работу с БД?

Сообщение Penumbra » 17.01.2015 (Сб) 22:10

Здравствуйте господа!
есть БД MySql с ~500 000 записями, выбираю записи (то 1 до 1140 если есть..)

Код: Выделить всё
 
...

  tsql = " and `datetime` > '" & Format(tmn1, "YYYY-mm-dd hh:mm") & "' and `datetime` < '" & Format(tmn2, "YYYY-mm-dd hh:mm") & "' "
    sql = "select *  from PCSBD.works where `indexelement`= " & Index & tsql & " order by `datetime`"
    Call RepMySqlOpen(sql)
    If rsRepMySql.EOF = True And rsRepMySql.BOF = True Then
        Exit Sub
    Else
        rsRepMySql.MoveFirst
    End If
   stopDate = lastTimeStop
   startDate = lastTimeStart
     sCount= 1 ' rsRepMySql.RecordCount
      Do While rsRepMySql.EOF = False
        sCount= sCount+ 1
        rsRepMySql.MoveNext
     Loop
     rsRepMySql.MoveFirst
     
    ReDim tt(i + 2)
    ReDim tt7(i + 2)
    ReDim rr(i + 2)
    ReDim rr7(i + 2)
    lsDte = 0
    i = 0
    y = 0
    '    rsRepMySql.MoveFirst
   
    Do While rsRepMySql.EOF = False
       
        zapusk(sCount) = 0
        lmDate = rsRepMySql.Fields(5)
....
тут выолняю обработку данных
....
Loop


....
'подключение к базе данных
Public Sub RepMySqlOpen(ByRef sql As String, Optional CL As Boolean = False)
Dim tmperr As String
On Error GoTo er
If Len(sql) = 0 Then Exit Sub
sCn = "Driver={MySQL ODBC 3.51 Driver};Server=" & MySQLServerName & ";Database=" & MySQLDATABASEName & "; User=" & MySQLUesrName & ";Password=" & MySQLUesrPassword & ";Option=3;port=" & MySQLServerPort & ";"
Set cnRepMySql = New ADODB.Connection
Set rsRepMySql = New ADODB.Recordset
cnRepMySql.CursorLocation = adUseServer
cnRepMySql.CommandTimeout = 120
cnRepMySql.ConnectionTimeout = 120
cnRepMySql.Open sCn
        With rsRepMySql
        If CL Then .CursorLocation = adUseNone
            .ActiveConnection = cnRepMySql
            .LockType = adLockOptimistic
            .CursorType = adOpenStatic
            .Source = sql
            .Open
        End With
Exit Sub
er:
tmperr = Err.Description
SaveError "*RepMySqlOpen  * err.Description= " & tmperr & " SQL=" & sql
Call AddLog(LogCritical, tmperr & ". Создана запись о ошибке в файле 'errors.log'")
End Sub


но при выполнении запроса программа "зависает" минуты на 2
если в базе удалить 400000-45000 записей то запрос выполняется за пару секунд
подскажите как можно оптимизировать код? и избавиться от "подвисания"
БД локальная (но может стоять и на удаленном сервере)

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как оптимизировать работу с БД?

Сообщение ger_kar » 17.01.2015 (Сб) 22:29

Ну во первых использовать OLEDB драйвер вместо ODBC, если только конечно таковой вообще существует.
Во вторых немаловажное значение имеет структура базы данных. Если делать выборку по индексированным полям и убрать это безобразие
tsql = " and `datetime` > '" & Format(tmn1, "YYYY-mm-dd hh:mm") & "' and `datetime` < '" & Format(tmn2, "YYYY-mm-dd hh:mm") & "' "
Применив параметрический запрос, то можно значительно уменьшить время выборки.
Бороться и искать, найти и перепрятать

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Как оптимизировать работу с БД?

Сообщение Penumbra » 17.01.2015 (Сб) 23:03

ger_kar писал(а):... Если делать выборку по индексированным полям и убрать это безобразие
tsql = " and `datetime` > '" & Format(tmn1, "YYYY-mm-dd hh:mm") & "' and `datetime` < '" & Format(tmn2, "YYYY-mm-dd hh:mm") & "' "
Применив параметрический запрос, то можно значительно уменьшить время выборки.

извиняюсь за глупый вопрос , а это как?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как оптимизировать работу с БД?

Сообщение ger_kar » 18.01.2015 (Вс) 7:20

Пример тут: http://alibek09.narod.ru/vb/articles/vbsbook/index.html
Параграф "Запрос с параметрами".
Пока почитай и разберись что к чему, будут вопросы пиши.
Бороться и искать, найти и перепрятать

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Как оптимизировать работу с БД?

Сообщение Penumbra » 18.01.2015 (Вс) 15:23

ага, спасибо!,
так, с "Запрос с параметрами" я разобрался, это больше не для увеличения скорости а для более корректного обрабатывания запросов с параметрами типа "дата" и т.д
мне надо проиндексировать поле datetime... сделал) быстрее намного работать стало )
и стоит ли для получение данных выполнять Асинхронный запрос?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как оптимизировать работу с БД?

Сообщение Хакер » 18.01.2015 (Вс) 15:42

А индексы то хоть созданы в таблице на колонках?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Как оптимизировать работу с БД?

Сообщение Penumbra » 18.01.2015 (Вс) 16:15

да )

хм. у меня все примеры из пункта "Параметрический запрос" выдают ошибку "Не удается изменить свойство ActiveConnection объекта Recordset с объектом Command в качестве источника"

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как оптимизировать работу с БД?

Сообщение ger_kar » 18.01.2015 (Вс) 16:16

Penumbra писал(а):ага, спасибо!,
так, с "Запрос с параметрами" я разобрался, это больше не для увеличения скорости а для более корректного обрабатывания запросов с параметрами типа "дата" и т.д
мне надо проиндексировать поле datetime... сделал) быстрее намного работать стало )
и стоит ли для получение данных выполнять Асинхронный запрос?

Как раз корректное использование запросов с параметрами и позволяет увеличить производительность, так как строки обрабатываются медленней.
Применение асинхронного запроса избавит тебя от подвисания интерфейса на момент выполнения запроса. Но сам запрос от этого быстрее выполняться не будет.
А что там с родным OLEDB драйвером для MySQL? Бывает вообще такой?
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как оптимизировать работу с БД?

Сообщение ger_kar » 18.01.2015 (Вс) 16:18

Penumbra писал(а):хм. у меня все примеры из пункта "Параметрический запрос" выдают ошибку "Не удается изменить свойство ActiveConnection объекта Recordset с объектом Command в качестве источника"
Ну все правильно. Меняй его у объекта Command
Бороться и искать, найти и перепрятать

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Как оптимизировать работу с БД?

Сообщение Penumbra » 18.01.2015 (Вс) 16:34

ger_kar писал(а):
Penumbra писал(а):хм. у меня все примеры из пункта "Параметрический запрос" выдают ошибку "Не удается изменить свойство ActiveConnection объекта Recordset с объектом Command в качестве источника"
Ну все правильно. Меняй его у объекта Command

не понял
код
Код: Выделить всё
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.CommandType = adCmdText
cmd.CommandText = "PARAMETERS parStartDate DateTime, parFinishDate DateTime; " & vbNewLine &
_ "SELECT * FROM [Table1] WHERE [Date_Insert] BETWEEN [parStartDate] AND [parFinishDate]; "
cmd.NamedParameters = True
cmd.Parameters.Append cmd.CreateParameter("parStartDate", adDate, adParamInput, , #12/31/2001#)
cmd.Parameters.Append cmd.CreateParameter("parFinishDate", adDate, adParamInput, , Now())
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open cmd, Connection, adOpenStatic, adLockReadOnly

на rs.Open cmd, Connection, adOpenStatic, adLockReadOnly выдает эту ошибку, что там менять то?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как оптимизировать работу с БД?

Сообщение ger_kar » 18.01.2015 (Вс) 16:59

В
rs.Open cmd, Connection, adOpenStatic, adLockReadOnly
Не надо указывать Connection, так как он указывается применительно к объекту Command
Бороться и искать, найти и перепрятать

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Как оптимизировать работу с БД?

Сообщение Penumbra » 18.01.2015 (Вс) 17:16

ага, подправил теперь ошибка
[MySQL][ODBC 3.51 Driver][mysqld-5.0.18-nt-max-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PARAMETERS parStartDate DateTime, parFinishDate DateTime;
SELECT * FROM `works' at line 1

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Как оптимизировать работу с БД?

Сообщение Penumbra » 18.01.2015 (Вс) 17:21

буду искать новую версию драйвера .. наверное.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как оптимизировать работу с БД?

Сообщение ger_kar » 18.01.2015 (Вс) 17:34

Драйвер тут наверняка не при делах (я так думаю), хотя все равно желательно использовать родной для ADO драйвер OLEDB.
Поисковый запрос выдает кучу вариантов:
Драйвер всего лишь посредник. Скорее всего ошибку возвращает сам MySQL. Наверное ему не нравятся имена твоих параметров. Поищи какие конкретно нужны для MySQL.
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

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

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

    TopList