Показать сообщение отдельно
Старый 05.04.2011, 22:24   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Hyper Посмотреть сообщение
Но мне почему-то казалось, что групповое обновление записей (скажем, 500 или 1000 в одной транзакции) на больших объемах даст ощутимый прирост производительности. Я не прав?
Не-а. Вернее, в большинстве случаев не прав.

В зависимости от версии SQL, от выставленного Recovery Model и от размера файла для логов.

Цитата:
Сообщение от Hyper Посмотреть сообщение
700 000 записей в одной транзакции? Причем там не одна такая таблица.
легко. для SQL - это не страшные объемы.

Цитата:
Сообщение от Hyper Посмотреть сообщение
Вроде бы чем больше измененных записей в одной транзакции, тем хуже Аксапта(/SQL?) справляется, причем при достижении определенного порога все еле ворочается?
Причем здесь Аксапта?

Цитата:
Сообщение от Hyper Посмотреть сообщение
Оптимальным решением было бы разбить таблицу на, скажем, 70 кусков, т.е. изменить все записи за 70 транзакций.
Ерунда это и онанизм какой-то.


возвращаемся к параметрам.
1.
Если у вас SQL2000, то там есть блокировка на чтение. (или более старший SQL, но у вас установлен режим совместимости с SQL2000). только тогда имеет смысл заниматься "разбиением на, скажем, 70 кусков"

Если же у вас более новый SQL, то заниматься ерундой не стоит.

2.
Если у вас Recovery Model = Full, то на сколько бы кусков вы ни разбивали, все будет записываться в Transaction log.
Если у вас Recovery Model = Simple, то вы выигрываете только на том, что каждая транзакция сразу очищается И файл транзакций НЕ растет.

3.
вот и приходим к размеру лога.
как вы изящно выразились "при достижении определенного порога все еле ворочается". просто транзакция заполняет весь лог, и СКЛ начинает увеличивать файл лога. на увеличение файла тратит значительное время.

в SQL Management Studio вы можете посмотреть отчет (по-моему, Disk Usage) и ужаснуться сколько времени SQL тратит на увеличение размера.

кроме того, исходя из своего опыта рискну предположить, что у вас таки SQL2005 или выше и параметры для файлов выставлены по-умолчанию. Дело в том, что начиная с SQL2005 файл Transaction Log по умолчанию растет по 1Мб (один мегабайт! - это ужасный параметр по умолчанию)

===============
следовательно, перестаньте заниматься фигней.
700тыс записей - смешной объем как для Аксапты, так и для СКЛ.

посмотрите в параметры СКЛ.
прежде всего увеличьте минимальный размер Transaction Log до вменяемого значения (поставьте гиг 5)
обязательно установите вменяемый размер прироста в фиксированных единицах (например, по 200-300Мб). Ни в коем случае не оставляйте по 1Мб. Так вы сократите фрагментацию как диска, так и внутреннюю SQL. Так вы минимизируете накладные расходы времени на рост Transaction Log.

И не парьтесь "кусками".
Сделайте или в одной нормальной транзакции. Или сделайте транзакцию на каждую запись.
Разница только логическая - если прервете обработку, то либо отменятся все изменения, либо останется то, что сделано.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Hyper (1), sukhanchik (2), Poleax (1).