TOraQuery::Params

Обсуждение возникших проблем, предложений и ошибок ODAC компонентов

Ответить
petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

TOraQuery::Params

Сообщение petrel » Пн 17 апр 2017 13:26

Добрый день.
ODAC 9.3.9 и 10.0.1 соединение direct

Общий запрос имеет такой вид и общее кол-во символов в запросе более 5000.

select AA, BB, sum(CC), sum(DD)
from (
select a1 AA, b1 BB, c1 CC, d1 DD from table1 where WW = :param1
union all
select a2 AA, b2 BB, c2 CC, d2 DD from table2 where QQ = :param1
union all
select a3 AA, b3 BB, c3 CC, d3 DD from table3 where YY = :param1
union all
select a4 AA, b4 BB, c4 CC, d4 DD from table4 where XX = :param1
union all
select a5 AA, b5 BB, c5 CC, d5 DD from table5 where SS = :param1
)
group by AA, BB
order by AA, BB

WW, QQ, YY, XX, SS - тип NUMBER - индекс
param1 - пять раз одно и тоже имя
каждая из таблиц (table1, table2, table3, table4, table5) имеет значительно больше 100000 записей, результирующий набор такой же порядок.

1) С драйвером Oracle - работает все моментально.
2) С direct есть особенности.
2.1) Если вместо параметров подставить конкретное значение - работает все моментально.
2.2) В оболочке Borland компонент сильно тормозит при нажатии кнопки 'Execute'.
2.3) все типы параметра кроме Number - сильно тормозят (до 2 минут), результат верный.
2.4) параметр типа Number работает моментально если он ОДИН, результат НЕ верный.
2.5) параметр типа Number работает моментально, выдавая ПУСТОЙ НАБОР если их ПЯТЬ (наш случай, а должно быть тысячи).

Что необходимо сделать, что бы direct с ПАРАМЕТРАМИ тоже работало МОМЕНТАЛЬНО?

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraQuery::Params

Сообщение petrel » Ср 17 май 2017 12:02

В вашем новом обновлении (10.0.2) не исправлена черепашья скорость в режиме Direct больших запросов с параметрами.

Есть ли надежда исправления скорости выполнения запроса в режиме Direct (с драйвером все летает ~ 2 сек, без драйвера ~ 50 сек.) ...

или надо искать другие компоненты доступа до Oracle ?

MaximG
Devart Team
Сообщения: 91
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraQuery::Params

Сообщение MaximG » Вт 23 май 2017 15:59

Мы проверили работу ODAC согласно Вашего описания. К сожалению мы не смогли воспроизвести аналогичное поведение. В своем тесте мы использовали таблицу, содержащую 10000 записей и сформировали запрос, аналогичный приведенному Вами. Данный запрос включал в себя более 10000 символов. Мы не заметили заметной разницы между выполнением данного запроса в OCI Mode и Direct Mode. Мы постоянно работаем над улучшением наших продуктов и вопросы производительности являются для нас приоритетными. Мы продолжим исследование данной проблемы. Для этого, пожалуйста, составьте небольшой полный пример, демонстрирующий разницу в скорости выполнения запросов между OCI Mode и Direct Mode. Кроме того, нам понадобится скрипт на создание объектов БД, используемых в этом примере, а также пример заполнения тестовых таблиц. Данную информацию Вы можете передать нам посредством формы e-support ( https://www.devart.com - меню «Support»\«Request Support» )

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraQuery::Params

Сообщение petrel » Пн 05 июн 2017 12:32

Удалось создать маленький тормозящий запрос:

select table_up.isn_inv, table_up.item_code num_code, table_up.producer kpo, OstCode
from table_sale table_up,
(select table_Down.item_code OstCode, table_Down.isn_inv IT
from table_sale table_Down
where table_Down.isn_inv=:p11612
)
where table_up.isn_inv=IT
and table_up.producer = table_up.shop
and LENGTH(table_up.item_code)=9
and substr(table_up.item_code,1,9)=substr(OstCode,1,9)

При создании полной копии таблицы table_sale с другим именем результат повторился только пару раз.
Возможно Oracle отрабатывает по сценарию составленного на основе первого запуска.
Основная таблица (с кол-вом более миллиона записей) все таки часто используется с различными условиями.

Урезанная часть таблицы:
create table table_sale
(
isn_inv NUMBER(6, 0), --ссылка на накладную
item_code VARCHAR2(30) NOT NULL, --код товара в том числе с расширителем
producer NUMBER(6, 0) NOT NULL, --номер поставщика
shop NUMBER(6, 0) --номер продавца
)
Примерная структура данных:
1,'000000001', 22, 23
1,'00000000101', 22, 24
1,'00000000102', 22, 23
...

Эксперимент N1:
1) OraQuery.Active = true; (моментально)
2) OraQuery.Last(); (Direct = 00:02:30, Driver = 00:00:01)

Эксперимент N2:
Добавляю к запросу union all и повторно тот же самый запрос
1) OraQuery.Active = true; (моментально)
2) OraQuery.Last(); (Direct = 00:00:01, Driver = 00:00:01)

Эксперимент N3:
Добавляю к запросу union all и повторно изначальный запрос
1) OraQuery.Active = true; (моментально)
2) OraQuery.Last(); (Direct = 00:00:02, Driver = 00:00:01)

Эксперимент N4:
Добавляю к запросу union all и изначальный запрос
1) OraQuery.Active = true; (моментально)
2) OraQuery.Last(); (Direct = 00:02:37, Driver = 00:00:02)

При этом(другие пользователи стали жаловаться на падение скорости): на стороне сервера Oracle CPU доходит до 98%, на время выполнения запросов с задержки.

P.S. Первоначальный запрос (из 5000 символов)
1) OraQuery.Active = true; (Direct = 00:03:22, Driver = 00:00:01)
2) OraQuery.Last(); (Direct = 00:00:01, Driver = 00:00:01)

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraQuery::Params

Сообщение petrel » Вт 06 июн 2017 10:24

нашли странную зависимость

если
LENGTH(table_up.item_code)=9
заменить на
table_up.ost_code like '_________'

все начинает работать МОМЕНТАЛЬНО

MaximG
Devart Team
Сообщения: 91
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraQuery::Params

Сообщение MaximG » Чт 08 июн 2017 07:03

В настоящее время мы занимаемся исследованием проблемы согласно Вашего описания, однако пока нам не удается получить подобные результаты. Мы продолжим исследование и сообщим Вам результатах в скором времени

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraQuery::Params

Сообщение petrel » Пт 23 июн 2017 12:59

Выяснилась интересная особенность:
если удалить INDEX (item_code, shop) все начинает работать БЫСТРО.
Но почему только при Direct и наличии Params работает МЕДЛЕННО ?

MaximG
Devart Team
Сообщения: 91
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraQuery::Params

Сообщение MaximG » Чт 29 июн 2017 11:35

Нам по прежнему не удается обнаружить разницу в быстродействии между OCI и Direct режимами работы ODAC согласно Вашего описания. Для дальнейшего исследования проблемы нам понадобится
небольшой полный пример, воспроизводящий проблему. В данном примере должны создаваться необходимые объекты БД, наполнятся данными соответствующие таблицы и выполняться операции,
демонстрирующие разницу в производительности. Данный пример Вы можете передать нам посредством формы e-support (https://www.devart.com - меню «Support»\«Request Support» )

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraQuery::Params

Сообщение petrel » Вт 11 июл 2017 06:26

Однозначно не могу сформировать пример.
Разница чувствуется только на указанной таблице, но при этом:
1) Если ее переименовать - скорость OCI и Direct продолжает отличаться.
2) Если создать полную копию - все работает одинаково.

При просмотре плана выполнения запроса: поиск выполняется по rowid при наличии INDEX (описанного выше).

MaximG
Devart Team
Сообщения: 91
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraQuery::Params

Сообщение MaximG » Вт 18 июл 2017 14:36

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

Ответить