Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 ODBC душит производительность Access<->Oracle??  [new]
selis76
Member

Откуда:
Сообщений: 407
Есть приложение на Access которое использует курсоры. (OpenRecordset)
Читает с Oracle 8.1.7 Odbc линк
Вижу что медленно работает. Начал копать. Простая программа на полный скан таблицы в 500 мегабайт дала удивительные результаты.
В не зависимости от мощьности ПК мы имеет скорость в сетевом интерфейсе 80000 байт\с на прием и 60000 байт на отправку. Причем при переходе на гораздо мощный ПК клиента скорость не увеличилась. Сервер - свободен, сетка тоже (можно копировать файлы на приличной скорости 5мб\с с сервера - сетка 100мегабит в т.ч. на клиентах)

Взял утилиту OracleSQL plus которая работает без Odbc и запустил курсор (программа ниже) и надоже - скорость возрасла до 250000 байт\с на прием и на отправку уменшилась до 30000 т.е. Прием возрос. На более мощном
ПК скорость приема увеличилась до 500000 байт\с. Т.е. имеем возрастание на порядок
Можно ли как нибудь оптимизировать работу ODBC?
Это для SQLPlus
SET AUTOPRINT ON
SET TERMOUT OFF
SET HEADS OFF
VARIABLE VREC REFCURSOR
BEGIN
OPEN :VREC FOR SELECT * FROM xxx.tab;
END;
/

Это программа которую вызываем из формы
Private Sub Start_Click()
Dim MyDbs As Database
Dim Rc As Recordset
Set MyDbs = CurrentDb
Set Rc = MyDbs.OpenRecordset("xxx_tab")
Dim FStr As String
Dim Rcount As Long
Dim I As Long
Rcount = 0
Rc.MoveFirst
Rc.CacheSize = 50
Rc.FillCache

While Not Rc.EOF 'And Not Rcount = 1000
For I = 1 To Rc.Fields.Count
FStr = FStr & CStr(Nz(Rc.Fields(I - 1))) & "|"
Next I


FStr = ""
Rc.MoveNext

Rcount = Rcount + 1
If Rcount Mod 50 = 0 Then
Rc.CacheStart = Rc.Bookmark
Rc.FillCache
Me.MyTxt.Caption = "Îáðàáîòàíî " & Rcount & " çàïèñåé"
Me.Repaint
End If

Wend



End Sub

Сергей С
Сергей С
28 июл 04, 16:53    [843211]     Ответить | Цитировать Сообщить модератору
 Re: ODBC душит производительность Access<->Oracle??  [new]
Markelenkov
Member

Откуда:
Сообщений: 2312
Мой опыт связки Access<->Oracle говорит о том, что проблемы скорей всего не в odbc-драйвере, а в тупом Access'e. Если при установке связи из Access с таблицей Oracle у таблицы в Oracle есть primary key, Access его "понимает". В последующем этот дебильный (других слов найти трудно) Access тянет из Oracle данные группами по 10 строк запросами примерно такого вида:

select * from table where
column_1_of_PK=:1 and column_2_of_PK=:2 and column_3_of_PK=:3 OR
column_1_of_PK=:4 and column_2_of_PK=:5 and column_3_of_PK=:6 OR
...
column_1_of_PK=:28 and column_2_of_PK=:29 and column_3_of_PK=:30
В этом примере PK составной из 3 колонок.
Ни о какой производительности при таком подходе нет и речи. Если PK на таблицу в Oracle нет, Access ведет себя поразумней. Поэтому можно попробовать удалить временно в Oracle PK перед присоединением таблицы, а затем создать его в Oracle заново. Если PK на таблицу нет, Access спрашивает, какие столбцы будут его (primary key) составлять. Ответить надо cancel. Это может помочь.

И вообще, связка Oracle-Access у меня вызывает нервную дрожь с приступами ненависти к дяде Билли.
29 июл 04, 21:18    [847274]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить