|
|
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
Есть БД Ora11.2. Приложению (веб-сервис на dotNET) требуется делать запросы к БД получая информацию для тысяч карт, на вход поступают запросы со списком номеров карт (от 1 до 10000), для каждой карты нужно выбрать требующуюся инфу и вернуть общим датасетом. БД - сторонняя система (порядка 80 БД с одинаковой структурой), добавлять пакеты, вьюхи нельзя (точнее можно в отдельную схему, под которой идет соединение, но так как баз более 80 и схемы с данными имеют разные названия, то поддержка такого кода очень геморная, он есть но плодить его, без надобности, нет желания). Сейчас сделано так: веб-сервис получив массив номеров карт (10 знаков в номере), генерирует массив с XML по 2000символов примерно Код: plaintext 1. 2. воздаёт OracleCommand с текстом Код: plsql 1. 2. 3. 4. 5. 6. и в цикле выполняет запросы (можно конечно в разных потоках, но запросов на сервис и так много) разумеется создание команды и открытие соединение вынесено за цикл, в цикле только присвоение значение параметра и фетч курсора. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. Я посмотрел на это дело и решил попробовать биндить сразу параметр с типом XML, по сути это CLOB я думаю. Измелил SQL Код: plsql 1. 2. 3. 4. 5. 6. Стал генерировать один большой XML Код: c# 1. Работаь то работает и даже немного быстрее (для 10000 карт полторы минуты (запрос намного сложнее чем в примере), а было 2 минуты). но меня не покидает мысль что нагрузка на БД станет больше, на создание временных CLOB или я гоню? Какие еще варианты? Создать ОN COMMIT DELETE ROWS таблицу в своей схеме и наполнять ее перед запросом. Создать пакет с переменной-массивом и pipe line функцией у себя, но сервис испольует пул соединений, не получит ли сессия не свой набор данных? или использовать словарь массивов с ключем, но боюсь если будут обрывы выполнений и запрос за собой не почистит, то данные будут копиться, т.к. хз когда пул реально сессию закроет (или опять гоню?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 09:51 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
barrabas Код: plsql 1. 2. 3. 4. 5. 6. Попробуй поиграться одним xmltable вместо extractValue поверх xmlsequence. barrabasКакие еще варианты?Я бы попробовал еще вариант с передачей в качестве параметра коллекции. Варианты с pipelined функцией и temporary table даже не рассматривал бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:02 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
AmKadbarrabas Код: plsql 1. 2. 3. 4. 5. 6. Попробуй поиграться одним xmltable вместо extractValue поверх xmlsequence. barrabasКакие еще варианты?Я бы попробовал еще вариант с передачей в качестве параметра коллекции. Варианты с pipelined функцией и temporary table даже не рассматривал бы. т.е. создать в своей схеме объектный тип Код: plsql 1. попытаться его забиндить в него массив сразу через провайдер? вроде такие примеры в доке встречал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:05 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
barrabasт.е. создать в своей схеме объектный тип Код: plsql 1. попытаться его забиндить в него массив сразу через провайдер? Да, только насколько мне кажется номера карт у тебя строковые. Если тип нужно шарить между схемами, то можно создать public-синоним и выдать права другим схемам public-у. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:10 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
AmKadbarrabasт.е. создать в своей схеме объектный тип Код: plsql 1. попытаться его забиндить в него массив сразу через провайдер? Да, только насколько мне кажется номера карт у тебя строковые. Если тип нужно шарить между схемами, то можно создать public-синоним и выдать права другим схемам public-у. это пример просто в БД номер число ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:10 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
Попробовать стоит. Проблема в том, что создать объект нужно будет рассылать скрипт в другие подразделения, а они не очень выполнять скрипты на десятках БД :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:13 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
И еще, .NET-овская (ORM-)гляделка может по дефолту не увидеть тип, если он доступен посредством синонима на объект в другой схеме. barrabasПопробовать стоит. Проблема в том, что создать объект нужно будет рассылать скрипт в другие подразделения, а они не очень выполнять скрипты на десятках БД :)Стандартного типа тебе хватит? Как минимум, в 11-ой версии он должен быть везде. Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:21 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
AmKadИ еще, .NET-овская (ORM-)гляделка может по дефолту не увидеть тип, если он доступен посредством синонима на объект в другой схеме. barrabasПопробовать стоит. Проблема в том, что создать объект нужно будет рассылать скрипт в другие подразделения, а они не очень выполнять скрипты на десятках БД :)Стандартного типа тебе хватит? Как минимум, в 11-ой версии он должен быть везде. Код: plsql 1. 2. Даже в 10сятке есть! можно бить на порции по 32тысячи на всякий случай XMLTable поверх XMLSequence что-то не осилил так? Проде быстрее процентов на 15-20 парсинг на 300 записях select * from xmltable('CARDS/C' passing(xmltype(' <CARDS> <C NUM="1" /><C NUM="2" /> </CARDS>' )) columns card_num number(10) path '@NUM' ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:32 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
AmKadИ еще, .NET-овская (ORM-)гляделка может по дефолту не увидеть тип, если он доступен посредством синонима на объект в другой схеме. ... ORM - зло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:33 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
barrabasXMLTable поверх XMLSequence что-то не осилил так? Проде быстрее процентов на 15-20 парсинг на 300 записях select * from xmltable('CARDS/C' passing(xmltype(' <CARDS> <C NUM="1" /><C NUM="2" /> </CARDS>' )) columns card_num number(10) path '@NUM' )Да, так. Я это и имел в виду, когда писал xmltable вместо extractValue поверх xmlsequence. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 10:40 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
Супер Код: plsql 1. + Код: c# 1. 2. 3. 4. 5. 6. 7. вместо полторы минут стало 20 сек. Код C# на Devart провайдере, т.к. сервис его использует, для ODP нужно по другому параметр объявлять (натыкался на примеры) добавлю разбивку на партии по 32K и в прод :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 12:14 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
barrabasСупер Код: plsql 1. COLUMN_VALUE - и так number. Да и без cast наверное можно обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 13:11 |
|
||
|
Список в запрос с клиента (почти списки в вьюхи :) )
|
|||
|---|---|---|---|
|
#18+
AmKadbarrabasСупер Код: plsql 1. COLUMN_VALUE - и так number. Да и без cast наверное можно обойтись. с to_number - да согласен без каст работает, но ентерпрайс менеджер не может тюнинг запроса выполнить, ошибки выдаёт, уже не помню какую точно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 14:17 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39387416&tid=1886623]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
220ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 251ms |
| total: | 585ms |

| 0 / 0 |
