|
![]() |
#1 |
Участник
|
Цитата:
Все равно, уточните еще: = вы делаете свои "модификации огромного количества записей" при работающих пользователях? если вы делаете монопольно, то вам также не нужно разбивать на куски. если далаете при работающих, то надо разбивать. все-таки, скажите пожалуйста: = что установлено в Recovery Model в свойствах вашей базы? = каков размер Transaction Log в вашей базе? = каковы настройки прироста Transaction Log в вашей базе? = сколько свободного места на диске, где находится Transaction Log? (вопрос связан с тем, что на NTFS дисках сильно возрастает время увеличения файла, если осталось мало места) и все-таки - не занимайтесь ерундой. проведите ваше обновление при неработающих пользователях (в пакетнике, ночью). Честное слово, 700тыс записей - не такое уж и большое число записей. Даже для SQL2000. Цитата:
в SQL2000 был прирост по-умолчанию в 10%. Поэтому если ваш Transaction Log изначально мал, то он рос маленькими кусочками (на что тратится очень много времени). Кроме того, сильно увеличивается фрагментация диска. сделайте прирост фиксированными и относительно большими кусками 200-300Мб. Цитата:
![]() Конечно принципиальная. С точки зрения СУБД. Но с точки зрения Аксапты - особой разницы нет. С точки зрения Аксапты - в случае чего, откат (rollback) затронет все что было внутри транзакции. |
|
![]() |
#2 |
Участник
|
Цитата:
Цитата:
Сообщение от mazzy
![]() все-таки, скажите пожалуйста:
= что установлено в Recovery Model в свойствах вашей базы? = каков размер Transaction Log в вашей базе? = каковы настройки прироста Transaction Log в вашей базе? = сколько свободного места на диске, где находится Transaction Log? (вопрос связан с тем, что на NTFS дисках сильно возрастает время увеличения файла, если осталось мало места) Цитата:
![]() Последний раз редактировалось Hyper; 06.04.2011 в 02:46. |
|
![]() |
#3 |
Участник
|
Цитата:
Впрочем, как скажете. Если других пользователей нет, то и в SQL2000 разбивать на блоки нет никакого смысла. |
|
![]() |
#4 |
Участник
|
|
|
![]() |
#5 |
Участник
|
Цитата:
Правда, прямое использование SQL я не пробовал. Почему-то считал, что с точки зрения SQL сервера это будет тоже самое, что и doupdate из Аксапты - вид сбоку. Это не так? Не понял, почему не будет? В каждой записи поля заполняются разными значениями, каким же образом я буду определять какую запись я сейчас буду модифицировать? Последний раз редактировалось Hyper; 06.04.2011 в 03:04. Причина: исправил на doupdate |
|
![]() |
#6 |
Участник
|
Цитата:
Вы ж насилуете Аксапточку почем зря. Она сама отдаст и все сделает. помните только одно: 700тыс - не самый большой объем. работали же. ищите причину тормозов. с огромной вероятностью, они где-то на стороне SQL. (пишу "с огромной вероятностью", поскольку от людей, которые используют UserConnection для разбивки на блоки, можно ожидать чего угодно). |
|
![]() |
#7 |
Участник
|
Кстати, насчет "ждать чего угодно".
Скажите, метод update на вашей обновляемой таблице переопределен? Если переопределен, то он ничего не запоминает во внутренние структуры в пределах одной транзакции? Цитата:
кроме того, аксапта может перейти в другой режим обновления если таблица отслеживается в SysDatabaseLog. Но главное - посмотрите в метод update. |
|
![]() |
#8 |
Участник
|
|
|
![]() |
#9 |
Участник
|
ой... как скажете, конечно. забота о целостности полностью на ваших плечах
![]() но в рамках данной темы это значит, что побочных эффектов не должно - doupdate аксапты эквивалентен update одной (!) записи с SQL-сервера. |
|
![]() |
#10 |
Участник
|
Recovery Model: Full
Space allocated for Transaction Log: 80 MB Transaction Log File Growth: 500 MB Свободного места на диске, где находится Transaction Log: 204 GB О настройках логов уже не беспокоюсь. Обновление будет выполняться по одной записи и целостность данных не волнует. mazzy: "с точки зрения СУБД накладных расходов на обслуживание 700 000 мелких транзакций значительно больше, чем на обслуживание одной большой. (в этом режиме все транзакции хранятся в transaction log). в этом случае 700 000 мелких транзакций - как самоубийство тупым столовым ножом." Alexius: "лучше обновлять каждую запись в своей транзакции вне зависимости от модели восстановления сервера. Если все выполнять в одной транзакции, то накладные расходы сервера СУБД на блокировки (или версионность) множества записей с лихвой перекроют расходы на обслуживание кучи транзакций." Хоть бери да бросай монетку. ![]() |
|
![]() |
#11 |
Участник
|
|
|
![]() |
#12 |
Участник
|
|
|
![]() |
#13 |
Модератор
|
![]()
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
![]() |
#14 |
Участник
|
|
|
![]() |
#15 |
Участник
|
да. спасибо.
|
|
![]() |
#16 |
Участник
|
Всем спасибо за советы. На чем я остановился:
Обновление таблиц с уникальными индексами по одному полю буду проводить кусками по пять-десять тысяч записей в одной транзакции. Во-первых, код уже написан и хуже от него точно не будет, а во-вторых, исходя из обсуждения, что лучше делать при Full Recovery Model - одну транзакцию на запись или одну транзакцию на таблицу, - вопрос спорный. Остальные таблицы (их всего несколько) я решил пока обновлять по одной транзакции на таблицу. Тесты на мизерной базе данных пока показывают, что при использовании кучи мелких транзакций процесс выполняется медленнее, чем при меньшем количестве более крупных транзакций. Конечно, это не тест, а ерунда, т.к. при большой БД все может быть по другому, настройки данной БД не идентичны настройкам БД клиента и т.д., но пока что пусть будет так. Будет возможность - проверю в нормальных условиях. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |