|
![]() |
#1 |
Участник
|
Очень странно, вы нарушили две рекомендации (не делать длинных транзакций и иметь покрывающий индекс для where) чтобы показать, что тогда третья рекомендация не будет работать.
А дальше сомнительные, ничем не подкрепленный вывод: Цитата:
Try to avoid any update_recordset and delete_from usage by default(especially in document posting operations). Use it only when you are 100% sure that it will not cause blocking and you really need to reduce the operation time
Что вообще такое document posting ? И если вы уже говорите ut when someone tries to update the same table using a different set of fields(for example Field2 and Field4) we'll get blocking again., то используя ваш подход можно преположить, что любой кусок кода может быть использован кем-то дргуим как-то не так и надо быть к этому готовым! Т.е. все может стать document posting, чтобы это не было. ![]() |
|
![]() |
#2 |
Moderator
|
Я просто замечу что две первых рекомендации не всегда выполнимы. Если разносится большой документ, то на короткие транзации это не порезать. Кроме того - покрывающий индекс на каждую возможную комбинацию полей в where тоже не всегда доступен. Кроме того, как я уже написал, время от времени (особенно на квазивременных таблицах типа InventSumDeltaDim), SQL Server переглючивает и он выбирает неправильный индекс, даже если правильный покрывающий индекс присутствует.
|
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от fed
![]() Я просто замечу что две первых рекомендации не всегда выполнимы. Если разносится большой документ, то на короткие транзации это не порезать. Кроме того - покрывающий индекс на каждую возможную комбинацию полей в where тоже не всегда доступен. Кроме того, как я уже написал, время от времени (особенно на квазивременных таблицах типа InventSumDeltaDim), SQL Server переглючивает и он выбирает неправильный индекс, даже если правильный покрывающий индекс присутствует.
![]() |
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
![]() |
#4 |
Участник
|
Цитата:
Цитата:
![]() Подобный вопрос обычно задавали при завершении стажировки в Коламбусе - какой вариант быстрее 1 или 2 X++: CustTable custTable; ; //1 select AccountNum from custTable where custTable.AccountNum == "C-0000101"; custTable = null; //2 custTable = custTable::find("C-0000101"); |
|
![]() |
#5 |
Участник
|
|
|
![]() |
#6 |
Banned
|
|
|
![]() |
#7 |
Banned
|
Цитата:
Сообщение от trud
![]() Ага, именно это и посыл поста, используем только когда нужно
Вы реально не знаете или это просто флуд? ![]() Подобный вопрос обычно задавали при завершении стажировки в Коламбусе - какой вариант быстрее 1 или 2 X++: CustTable custTable; ; //1 select AccountNum from custTable where custTable.AccountNum == "C-0000101"; custTable = null; //2 custTable = custTable::find("C-0000101"); |
|
![]() |
#8 |
Участник
|
Цитата:
![]() |
|
|
За это сообщение автора поблагодарили: trud (1). |
![]() |
#9 |
Участник
|
А вот тут можно подробнее, почему одинаково (пусть это уже и оффтоп)?
Вроде в случае когда у нас указан набор полей, у нас меньше количество данных передаваемых между клиентом-сервером, и поэтому работать должно быстрее? Best practicies опять же, настаивают именно на варианте "укажите в запросе конкретные нужные вам поля" |
|
![]() |
#10 |
Участник
|
Цитата:
Цитата:
А если переменную назвать не "custTable", а "с" будет быстрее? (сорри за стеб) А есть ссылка? |
|
![]() |
#11 |
Участник
|
![]() Цитата:
Сообщение от Pandasama
![]() А вот тут можно подробнее, почему одинаково (пусть это уже и оффтоп)?
Вроде в случае когда у нас указан набор полей, у нас меньше количество данных передаваемых между клиентом-сервером, и поэтому работать должно быстрее? Best practicies опять же, настаивают именно на варианте "укажите в запросе конкретные нужные вам поля" Видимо вам надо в коламбус на месяцок, подтянуть основы на стажеровочке ![]() Последний раз редактировалось skuull; 01.02.2019 в 08:42. |
|
![]() |
#12 |
Модератор
|
Цитата:
Цитата:
Best practicies опять же, настаивают именно на варианте "укажите в запросе конкретные нужные вам поля
trud, в Вашем примере сделано все (малый объем данных, выборка по непокрывающему индексу, диалог в транзакции) чтобы найти хоть какой-то сценарий в котором update_recordset работает хуже. Как пища для размышлений - да, годно. Насколько в реальных условиях несколько конкурентных update_recordset, на реальных объемах данных, завернутых в правильную обработку deadlock-ов, будут быстрее или медленнее (хотя бы в T2) - вот это уже было бы гораздо интереснее. Как Вы считаете? ![]()
__________________
-ТСЯ или -ТЬСЯ ? Последний раз редактировалось Vadik; 01.02.2019 в 10:34. |
|
|
За это сообщение автора поблагодарили: skuull (5). |
![]() |
#13 |
Участник
|
ну это постинг любых документов, закупок, заказов журналов - там где это наиболее критично. т.е. кейс - нам надо обновить что-то в нашей таблице, когда происходит разноска
ну в общем случае select forupdate не блокируется.Исключение составляет эскаляция блокировок, но это уже другая тема Цитата:
Сообщение от skuull
![]() И если вы уже говорите ut when someone tries to update the same table using a different set of fields(for example Field2 and Field4) we'll get blocking again., то используя ваш подход можно преположить, что любой кусок кода может быть использован кем-то дргуим как-то не так и надо быть к этому готовым! Т.е. все может стать document posting, чтобы это не было.
![]() |
|
![]() |
#14 |
Участник
|
Это та же самая тема. Вопрос эскалации встает при больших количествах данных\пользователей\потоков и говорить "тут больше 1-2х строк не будет" звучит не убидительно. Сегодня нет, а завтра поменяется бизнес процесс и их будет тысячи, что сядем все переписывать?
|
|
![]() |
#15 |
Moderator
|
Цитата:
А мы потом, по возможности, тоже поищем в нем ошибки и слегонца постебемся. ![]() |
|
![]() |
#16 |
Участник
|
Цитата:
![]() |
|
![]() |
#17 |
Moderator
|
Цитата:
Может это троллинг был ? Не может такого быть, просто не могу поверить... ![]() |
|
|
За это сообщение автора поблагодарили: skuull (0). |
![]() |
#18 |
Модератор
|
Цитата:
![]() Цитата:
Сообщение от trud
Пример 1 - индекс по полю Field2, update_recordset по поля Field2 и Field3. получаем блокировку (которой не было при select forupdate)
Пример 2 - индекс по полю Field2,Field3 update_recordset первой сессии по полям Field2 и Field3, второй сессии по Field2, Field4 получаем блокировку (которой опять же не было при select forupdate) Я это к чему - нет здесь универсальных рекомендаций и "правильных" решений. Много кто делает "правильно" (по BP или на основе каких-то городских мифов), мало кто проверяет как они работают ![]()
__________________
-ТСЯ или -ТЬСЯ ? Последний раз редактировалось Vadik; 01.02.2019 в 17:03. |
|