|
|
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
Есть база данных на Sybase 11.0.3.3. и приложение на Java. Java приложение вызывает хранимую процедуру, в которой есть update. Так вот, этот самый update с некоторых пор стал не стабильно работать. Т.е. 50 вызовов обновляют требуемое колличество записей, 51-й только одну из набора или вообще ничего не обновляет. Если останавливаю выполение программы, запускаю процедуру из DB Artisan с теми же параметрами, то update работает как положенно, обновляет полный набор. Вобщем, какой то бред. Думали что может проблема в Java SDK, пробовали разные, 1.2, 1.3, 1.4, обновляли Sybase JDBC драйвер, но результат тот же, - фигня, процедура работает, а затем, в какой то момент начинает давать сбои при этом не давая никаких ошибок. Чую что проблема в SQL сервере, но наш админ базы данных пока ничем помочь не может. Господа, кто сталкивался с чем нибудь подобным? У меня уже кончились идеи. :-( create procedure X1 insert into #t /* таблица #t создается заранее перед вызовом данной процедуры */ select .... from grid where ... insert into #t select .... from grid where ... update grid set ... from #t, grid where ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2004, 17:10 |
|
||
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
сразу в начале процедуры добавьте set rowcount 0 set nocount on -- на всякий случай. может дело и не в этом, но вдруг поможет ... Ежели нет, то нужно какое-то более полное описание ошибок и полный текст процедуры с описанием таблиц. Кстати, триггера на таблице есть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2004, 18:53 |
|
||
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
MasterZivсразу в начале процедуры добавьте set rowcount 0 set nocount on -- на всякий случай. может дело и не в этом, но вдруг поможет ... Ежели нет, то нужно какое-то более полное описание ошибок и полный текст процедуры с описанием таблиц. Кстати, триггера на таблице есть ? Спасибо, MasterZiv. rowcount / nocount добавлять нет смысла, т.к. процедура все же через раз работает. Приложением так же вызываются 100 других процедур и у меня теперь нет уверенности что они не сбоят. Все их не буду редактировать - нет возможности. К тому же обнаружился select с union(aми) который тоже работает через раз, - возвращает то одну запись, то положенные десять. Вобщем, проблема не в одном месте. Не знаю какое еще можно добавить описание ошибок? Если дело идет об ошибках на сервере, то их нет, - SQL server не генерирует ничего подозрительного. Тригера на таблице нет. ------------------------ Вот код. - Вызывается процедура rate_main. - rate_main создает временную таблицу и вызывает rate_totals. - rate_totals заполняет временную таблицу данными и запускает update. Вот результат этого updatea и получается различный. CREATE PROCEDURE rate_main @wip_no char(10), @wip_iteration_no char(2), @app_mode char(1) AS BEGIN ... IF OBJECT_ID('#t') IS NOT NULL DROP TABLE #t CREATE TABLE #t ( wip_no char(10) NOT NULL, wip_iteration_no char(2) NOT NULL, location_no smallint NOT NULL, sect_obj_no int NOT NULL, risk_obj_no int NOT NULL, cov_obj_no int NOT NULL, tot_prem_amt money NULL, end_prem_amt money NULL, offset_prem_amt money NULL, onset_prem_amt money NULL, base_prem_amt money NULL, sbase_prem_amt money NULL, scalc_prem_amt money NULL, disc_amt money NULL, sur_amt money NULL, add_sur_amt money NULL, oth_disc_amt money NULL, chg_tax_1_amt money NULL, chg_tax_2_amt money NULL, chg_tax_3_amt money NULL, chg_tax_4_amt money NULL, chg_tax_5_amt money NULL, chg_tax_6_amt money NULL, chg_tax_7_amt money NULL, new_impl_prem_amt money NULL) begin tran ..... -- update totals exec @status = rate_totals @wip_no, @wip_iteration_no if @status <> 0 goto err_exit commit tran return err_exit: rollback return END авторCREATE PROCEDURE dbo.rate_totals @wip_no char(10), @wip_iteration_no char(2) AS BEGIN -- total for risk insert into #t select distinct wip_no, wip_iteration_no, location_no, sect_obj_no, risk_obj_no, 0 cov_obj_no, sum(tot_prem_amt) TOT_PREM_AMT, sum(end_prem_amt) END_PREM_AMT, sum(offset_prem_amt) OFFSET_PREM_AMT, sum(onset_prem_amt) ONSET_PREM_AMT, sum(base_prem_amt) BASE_PREM_AMT, sum(sbase_prem_amt) SBASE_PREM_AMT, sum(scalc_prem_amt) SCALC_PREM_AMT, sum(disc_amt) DISC_AMT, sum(sur_amt) SUR_AMT, sum(add_sur_amt) ADD_SUR_AMT, sum(oth_disc_amt) OTH_DISC_AMT, sum(chg_tax_1_amt) CHG_TAX_1_AMT, sum(chg_tax_2_amt) CHG_TAX_2_AMT, sum(chg_tax_3_amt) CHG_TAX_3_AMT, sum(chg_tax_4_amt) CHG_TAX_4_AMT, sum(chg_tax_5_amt) CHG_TAX_5_AMT, sum(chg_tax_6_amt) CHG_TAX_6_AMT, sum(chg_tax_7_amt) CHG_TAX_7_AMT, NEW_IMPL_PREM_AMT = 0 from twrkgrid where wip_no = @wip_no and wip_iteration_no = @wip_iteration_no and cov_obj_no >0 group by wip_no, wip_iteration_no, location_no, sect_obj_no, risk_obj_no -- total for section insert into #t select wip_no, wip_iteration_no, location_no, sect_obj_no, 0 risk_obj_no, 0 cov_obj_no, sum(tot_prem_amt) TOT_PREM_AMT, sum(end_prem_amt) END_PREM_AMT, sum(offset_prem_amt) OFFSET_PREM_AMT, sum(onset_prem_amt) ONSET_PREM_AMT, sum(base_prem_amt) BASE_PREM_AMT, sum(sbase_prem_amt) SBASE_PREM_AMT, sum(scalc_prem_amt) SCALC_PREM_AMT, sum(disc_amt) DISC_AMT, sum(sur_amt) SUR_AMT, sum(add_sur_amt) ADD_SUR_AMT, sum(oth_disc_amt) OTH_DISC_AMT, sum(chg_tax_1_amt) CHG_TAX_1_AMT, sum(chg_tax_2_amt) CHG_TAX_2_AMT, sum(chg_tax_3_amt) CHG_TAX_3_AMT, sum(chg_tax_4_amt) CHG_TAX_4_AMT, sum(chg_tax_5_amt) CHG_TAX_5_AMT, sum(chg_tax_6_amt) CHG_TAX_6_AMT, sum(chg_tax_7_amt) CHG_TAX_7_AMT, NEW_IMPL_PREM_AMT = 0 from twrkgrid where wip_no = @wip_no and wip_iteration_no = @wip_iteration_no and cov_obj_no > 0 group by wip_no, wip_iteration_no, location_no, sect_obj_no -- total for location insert into #t select wip_no, wip_iteration_no, location_no, 0 sect_obj_no, 0 risk_obj_no, 0 cov_obj_no, sum(tot_prem_amt) TOT_PREM_AMT, sum(end_prem_amt) END_PREM_AMT, sum(offset_prem_amt) OFFSET_PREM_AMT, sum(onset_prem_amt) ONSET_PREM_AMT, sum(base_prem_amt) BASE_PREM_AMT, sum(sbase_prem_amt) SBASE_PREM_AMT, sum(scalc_prem_amt) SCALC_PREM_AMT, sum(disc_amt) DISC_AMT, sum(sur_amt) SUR_AMT, sum(add_sur_amt) ADD_SUR_AMT, sum(oth_disc_amt) OTH_DISC_AMT, sum(chg_tax_1_amt) CHG_TAX_1_AMT, sum(chg_tax_2_amt) CHG_TAX_2_AMT, sum(chg_tax_3_amt) CHG_TAX_3_AMT, sum(chg_tax_4_amt) CHG_TAX_4_AMT, sum(chg_tax_5_amt) CHG_TAX_5_AMT, sum(chg_tax_6_amt) CHG_TAX_6_AMT, sum(chg_tax_7_amt) CHG_TAX_7_AMT, NEW_IMPL_PREM_AMT = 0 from twrkgrid where wip_no = @wip_no and wip_iteration_no = @wip_iteration_no and cov_obj_no > 0 group by wip_no, wip_iteration_no, location_no -- totals for policy insert into #t select wip_no, wip_iteration_no, 0 location_no, 0 sect_obj_no, 0 risk_obj_no, 0 cov_obj_no, sum(tot_prem_amt) TOT_PREM_AMT, sum(end_prem_amt) END_PREM_AMT, sum(offset_prem_amt) OFFSET_PREM_AMT, sum(onset_prem_amt) ONSET_PREM_AMT, sum(base_prem_amt) BASE_PREM_AMT, sum(sbase_prem_amt) SBASE_PREM_AMT, sum(scalc_prem_amt) SCALC_PREM_AMT, sum(disc_amt) DISC_AMT, sum(sur_amt) SUR_AMT, sum(add_sur_amt) ADD_SUR_AMT, sum(oth_disc_amt) OTH_DISC_AMT, sum(chg_tax_1_amt) CHG_TAX_1_AMT, sum(chg_tax_2_amt) CHG_TAX_2_AMT, sum(chg_tax_3_amt) CHG_TAX_3_AMT, sum(chg_tax_4_amt) CHG_TAX_4_AMT, sum(chg_tax_5_amt) CHG_TAX_5_AMT, sum(chg_tax_6_amt) CHG_TAX_6_AMT, sum(chg_tax_7_amt) CHG_TAX_7_AMT, sum(new_impl_prem_amt) NEW_IMPL_PREM_AMT from twrkgrid where wip_no = @wip_no and wip_iteration_no = @wip_iteration_no and cov_obj_no > 0 group by wip_no, wip_iteration_no UPDATE TWRKGRID SET TOT_PREM_AMT = b.tot_prem_amt, END_PREM_AMT = b.end_prem_amt, OFFSET_PREM_AMT= b.offset_prem_amt, ONSET_PREM_AMT = b.onset_prem_amt, BASE_PREM_AMT = b.base_prem_amt, SBASE_PREM_AMT = b.sbase_prem_amt, SCALC_PREM_AMT = b.scalc_prem_amt, DISC_AMT = b.disc_amt, SUR_AMT = b.sur_amt, ADD_SUR_AMT = b.add_sur_amt, OTH_DISC_AMT = b.oth_disc_amt, CHG_TAX_1_AMT = b.chg_tax_1_amt, CHG_TAX_2_AMT = b.chg_tax_2_amt, CHG_TAX_3_AMT = b.chg_tax_3_amt, CHG_TAX_4_AMT = b.chg_tax_4_amt, CHG_TAX_5_AMT = b.chg_tax_5_amt, CHG_TAX_6_AMT = b.chg_tax_6_amt, CHG_TAX_7_AMT = b.chg_tax_7_amt, NEW_IMPL_PREM_AMT = b.new_impl_prem_amt, TIMESTAMP = GETDATE() from #t b WHERE b.wip_no = twrkgrid.wip_no and b.wip_iteration_no = twrkgrid.wip_iteration_no and b.location_no = twrkgrid.location_no and b.sect_obj_no = twrkgrid.sect_obj_no and b.risk_obj_no = twrkgrid.risk_obj_no and b.cov_obj_no = twrkgrid.cov_obj_no END На таблице, как положенно, уникальный индекс по используемым ключам. авторCREATE UNIQUE NONCLUSTERED INDEX xtwrkg ON dbo.twrkgrid(wip_no,wip_iteration_no,location_no,sect_obj_no,risk_obj_no,cov_obj_no) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2004, 20:28 |
|
||
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
Дай еще определение (полное, с индексами и констрейнтами) таблицы TWRKGRID и других используемых (кроме временной), если они есть (я сходу вроде только TWRKGRID увидел). На вскидку ощущение что вы GROUP BY неправильно пишите, раз уж вам потребовалось DISTINCT писать. Посмотрю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2004, 11:43 |
|
||
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
Нет, с GROUP BY все в порядке. в -- total for risk insert into #t select distinct ... надо убрать DISTINCT, он не нужен и вреден - если потом внесете ошибку в запрос, DISTINCT будет ее скрывать. Проблема может быть в самом update, UPDATE TWRKGRID SET TOT_PREM_AMT = b.tot_prem_amt, ... from #t b здесь важно, чтобы записи в TWRKGRID и #t b соотносились друг с другом как 1:1 по условию b.wip_no = twrkgrid.wip_no and b.wip_iteration_no = twrkgrid.wip_iteration_no and b.location_no = twrkgrid.location_no and b.sect_obj_no = twrkgrid.sect_obj_no and b.risk_obj_no = twrkgrid.risk_obj_no and b.cov_obj_no = twrkgrid.cov_obj_no Если этого не будет, будут ошибки. А чтобы это понять, надо данные видеть. Можно даже написать проверку перед UPDATE, что в TWRKGRID есть одна и только одна запись для каждой записи в #t, производительность это сильно не должно затронуть, поскольку есть индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2004, 12:07 |
|
||
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
MasterZivДай еще определение (полное, с индексами и констрейнтами) таблицы TWRKGRID и других используемых (кроме временной), если они есть (я сходу вроде только TWRKGRID увидел). Только TWRKGRID используется. Код: 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. MasterZivнадо убрать DISTINCT, он не нужен и вреден - если потом внесете ошибку в запрос, DISTINCT будет ее скрывать. Да, и правда, не пойму зачем нужен был distinct если есть group by. Попробую поменять. MasterZivПроблема может быть в самом update, ...важно, чтобы записи в TWRKGRID и #t b соотносились друг с другом как 1:1 по условию По определению так и должны относиться. Эти процедуры активно используются года три на других базах. А на новом внедрении вдруг заметили глюки, которых нет на других серверах. Вопрос был о неожиданной сбойности процедур. Ну не понимаю я как может одна и та же процедура давать разные результаты на одних и тех же данных в одном из пяти - десяти тестов. Может тех поддержка Sybasе объяснит. Сегодня отправил им запрос, врочем, они не очень оптимистичны, т.к. версия сервера старая 11.0.3. MasterZiv, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2004, 13:26 |
|
||
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
Уф. Нашел вчера проблему. Где то, в коде приложения, затерялся set rowcount 1 , который, ежели раз запушен, устанавливает ограничение на select/insert/update на все соединение. Так как приложение многопоточное и соединение то отдавалось в пул, то доставались из него различными потоками, то это и давало трудноуловимый эффект нестабильности работы с сервером. Прикольно. Только жалко, что неделя трудов ушла на отлов глюка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2004, 17:42 |
|
||
|
Нестабильные апдейты
|
|||
|---|---|---|---|
|
#18+
Ну а я что тебе говорил примерно неделю назад ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2004, 11:25 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32642331&tid=2014289]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 136ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...