Цитата:
Сообщение от
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.
И не парьтесь "кусками".
Сделайте или в одной нормальной транзакции. Или сделайте транзакцию на каждую запись.
Разница только логическая - если прервете обработку, то либо отменятся все изменения, либо останется то, что сделано.