powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
13 сообщений из 38, страница 2 из 2
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34166041
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_А как перегнать RecordSet в массив? Примерчик бы!
Благодарю за запросы (см. выше). Что называется навёл на мысль!

Да нафига в массив-то? Разницы с сканировании не ощутишь.

Тот же Access ведь с табличкой не через ODBC работает, так что просто поменяй провайдера с ODBC на OLEDB. Ну как в примере от Worobjoff.

Плюс к тому статический курсор и можно еще BatchOptimistic.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34166105
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF[quot klen_]просто поменяй провайдера с ODBC на OLEDB. Ну как в примере от Worobjoff.
Действительно стало работать быстрее. Спасибо.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34166118
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Access всё равно читает таблицу в миг. Буквально пару секунд.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34166132
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Access не читает всю таблицу сразу, он зачитывает первые N записей - те, которые помещаются на экран.
Да и в любом случае обмен данными между интерфейсами занимает времени больше, нежели при использовании только одной Access, это нормально.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34167214
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_ Access всё равно читает таблицу в миг. Буквально пару секунд.

Что понимаешь читает? Выводит на экран? Ну и в программе на VB можно точно так-же ее вывести.
И вообще - скорость не должна зависеть от того на чем пишешь - на Access, VB или C++.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34167223
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkiadesAccess не читает всю таблицу сразу, он зачитывает первые N записей - те, которые помещаются на экран.

Обыкновенный серверный курсор...

MelkiadesДа и в любом случае обмен данными между интерфейсами занимает времени больше, нежели при использовании только одной Access, это нормально.

Да никакой разницы, вообще-то... ;)
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34167397
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF
MelkiadesДа и в любом случае обмен данными между интерфейсами занимает времени больше, нежели при использовании только одной Access, это нормально.

Да никакой разницы, вообще-то... ;)
Что значит никакой? Access что, работает с базой mdb через ODBC или через OLEDB?
Я, конечно, не спец по Access, но имхо он работает с базой через собственное API, а не через этих провайдеров. Вот вам и разница.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34167701
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
' текст на VB6   ЧИТАЕТ ЗА 12 СЕКУНД ~30 000 ЗАПИСЕЙ
  db.Provider = "Microsoft.Jet.OLEDB.4.0" ' с этим провайдером чтение таблиц происходит быстрее.
  db.Open file_mdb, "Admin", password
  t1.Open "Таблица1", db, , , adCmdTable
  Do Until t1.EOF
       t1.MoveNext
  Loop
  t1.Close
  db.Close

' текст на Access-е  ЧИТАЕТ ЗА ПАРУ СЕКУНД ~30 000 ЗАПИСЕЙ
Dim t1 As Recordset, db As Database
Set db = CurrentDb()
Set t1 = db.OpenRecordset("Таблица1")
Do Until t1.EOF
       t1.MoveNext
Loop
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34167965
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все дело в межпроцессном взаимодействии.
Если после каждого MoveVext приложение обращается к БД, тормозить будет.
А если зафетчить все записи сразу, обращение будет лишь одно.

Каждый раз, при обращении к другому процессу (в д.случае к МДБ) теряется время впустую. Приложение-клиент тупо ждет когда ОС "вспомнит" о его запросе и передаст его приложению-серверу.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34168266
ЁхынПалыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
klenSet db = CurrentDb()
Метод косвенно указывает на то, что в коде Акса используется ДАО, а не АДО, а ДАО быстрее АДО само по себе (правда, вряд ли в столько раз, скорее на NN процентов), и как раз предназначено для работы с ДЖЕТ машиной максимально шустро.

Зы-1: Это в дополнение к другим возможным объяснениям.

Зы-2: Скорее трабла в долгом коннекте АДО к источнику, поскольку оно вот такое интеллектуальное. А КуррентДБ с рекордсетом ДАО фетчит сразу весь набор в память, да ещё в той же рабочей области, что и текущий коннект ДЖЕТА.

Зы-3: Замерьте не весь кусок кода, а только циклы, исключив собственно коннект АДО из замера. Думаю, не будет такой разницы в разы. Там и "собака порылась"... :-)

ИМХО, однако.
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34172105
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffВсе дело в межпроцессном взаимодействии.
Если после каждого MoveVext приложение обращается к БД, тормозить будет.
А если зафетчить все записи сразу, обращение будет лишь одно.

Вообще-то при клиентском курсоре все данные сразу тащатся на клиентскую машину.
Оттого и его название ;)
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34172122
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_текст на VB6 ЧИТАЕТ ЗА 12 СЕКУНД ~30 000 ЗАПИСЕЙ
текст на Access-е ЧИТАЕТ ЗА ПАРУ СЕКУНД ~30 000 ЗАПИСЕЙ

Вы прям волшебники какие-то...
Ниже приведены результаты исходники и результаты теста на VB6.
Видно что резко отличается лишь время заполнения таблицы.
А примитивное сканирование 30000 записей в любом случае выполняется менее чем за секунду.

Откуда взяли пару (а тем более 12! ) секунд??? Это ж какой талант надо иметь ;)

автор--- Columns = 15, Rows = 30000
ADODB: ADODB_FillTable 37,656
ADODB: ScanTable (Client Cursor) 0,530
ADODB: ScanTable (Server Cursor) 0,312
DAO: DAO_FillTable 2,406
DAO: ScanTable (Snapshot Cursor) 0,438
DAO: ScanTable (Dynaset Cursor) 0,141


Исходник тестового модуля:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
Option Explicit

