06.04.2011, 02:20 | #21 |
Участник
|
Цитата:
Правда, прямое использование SQL я не пробовал. Почему-то считал, что с точки зрения SQL сервера это будет тоже самое, что и doupdate из Аксапты - вид сбоку. Это не так? Не понял, почему не будет? В каждой записи поля заполняются разными значениями, каким же образом я буду определять какую запись я сейчас буду модифицировать? Последний раз редактировалось Hyper; 06.04.2011 в 03:04. Причина: исправил на doupdate |
|
06.04.2011, 02:35 | #22 |
Участник
|
Цитата:
Все равно, уточните еще: = вы делаете свои "модификации огромного количества записей" при работающих пользователях? если вы делаете монопольно, то вам также не нужно разбивать на куски. если далаете при работающих, то надо разбивать. все-таки, скажите пожалуйста: = что установлено в Recovery Model в свойствах вашей базы? = каков размер Transaction Log в вашей базе? = каковы настройки прироста Transaction Log в вашей базе? = сколько свободного места на диске, где находится Transaction Log? (вопрос связан с тем, что на NTFS дисках сильно возрастает время увеличения файла, если осталось мало места) и все-таки - не занимайтесь ерундой. проведите ваше обновление при неработающих пользователях (в пакетнике, ночью). Честное слово, 700тыс записей - не такое уж и большое число записей. Даже для SQL2000. Цитата:
в SQL2000 был прирост по-умолчанию в 10%. Поэтому если ваш Transaction Log изначально мал, то он рос маленькими кусочками (на что тратится очень много времени). Кроме того, сильно увеличивается фрагментация диска. сделайте прирост фиксированными и относительно большими кусками 200-300Мб. Цитата:
Конечно принципиальная. С точки зрения СУБД. Но с точки зрения Аксапты - особой разницы нет. С точки зрения Аксапты - в случае чего, откат (rollback) затронет все что было внутри транзакции. |
|
06.04.2011, 02:39 | #23 |
Участник
|
Цитата:
Вы ж насилуете Аксапточку почем зря. Она сама отдаст и все сделает. помните только одно: 700тыс - не самый большой объем. работали же. ищите причину тормозов. с огромной вероятностью, они где-то на стороне SQL. (пишу "с огромной вероятностью", поскольку от людей, которые используют UserConnection для разбивки на блоки, можно ожидать чего угодно). |
|
06.04.2011, 02:40 | #24 |
Участник
|
Кстати, насчет "ждать чего угодно".
Скажите, метод update на вашей обновляемой таблице переопределен? Если переопределен, то он ничего не запоминает во внутренние структуры в пределах одной транзакции? Цитата:
кроме того, аксапта может перейти в другой режим обновления если таблица отслеживается в SysDatabaseLog. Но главное - посмотрите в метод update. |
|
06.04.2011, 02:44 | #25 |
Участник
|
Цитата:
Цитата:
Сообщение от mazzy
все-таки, скажите пожалуйста:
= что установлено в Recovery Model в свойствах вашей базы? = каков размер Transaction Log в вашей базе? = каковы настройки прироста Transaction Log в вашей базе? = сколько свободного места на диске, где находится Transaction Log? (вопрос связан с тем, что на NTFS дисках сильно возрастает время увеличения файла, если осталось мало места) Последний раз редактировалось Hyper; 06.04.2011 в 02:46. |
|
06.04.2011, 02:46 | #26 |
Участник
|
Цитата:
Впрочем, как скажете. Если других пользователей нет, то и в SQL2000 разбивать на блоки нет никакого смысла. |
|
06.04.2011, 02:47 | #27 |
Участник
|
|
|
06.04.2011, 02:49 | #28 |
Участник
|
|
|
06.04.2011, 02:52 | #29 |
Участник
|
ой... как скажете, конечно. забота о целостности полностью на ваших плечах
но в рамках данной темы это значит, что побочных эффектов не должно - doupdate аксапты эквивалентен update одной (!) записи с SQL-сервера. |
|
06.04.2011, 02:59 | #30 |
Участник
|
Да. В детали вдаваться не буду, но о целостности данных в контексте данной задачи (не буду отвлекаться на полное ее описание) волноваться не стоит.
Так. И все-таки с точки зрения СУБД SQL 2000, не Аксапты, с точки зрения быстродействия есть какая-то разница делать 700 000 мелких транзакций или одну большую? |
|
06.04.2011, 03:11 | #31 |
Участник
|
Цитата:
вы говорите, что других работающих пользователей не будет. значит влияние на других можно не учитывать. Если Recovery Model = Full то с точки зрения СУБД накладных расходов на обслуживание 700 000 мелких транзакций значительно больше, чем на обслуживание одной большой. (в этом режиме все транзакции хранятся в transaction log). в этом случае 700 000 мелких транзакций - как самоубийство тупым столовым ножом. Если Recovery Model = Simple то СУБД выкидывает информацию о выполненных транзакциях. в этом случае мелкие транзакции гарантировано поместятся даже в маленьких Transaction Log. Из-за отсутствия затрат времени на рост Transaction Log (как правило очень существенных, измеряемых в долях секунды) много мелких транзакций может выполнится гораздо быстрее, чем одна большая транзакция. (накладные расходы на обслуживание транзакции измеряются килобайтами и микросекундами) ================ чтобы гарантировано сделать работу быстрой - избавьтесь от накладных расходов на рост Transaction Log. Сразу поставьте ему вменяемый размер и сразу задайте вменяемые параметры роста. ================ есть и другие различия. но они дадут проценты к производительности. в разы - вряд ли. |
|
06.04.2011, 11:52 | #32 |
Участник
|
1. Массовое обновление для СУБД лучше всего производить запросами update_recordset или если его синтаксиса не хватает, то прямыми на сервер СУБД. В этом случае сервер сможет самостоятельно оптимизировать процесс обновления. Хотя бывают и исключения
2. Если обновление будет выполняться по одной записи и целостность данных не волнует, то лучше обновлять каждую запись в своей транзакции вне зависимости от модели восстановления сервера. Если все выполнять в одной транзакции, то накладные расходы сервера СУБД на блокировки (или версионность) множества записей с лихвой перекроют расходы на обслуживание кучи транзакций. |
|
06.04.2011, 12:10 | #33 |
Участник
|
Цитата:
поэтому спорно. но мнение имеет право на жизнь. |
|
06.04.2011, 12:33 | #34 |
Участник
|
Нормальный вполне способ. Сам так и делаю частенько.
Цитата:
Это точно. За время обсуждения можно было вручную всё проапдейтить (утрирую конечно, но всё же..) |
|
06.04.2011, 12:42 | #35 |
Участник
|
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: "лучше обновлять каждую запись в своей транзакции вне зависимости от модели восстановления сервера. Если все выполнять в одной транзакции, то накладные расходы сервера СУБД на блокировки (или версионность) множества записей с лихвой перекроют расходы на обслуживание кучи транзакций." Хоть бери да бросай монетку. |
|
06.04.2011, 12:45 | #36 |
Участник
|
|
|
06.04.2011, 12:46 | #37 |
Участник
|
|
|
06.04.2011, 12:52 | #38 |
Участник
|
|
|
06.04.2011, 13:13 | #39 |
Модератор
|
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
06.04.2011, 13:13 | #40 |
Участник
|
да. спасибо.
|
|