|
|
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Добрый день! Подскажите, пожалуйста, никто не сталкивался ли со следующим багом: Есть таблица с остатками(Oracle 11.2) : дата, счет,входящий остаток, исходящий остаток. Мне нужно получить остатки только по нескольким тысячам счетов из нескольких миллионов. Я написал в PreparedStatement запрос вида select дата, счет,входящий остаток, исходящий остаток from таблица_остатков where счет in (?,?,?,?,?) Входящих параметров(?) в in одна тысяча. Я их инициализирую в цикле и получается, что для одного счета возвращаются значения из остатков другого счета. Причем если доабвить что-нибудь типа where счет in (?,?,?,?,?) order by дата desc, то все ок. Если where счет in (?,?,?,?,?) order by дата asc, то баг повторяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 15:48 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
А где собственно код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 15:59 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Локшин Марк, Код рабочий, чтобы его опубликовать нужно "обезлчивать". Всю суть проблемы я описал в схематическом виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 16:18 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 16:25 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
UsmanNordall У чела другая проблема. Он не ищет путь к динамике. Его устраивает тыща параметров. Просто он полагает, что PreparedStatement виновато, что если попросить данные по счетам перечислив их через запятую, то в результате будут данные по всем перечисленным счетам. А вовсе не из-за очередного бага СУБД на тему при большом количестве строк представление завернутое в другое представление начинает возвращать что-то от балды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 16:37 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, Зачем такой бешенный селект? Построить вьюху с нужными счетами средствами СУБД не судьба? И есть у меня подозрения, что у этих счетов есть ещё и другие критерии отбора кроме номера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 17:41 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЛокшин Марк, Код рабочий, чтобы его опубликовать нужно "обезлчивать". Всю суть проблемы я описал в схематическом виде. В схематическом виде опубликовано ВАШЕ ПЕДСТАВЛЕНИЕ, что баг есть. Либо ошибка в коде, либо в базе данных. Какая она, кстати? Что ошибка в походе- это понятно и так- 1000 параметров это эталонный говнокод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 18:11 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевУ чела другая проблема.Ок )Сергей АрсеньевЕго устраивает тыща параметров.:-))NordallКод рабочий, чтобы его опубликовать нужно "обезлчивать".А сами данные можете выложить? (конечно, предварительно их "обезлчивав") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:03 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Usman, Это я пробовал. Принципиально ничего не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:32 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominNordallЛокшин Марк, Код рабочий, чтобы его опубликовать нужно "обезлчивать". Всю суть проблемы я описал в схематическом виде. В схематическом виде опубликовано ВАШЕ ПЕДСТАВЛЕНИЕ, что баг есть. Либо ошибка в коде, либо в базе данных. Какая она, кстати? Что ошибка в походе- это понятно и так- 1000 параметров это эталонный говнокод. Базу я указал - Oracle 11.2.0.4 Значение 1000 - это лимит для количества значений в in. Если есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе или 3000 тысячи раз выполнять запрос по одному счету. Первый вариант работает быстрее, значит это говнокод? Инициализируются 1000 параметров естественно в цикле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:45 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевUsmanNordall У чела другая проблема. Он не ищет путь к динамике. Его устраивает тыща параметров. Просто он полагает, что PreparedStatement виновато, что если попросить данные по счетам перечислив их через запятую, то в результате будут данные по всем перечисленным счетам. А вовсе не из-за очередного бага СУБД на тему при большом количестве строк представление завернутое в другое представление начинает возвращать что-то от балды. Запрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 20:47 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
[quot Nordall]Alexey Tominпропущено... Если есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе или 3000 тысячи раз выполнять запрос по одному счету. Первый вариант работает быстрее, значит это говнокод? Инициализируются 1000 параметров естественно в цикле. у меня было такое, лечится Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2017, 21:26 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЕсли есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе Ьыстрее вставить данные во временную (реально временную, или специальную по ключу сессии) таблицу 3000 ID счетов и выполнить inner join Пока кода нет- бага в вашем коде. Да, если интересно копаться в говнокоде- найдите минимальное количество ID для возникновенияпроблемы и минимальный запрос. Такнайдёте ошибку себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 06:24 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, по твоему вопросу видно, что ты не владеешь знаниям по субд, номера счетов повторяются кажый год, но количество счетов разно каждый год. вот от этого у тебя баг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 06:30 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominNordallЕсли есть 3000 счетов и нужно по ним получить значения из нескольких миллионов записей, то что будет быстрее - обработать в Java результат трех запросов к базе Ьыстрее вставить данные во временную (реально временную, или специальную по ключу сессии) таблицу 3000 ID счетов и выполнить inner join На боевой системе создавать временную таблицу нереальное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 08:57 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
вадяNordall, по твоему вопросу видно, что ты не владеешь знаниям по субд, номера счетов повторяются кажый год, но количество счетов разно каждый год. вот от этого у тебя баг Причем тут знания субд и счета??? Счета повторяются и что? Я делаю select из таблицы балансов. В ней номер счета всегда уникален за дату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 08:59 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallНа боевой системе создавать временную таблицу нереальное решение. Не вижу проблемы. Много раз использовал в oracle как настоящие временные таблицы, так и таблицы с ключём по sessionId (для передачи данных между сессиями). Объёмы были- большие. А вот использование вместо этого тысяч параметров in - это то, за что надо увольнять сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 09:40 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominНе вижу проблемы. Видимо речь о том, что прав на создание объектов нет и их нужно создавать через вышестоящую структуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:03 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Alexey TominNordallНа боевой системе создавать временную таблицу нереальное решение. Не вижу проблемы. Много раз использовал в oracle как настоящие временные таблицы, так и таблицы с ключём по sessionId (для передачи данных между сессиями). Объёмы были- большие. А вот использование вместо этого тысяч параметров in - это то, за что надо увольнять сразу. Я не хочу вступать в обсуждение с вами, что есть говнокод и за что уволнять или нет. Для этого есть ПТ. Сделано это для максимальной производительности. Можете возразить, что это работает медленее? У всех разные проекты и опыт. Очень рад, что вам разрешают создавать временные таблицы на продуктивном сервере с десятками проектами пользующимися данными по остаткам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:34 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordallorder by дата desc, то все ок.Nordallorder by дата asc, то баг повторяется.И самое главное:NordallЗапрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно.какой именно из запросов? с ASC или с DESC ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:42 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЗапрос из prepared statement c явно перечисленными значениями, выполненный в sql plus,возвращает все корректно. А запрос вы откуда взяли для sql plus? Самостоятельно сформировали или из лога оракла? http://docs.oracle.com/cd/B19306_01/network.102/b14266/cfgaudit.htm#i1011302 А проблема повторяется всегда? Если проблема повторяется всегда, то не понятно каким образом JDBC драйвер вообще может на это повлиять. Если БД выдаёт два разных результата стабильно, то и запросы тоже разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:48 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, обычная ошибка по невнимательности. Перепроверьте всё с утра и раскайтесь потом)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 10:53 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, скорее всего, действительно, сами где-то лажаете. У вас всегда передаются одни и те-же 1000 значений? А есть возможность передать 900 (800,700,..) и проверить наличие бага? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 11:04 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallЗначение 1000 - это лимит для количества значений в in. Ну почти. Код: plsql 1. Хотя, тот еще вариант. :) Передача через массив выглядит естественней (или через временную таблицу). Но скорее всего у Вас проблема с запросом, особенно если в нем куча вьюшек используется. Нужно выяснить по трейсу что приходит и где ошибка. А дальше уже решать. Либо материализовать в некотором слое либо что... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 11:28 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Если количество параметров изменяется, то такой PreparedStatement в принципе не дает выигрыша в скорости, так как запрос каждый раз надо переписывать (заменять количество ? по числу параметров). Ну и использование Array-параметра выглядит как читерство. Предлагаю рассмотреть вариант batch-select , с реально работающими PreparedStatement. В качестве развития идеи, приведенной по ссылке: подготовить несколько запросов с количеством параметров 2 n (например, до 2 7 : 1,2,3,8,16,32,64,128). С помощью них легко можно построить batch с любым числом параметров ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 11:41 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
ivanraПредлагаю рассмотреть вариант batch-select Так TC и батчит по тыще id за заход. :) Прям как в статье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 11:55 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
ivanra, А чем обычная работа с коллекциями https://docs.oracle.com/database/121/JJDBC/oraarr.htm#JJDBC28574 не устраивает ? (ну кроме того, что нужны права на создание типа) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 12:08 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
yw(ну кроме того, что нужны права на создание типа) Ну учитывая, что ODCIVarchar2List уже создан и 3000 в него залезает, это не вопрос. Правда, возможно, придется повозится, чтоб объяснить оптимизатору сколько элементов в этом массиве. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 12:17 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
NordallСделано это для максимальной производительности. Можете возразить, что это работает медленее? Да, это будет работать не быстрее точно. NordallОчень рад, что вам разрешают создавать временные таблицы на продуктивном сервере с десятками проектами пользующимися данными по остаткам. А что такого? Создавал временные таблицы в БД федерального оператора связи, и в банке хорошего уровня. Админы только за. Более того, приходилось решать временной таблицей проблему именно перформанса- когда оптимизатор не мог связать три таблицы правильно - пришлось перед запросом сливать две из них в одну временную и гонять запросы по ней. Часа 2 экономилось при каждом (ежедневном) запуске, пока схему данных не поменяли ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 13:04 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевNordallЗначение 1000 - это лимит для количества значений в in. Ну почти. Код: plsql 1. Хотя, тот еще вариант. :) Передача через массив выглядит естественней (или через временную таблицу). Но скорее всего у Вас проблема с запросом, особенно если в нем куча вьюшек используется. Нужно выяснить по трейсу что приходит и где ошибка. А дальше уже решать. Либо материализовать в некотором слое либо что... Трэйс наше все. Буду в этом направлении копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 14:33 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, вообще было бы интересно посмотреть на интерфейс, в котором пользователю предлагается выбрать 1000+ значений для запроса с in(). Ну и в копилку такое безумное решение средствами оракл без in(): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 15:00 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
ivanra, разве я писал об интерфейсе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 15:15 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
ivanraНу и в копилку такое безумное решение средствами оракл без in(): ну in (или еще лучше exists) можно было бы и union all использовать. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 15:20 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
Nordall, я не полностью сформулировал. Выбор 1000+ значений без возможности сохранения . Если выбор на интерфейсе, и нет возможности выбор запомнить, то это беда. Если всё же сохраняется, то надо джойнить. Ну а если это некий массив данных, то логично передать данные на сервер, и там обработать. Но вот так, 1000 значений в in(), да еще с PreparedStatement? Выглядит не очень. Налицо неправильная постановка задачи, либо признаки copy-paste-style программирования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 15:37 |
|
||
|
Баг PreparedStatement
|
|||
|---|---|---|---|
|
#18+
ivanraвообще было бы интересно посмотреть на интерфейс, в котором пользователю предлагается выбрать 1000+ значений для запроса с in(). Интерфейс. Иногда такие перлы встречаются... У меня знакомый работал в IT-отделе, где поставили некоторую программу, которая должна была выводить (в некоторый момент) список всех необработанных документов за этот год. Делалось это так- вне БД лежал список ID обработанных файлов, и в SQL-запрос вставлялся "not in(...) and not in(...) and not in (...)" (да, три раза). И этот список вставлялся в переменные. Понятно, что за год обработать более 3000 документов было невозможно. По мнению авторов. А офисные работники смогли. И ему надо было как-то это поделие заставить работать. Кажется, "лшние" документы перенесли в какую-то архивную таблицу (соответственно их поиск не находил). Так что бывает всякое. А потом "баги" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 15:38 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123124]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
77ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 407ms |

| 0 / 0 |