Const m_iColumnsCount As Integer =  15 
Const m_iRowsCount As Integer =  30000 

Dim m_sMdbPath As String, m_sConnectionString As String

Public Sub Main()
    
    Debug.Print vbCrLf & "--- Columns = " & m_iColumnsCount & ", Rows = " & m_iRowsCount
    
    If Not CreateTestMDB Then Exit Sub
    ADODB_FillTable
    ADODB_ScanTable True
    ADODB_ScanTable False
    
    If Not CreateTestMDB Then Exit Sub
    DAO_FillTable
    DAO_ScanTable True
    DAO_ScanTable False
End Sub

Private Sub DAO_ScanTable(bSnapshot As Boolean)
    Dim db As DAO.Database, r As DAO.Recordset, ii As Long
    Dim tt As Single
    
    Set db = DAO.DBEngine.OpenDatabase(m_sMdbPath)
    
    tt = Timer
    
    Set r = db.OpenRecordset("SELECT * FROM Test", IIf(bSnapshot, dbOpenSnapshot, dbOpenDynaset))
    Do Until r.EOF
        ii = ii + r( 0 )
        r.MoveNext
    Loop

    Debug.Print "DAO:   ScanTable (" & IIf(bSnapshot, "Snapshot", "Dynaset") & " Cursor) " & Format$(Timer - tt, "#,##0.000")
End Sub

Private Sub ADODB_ScanTable(bClient As Boolean)
    Dim r As New ADODB.Recordset, cn As New ADODB.Connection, ii As Long
    Dim tt As Single
    
    Set cn = New ADODB.Connection
    cn.CursorLocation = IIf(bClient, adUseClient, adUseServer)
    cn.Open m_sConnectionString
    
    tt = Timer
    
    r.Open "SELECT * FROM Test", cn, adOpenStatic, adLockOptimistic
    Do Until r.EOF
        ii = ii + r( 0 )
        r.MoveNext
    Loop
    Debug.Print "ADODB: ScanTable (" & IIf(bClient, "Client", "Server") & " Cursor) " & Format$(Timer - tt, "#,##0.000")
End Sub

Private Sub DAO_FillTable()
    Dim db As DAO.Database, r As DAO.Recordset, i As Long, k As Integer
    Dim tt As Single
    
    Set db = DAO.DBEngine.OpenDatabase(m_sMdbPath)
    
    tt = Timer
    
    Set r = db.OpenRecordset("SELECT * FROM Test", dbOpenDynaset)
    
    DBEngine.BeginTrans
    For i =  1  To m_iRowsCount
        r.AddNew
        For k =  0  To m_iColumnsCount -  1 
            Select Case k Mod  3 
                Case  0 ,  1 : r(k) = i
                Case  2 : r(k) = i & " тестовая строчка " & k
            End Select
        Next k
        r.Update
    Next i
    DBEngine.CommitTrans

    Debug.Print "DAO:     DAO_FillTable           " & Format$(Timer - tt, "#,##0.000")
End Sub

Private Sub ADODB_FillTable()
    Dim cn As New ADODB.Connection, r As New ADODB.Recordset, i As Long, k As Integer
    Dim tt As Single
    
    Set cn = New ADODB.Connection
    cn.CursorLocation = adUseClient
    cn.Open m_sConnectionString
    
    tt = Timer
    
    cn.BeginTrans
    r.Open "SELECT * FROM Test", cn, adOpenStatic, adLockBatchOptimistic
    For i =  1  To m_iRowsCount
        r.AddNew
        For k =  0  To m_iColumnsCount -  1 
            Select Case k Mod  3 
                Case  0 ,  1 : r(k) = i
                Case  2 : r(k) = i & " тестовая строчка " & k
            End Select
        Next k
        r.Update
    Next i
    r.UpdateBatch
    cn.CommitTrans

    Debug.Print "ADODB: ADODB_FillTable           " & Format$(Timer - tt, "#,##0.000")
End Sub

Private Function CreateTestMDB() As Boolean
    Dim s As String, cat As New ADOX.Catalog, t As ADOX.Table, c As ADOX.Column, i As Long, j As Long
    
    m_sMdbPath = App.Path & "\Text.mdb"
    On Error Resume Next
    Kill m_sMdbPath
    On Error GoTo  0 
    
    On Error GoTo Err_
    Set cat = New ADOX.Catalog
    m_sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" & m_sMdbPath & """"
    cat.Create m_sConnectionString

    Set t = New ADOX.Table
    t.Name = "Test"
    For i =  1  To m_iColumnsCount
        Select Case i Mod  3 
            Case  1 : t.Columns.Append "F" & i, adInteger
            Case  2 : t.Columns.Append "F" & i, adDouble
            Case  0 : t.Columns.Append "F" & i, adVarWChar,  25 
        End Select
    Next i
    cat.Tables.Append t
    cat.Tables.Refresh
    CreateTestMDB = True
    Exit Function

Err_:
    MsgBox Err.Description, vbCritical
End Function
...
Рейтинг: 0 / 0
Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
    #34172125
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkiadesЧто значит никакой? Access что, работает с базой mdb через ODBC или через OLEDB?
Я, конечно, не спец по Access, но имхо он работает с базой через собственное API, а не через этих провайдеров. Вот вам и разница.

Access вообще-то работает с базой через провайдер, который ему укажут.
Это был бы маразм для него собственное API работы с данными изобретать.
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Почему VB6 такой тормозной. Access и тот быстрее обрабатывает таблицы и запросы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]