|
|
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев После UPDATE у клиента и сервера разные ts_Entity Во-первых, не ясно, каким образом. Возможно, конечно, Вы там ещё для этого триггер повесили, но не суть. В любом случае тот update, который я привёл, делает ровно то же самое и возвращает "новый" ts. ВМоисеев Уточните, о каком удвоении нагрузки Вы пишите? Ну наконец-то. Не пробовали задуматься над этим вопросом хотя бы на прошлой странице, раз уж это Вам не очевидно? Тогда очередной ликбез. Реляционные СУБД можно рассматривать как программы, оперирующие данными на диске. Дисковый ввод-вывод буферизуется блоками стандартного объёма (иногда их называют страницами или прочими подобными словами). Например, Oracle по умолчанию использует блоки размером 8Кб. В других СУБД могут быть технические отличия, но суть везде одна. Если Вам нужно прочитать один байт - будут прочитаны как минимум восемь килобайт; если Вам нужно записать один байт - будут записаны как минимум восемь килобайт (а перед этим, если потребуется, ещё и прочитаны). Но для того, чтобы добраться до этого байта, нужно ещё и узнать его адрес на диске - а для этого в случае доступа по первичному ключу, скорее всего, будет использован индекс. То есть с диска будут считаны ещё килобайт пятьдесят индексной информации, чтобы добраться до этого байта. То есть даже очень мелкое изменение оказывается довольно дорогой операцией. Ситуацию отчасти спасает кэширование. Считанные блоки данных кэшируются в оперативной памяти и позволяют следующие операции с этими данными уже без нового обращения к диску. Однако, сервер БД - высококонкурентная среда. За кэш данных борются тысячи параллельно идущих транзакций, каждая из которых пытается положить в него свои данные и вытеснить чужие. Если пустить это на самотёк - получится огромный бессмысленный бардак, который и станет узким местом системы. Стратегии и настройки кэширования - одна из стандартных "головных болей" разработчиков СУБД, и в целом эффективность кэширования - важнейший показатель качества СУБД и ожидаемой скорости её работы. В итоге разработчик не имеет реальных шансов сказать, какая страница данных в какой момент времени будет закеширована или нет, поэтому в оценках ресурсоёмкости операций используют логические чтения - по сути "обращение к диспетчеру за блоком данных", понимая, что с вероятностью X это будет чтение из памяти, а с вероятностью (1-X) - с диска, где X мало зависит от разработчика конкретного куска функциональности, а определяется железом сервера, настройками, размером базы, количеством и разнообразием других операций с этими данными и т. д. и т. п. Дальнейшее проще показать статистикой. Я приведу для Oracle, но как я уже сказал, картина плюс-минус одинакова везде. Для начала подготовим данные: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Теперь посмотрим, сколько логических чтений уходит на update. Код: plsql 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. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Добавим к этому то, что уходит на select Код: plsql 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. 29. 30. 31. 32. 33. 34. 35. И Вам остаётся самостоятельно догадаться, откуда в Вашем замечательном решении вдруг берётся паразитное удвоение нагрузки на сервер. ВМоисеев И право, не Вам говорить о хамстве. Серьёзно? Решительно не вижу, с чего бы вдруг мне не говорить о хамстве. Кажется, Вы снова пытаетесь что-то переложить со своей головы на здоровую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 16:36 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>hVostt, сегодня, 15:35 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141364][22141364] >Вы по делу когда хоть что-то сказали? < Начало здесь . Ваш ответ . Я привел пример, где использую ХП - UPDATE. Далее здесь , здесь и здесь . Далее можно это и это . Мой ответ . Текущий вариант: Код: c# 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. 29. По завершению ХП UPDATE клиентский метод имеет: 1. yrow - старые параметры сущности 2. xrow - новые параметры сушности 3. wspErr - код завершения. Что здесь плохого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 17:36 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>softwarer, сегодня, 16:36 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141454][22141454] >Ну наконец-то … < Спасибо за ликбез. Но клиент должен получить новый ts_Entity, желательно за одно обращение к базе данных, см. здесь . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 17:50 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев Спасибо за ликбез. Но клиент должен получить новый ts_Entity Какое именно слово в Код: plsql 1. 2. 3. 4. Вам непонятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 17:55 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>softwarer, сегодня, 16:36 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141454][22141454] >Дальнейшее проще показать статистикой < Давайте по-взрослому - напишите ХП и приведите данные по её работе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 17:56 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев Давайте по-взрослому - напишите ХП и приведите данные по её работе. У трассировки хранимок больше геморроя с выводом результатов в текстовом виде, а итог тот же самый. Если Вы думаете, что селект внутри хранимой процедуры вдруг перестанет запрашивать данные - подумайте ещё раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 18:02 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>softwarer, сегодня, 17:55 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141517][22141517] >Какое именно слово в … < returning. Найдите его здесь . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 18:46 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев >softwarer, сегодня, 17:55 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141517][22141517] >Какое именно слово в … < returning. Найдите его здесь . Вы свою же ссылку читали? СсылкаВ инструкции UPDATE можно использовать имена переменных для показа старых и новых значений , но только в том случае, если инструкция UPDATE обрабатывает одну запись. Если инструкция UPDATE затрагивает несколько записей, для возвращения старых и новых значений каждой записи используйте предложение OUTPUT. https://docs.microsoft.com/ru-ru/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 19:05 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>softwarer, сегодня, 17:55 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141517][22141517] >Какое именно слово в … < Меня не устраивает это - "Предложение RETURNING указывает, что команда UPDATE должна вычислить и возвратить значения для каждой фактически изменённой строки." Если UPDATE … RETURNING не изменил ни одной записи, что будет возвращено клиенту? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 19:36 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев Меня не устраивает это Примите величественную позу и скажите вендору, что Вас ещё не устраивает. Бьюсь об заклад, список выйдет длинным. А он, без сомнения, прислушается. ВМоисеев Если UPDATE … RETURNING не изменил ни одной записи, что будет возвращено клиенту? Вы точно уверены, что я должен за Вас прочитать доку и доступными словами разжевать Вам ответ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 19:38 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>softwarer, сегодня, 19:38 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141603][22141603] >Вы точно уверены… < Да Вы большой оригинал - на мое отвечаете этим , представления не имея, как сиё работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 20:38 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
Я знаю как работает returning. И Вы тоже могли бы узнать, если бы открыли документацию и прочитали. Если же Вы считаете, что с Вами должны нянчиться - это объясняет, почему Вы до сих пор не достигли даже уровня junior-а, способного пройти собеседование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 21:46 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>softwarer, сегодня, 21:46 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141702][22141702] >Я знаю как работает returning... < Сомневаюсь. Судя по этому - "returning_clause Returns values from updated rows ...If the statement does not affect any rows, the values of the variables specified in the RETURNING clause are undefined" Ваш код пустышка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 22:52 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев Ваш код пустышка Ох, какое же ты пустое трепло. Лучше открой документацию по returning в Postgre и прочитай там, что он делает ровно то же, что и твой селект. Вот прямо английским языком написано - возвращает те же данные, которые вернул бы селект этих полей из affected строк. Так что ты только что назвал пустышкой собственное решение, красавец ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2020, 23:01 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев По завершению ХП UPDATE клиентский метод имеет: 1. yrow - старые параметры сущности 2. xrow - новые параметры сушности 3. wspErr - код завершения. Что здесь плохого. Всё плохо. 1. Ваш код крайне тяжело сопровождать. 2. Код невозможно протестировать, так как часть логики в БД, часть логики в клиентском коде. 3. ХП на апдейт выполняет две операции: обновление и возврат данных, хотя у вас уже есть отдельная ХП на возврат данных, значит вы дублируете код -- очень велика вероятность сделать ошибку, поддерживать два разных кода возврата одних и тех же данных -- очень плохо. 4. ХП обновления выполняет две разных операций, что нарушает принцип единственной обязанности. 5. Код обновления прибит гвоздями к одному единственному способу блокировки, а это ни что иное, как костыли. 6. Ваш код представляет из себя 80% откровенного мусора и дублирования и 20% (в лучшем случае!) хоть какой-то полезной логики. С увеличением количества сущностей, такой код становится сложнее и сложнее сопровождать, абсолютно невозможно провести вменяемый рефакторинг или хоть какие-то изменения без переписывания всего, или без монотонных одних и тех же изменений. Плохой код это не проблема. Никто не способен писать идеальный код всегда. Люди развиваются, растут, умеют учиться. Не в коде проблема. Проблема в вас. Вы не желаете учиться и развиваться. Не понимаю чего вы хотите. Зачем нам вот это каждый раз впариваете. Вы там на медаль что-ли идёте по твердолобости? Может кто-то ставки принимает? Чё за фигня вообще с вами происходит?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 04:11 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев Но клиент должен получить новый ts_Entity, желательно за одно обращение к базе данных, см. здесь . Я даже боюсь спрашивать. С какого перепугу "должен" и с чего вы взяли, что это "желательно"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 04:12 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
hVostt Плохой код это не проблема. Личный опыт это если в проекте хотя бы только 50% говнокода, то это уже очень хороший проект. Есть куда более страшные вещи, чем говнокод :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 08:10 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>softwarer, вчера, 23:01 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141778][22141778] >Ох, какое же ты пустое трепло... Так что ты только что назвал пустышкой собственное решение, красавец < Хамства Вам положим не занимать. Ну да ладно, перейдем к сути. Что предлагаю я - Здесь мой код UPDATE. Я работаю с оптимистической блокировкой. Поэтому есть вероятность того, что моя копия сущности на рабочем компьютере не совпадает с оригиналом. Опираясь на информацию копии, принимаю решение о её модификации с последующим изменением оригинала. Понятно что оригинал может быть кем-то изменен, но я этого не знаю. Код: Код: c# 1. 2. 3. делает попытку изменения оригинала. Возможны ситуации: 1. операция ок, клиенту нужно передать timestamp, ибо оно показывает, что оригинал и копия клиента тождественны. 2. имеет место быть не штатная ситуация, что приведет флаг ошибки в 1. - сбойнуло железо (?) - другой клиент мог удалить оригинал сущности - другой клиент мог изменить оригинал сущности Код: Код: c# 1. проверяет присутствие не штатной ситуации если присутствие наблюдается, то попытка чтения оригинала с передачей строки таблицы в качестве текущей копии клиенту. Клиент получает или оригинал или пусто. если не штатная ситуация отсутствует, клиент получает timestamp своего изменения. Здесь Ваше предложение. В случае штатной ситуации результаты наших решений совпадают. А как поведет Ваш код в случае не штатной ситуации - другой клиент мог изменить оригинал сущности-. Повторяю "Returns values from updated rows ...If the statement does not affect any rows, the values of the variables specified in the RETURNING clause are undefined" и меня большие подозрения, что я не получу значение оригинала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 11:05 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>hVostt, сегодня, 04:12 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141942][22141942] >Я даже боюсь спрашивать. С какого перепугу "должен" и с чего вы взяли, что это "желательно"? < Я считаю, что пользователь может менять только тот оригинал базы, что совпадает с его локальной копией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 11:15 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
>hVostt, сегодня, 04:11 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1325462&msg=22141941][22141941] >Всё плохо < Я думаю иначе. Понятно, что Ваши измы мне по барабану. Поэтому, давайте оставим в покое философию и графоманию и будем обсуждать конкретные проблемы. В текущей ситуации - ХП и UPDATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 11:24 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
hVostt 2. Код невозможно протестировать, так как часть логики в БД, часть логики в клиентском коде. Н-да. До сих пор Вы оставались единственным, кроме меня, кто не говорил глупостей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 12:37 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ВМоисеев Что предлагаю я Что "предлагаешь" ты - всем было понятно ещё позавчера. Равно как и то, как это работает. Как отработает под Ораклом то, что написал я - можешь посмотреть. Как отработает аналог под Postgre - ну смотря кто и как напишет. Если задашься целью, чтобы было ещё хуже чем у тебя - без сомнения, сумеешь сделать именно так. Ну а свои подозрения по поводу того, чего ты не получишь, если кто-нибудь изменил id записи... Спасибо, смешно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 13:02 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
softwarer ВМоисеев Что предлагаю я Что "предлагаешь" ты - всем было понятно ещё позавчера. Равно как и то, как это работает. Как отработает под Ораклом то, что написал я - можешь посмотреть. Как отработает аналог под Postgre - ну смотря кто и как напишет. Если задашься целью, чтобы было ещё хуже чем у тебя - без сомнения, сумеешь сделать именно так. Ну а свои подозрения по поводу того, чего ты не получишь, если кто-нибудь изменил id записи... Спасибо, смешно. по докам они работают одинаково ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 13:28 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
ViPRos по докам они работают одинаково Думаю, пафос Владимира вызван в основном тем, что он тоже смотрит доки, не прочитав и не поняв смысл самого update-а и не задавшись вопросом "почему он отличается от моего". В прошлый раз он бросил поверхностный взгляд и даже не увидел returning, а когда я ткнул его в это носом - полез копать про returning, так и не посмотрев в написанный update, а просто решив "ну наверняка то же самое, что у меня, только с добавлением returning". У Оракла в случае апдейта нуля строк в переменной просто сохранится предыдущее значение. Ну и sql%rowcount будет равно нулю, само собой. Как будет у Postgre - не знаю. Достаточно фразы из доки про "тот же результат, что в селекте", чтобы сказать, что будет ровно как во владимировской нетленке - с точностью до того, что дока врёт, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 13:44 |
|
||
|
Взаимодействие клиентов с БД.
|
|||
|---|---|---|---|
|
#18+
softwarer У Оракла в случае апдейта нуля строк в переменной просто сохранится предыдущее значение. Ну и sql%rowcount будет равно нулю, само собой. Как будет у Postgre - не знаю. Достаточно фразы из доки про "тот же результат, что в селекте", чтобы сказать, что будет ровно как во владимировской нетленке - с точностью до того, что дока врёт, конечно. ну, если доки не врут, то получается, что нечего было наезжать на бедного Моисеева по части нагрузки на сервер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2020, 14:33 |
|
||
|
|

start [/forum/topic.php?fid=33&msg=39963541&tid=1547103]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 176ms |

| 0 / 0 |
