20.04.2015, 10:55 | #1 |
Участник
|
"Двойное" обновление строк
Добрый день, знатоки. В процессе отладки программы столкнулся со странностью.
X++: ttsbegin; i = 1; while select forupdate inOutData where inOutData.InOutDate >= firstDate && inOutData.InOutDate <= lastDate { if (i <= conlen(data)) { con = conpeek(data, i); inOutData.EmplId = conpeek(con, 1); inOutData.InOutDate = conpeek(con, 2); inOutData.InOutTime = conpeek(con, 3); inOutData.InOutType = conpeek(con, 4); inOutData.update(); } else inOutData.delete(); i++; } while (i <= conlen(data)) { con = conpeek(data, i); inOutData.clear(); inOutData.EmplId = conpeek(con, 1); inOutData.InOutDate = conpeek(con, 2); inOutData.InOutTime = conpeek(con, 3); inOutData.InOutType = conpeek(con, 4); inOutData.insert(); i++; } ttscommit; |
|
20.04.2015, 11:00 | #2 |
Участник
|
скорее всего из-за того что вы меняете значения полей, которые участвуют в фильтре селекта
|
|
20.04.2015, 11:13 | #3 |
Участник
|
ice, да, они могут поменяться, но по прежнему остаются в диапазоне firstDate .. lastDate. И каким образом добавление сортировки решает проблему?
Последний раз редактировалось Xardas; 20.04.2015 в 11:20. |
|
20.04.2015, 11:32 | #4 |
Участник
|
Сталкивался с подобными ситуациями на разных версиях MS SQL. При обновлении полей участвующий в критериях запроса, происходит повторная выборка. Видимо при сортировки этого не происходит.
|
|
20.04.2015, 11:45 | #5 |
Участник
|
Если сортировка не указана явно, то, по умолчанию, упорядочивание идет по кластерному индексу (если это возможно). У Вас поле InOutDate в кластерном индексе таблицы inOutData не используется?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
20.04.2015, 12:04 | #6 |
Участник
|
Владимир Максимов, на этой таблице вообще нет кластерного индекса.
|
|
20.04.2015, 13:56 | #7 |
Участник
|
Несколько аксиом SQL-серверов
Из этого следует, что при отсутствии опции ORDER BY модификация данных в цикле может приводить к многократным повторным модификациям. Можно считать это фичей работы с SQL-серверами.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 20.04.2015 в 14:14. |
|
|
За это сообщение автора поблагодарили: Xardas (1). |
20.04.2015, 15:00 | #8 |
Участник
|
Владимир Максимов, хорошо, с этим понятно. А что произойдет, если я сделаю сортировку по неуникальному полю? Например, EmplId в данной таблице неуникально. Порядок строк с одинаковым EmplId также будет случаен?
|
|
20.04.2015, 20:46 | #9 |
Участник
|
Цитата:
Хотя в подавляющем большинстве случаев некая упорядоченность просматривается, но нет никакой гарантии, что так будет всегда, если явно не указать дополнительную сортировку, хотя бы по тому же RecId. order by EmplId, RecId Для общего развития можете посмотреть статьи на sql.ru Вопрос на злобу дня - Просмотр кластеризованного индекса - Часть I Вопрос на злобу дня - Просмотр кластеризованного индекса - Часть II Вопрос на злобу дня - Просмотр кластеризованного индекса - Часть III Где очень кратко рассматривается внутренняя механика выборки MS SQL 2000 и 2005 в случае наличия кластерного индекса Вот здесь чуть побольше и разнообразнее Индексы. Теоретические основы
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: Logger (10), G.Menshikh (1). |
21.04.2015, 08:45 | #10 |
Участник
|
Владимир Максимов, благодарю развернутые ответы!
|
|
|
|