![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка объемных данных в рамках одной транзакции [D7, MSSQL]
MsGuns © (2006-07-14 16:18:00)Требуется сделать следующее:
1. Создать в БД таблицу, если ее нет, или очистить от записей, если есть
2. Создать ХП вставки в таблицу
3. С помощью этой ХП из текстового файла загрузить в таблицу данные (порядок - от сотни тысяч до миллионов)
4. ХП удалить из БД
5. Транзакцию подтвердить.
6. В случае ошибки создания (очистки) таблицы или создания ХП транзакцию откатить, оставив таблицу в прежнем состоянии
Сейчас получается все, кроме отката, поэтому даже в случае прерывания процесса, в БД остается и ХП, и новые данные в таблице.
Посоветуйте что-нибудь в этом направлении. В BOL, к сожалению, не описаны подобные ситуации или я их не нашел, хотя искал две недели.
Спасибо за подсказки и советы
ЗЫ. MS SQL Server 8 + ADO (OLE DB)
MsGuns (2006-07-18 14:02:00) [21]>Fay © (18.07.06 13:53) [27]
>Какая скорость (Hz) при insert-ах с параметрами?
Причем тут герцы ?
Сервера находятся на разных ПК, начиная от 500 и заканчивая двухпроцессорной системой. Базы тоже разные, сетки тоже (есть шустрые, а есть 10мегабитные). Сравнивали, ессно, на одной и той же процедуре.
Самый здоровый файл (больше лимона записей) загружался инсертами более 3 часов (при этом инсерты были параметрические и без - разница была несущественная.
Когда задействовали ХП, состоящую всего лишь из одного инсерта, время загрузки сократилось до получаса.
Это на быстрой сети, но с "медленным" сервером.
Пропорции, однако, сохраняются при загрузке на другие сервера. при этом общая нагрузка на сервер практически не влияла.
Да, и еще.. Сервера еще и разных версий. Есть парочка 7-х
Stanislav (2006-07-18 13:58:00) [22]При записи простым "клиентским" INSERT INTO 1,150 000 записей занимает часы, через ХП - 20 мин. Проверенот неоднократно
Даже если клиент запущен на сервере?
Stanislav (2006-07-18 13:55:00) [23]Сделать Job, который должен запустится через 3 часа и удалить все что ненужно. :-)
Fay (2006-07-18 13:53:00) [24]2 MsGuns © (18.07.06 13:45) [25]
Какая скорость (Hz) при insert-ах с параметрами?
Fay (2006-07-18 13:52:00) [25]2 MsGuns © (18.07.06 13:45) [25]
> При записи Insert`ми делали и с параметрами, и без - разница почти никакая
Это очень странно. С другой стороны, у MSSQL странностей хватает.
MsGuns (2006-07-18 13:45:00) [26]>Медведъ (18.07.06 09:30) [18]
>упаковываем на клиенте записи в xml пакет, передаем его в процедуру в которой открываем транзакцию и insert into from openxml
К сожалению, не знаком с этой технологией.
>evvcom © (18.07.06 10:24) [20]
>Fay © (18.07.06 11:19) [22]
>Без примера это просто слова. Проверенот неоднократно
Ну как я дам пример ? Есть БД на ЕС ЭВМ. Периодически надо из нее перетаскивать целостные фрагменты (по задачам АСУП) в MS SQL Server. При этом серверов несколько, а баз вообще десятки.
Таблицы сначала выгружаются из файлов ЕС БД в тескстовые файлы, затем конвертором заливаются на PC, после чего их надо записать в указанную конечным пользователем БД на указанном сервере. Выгрузка и конвертор написаны во времена царя Гороха - текстовые файлы без разделителей и с кучей ошибок - поэтому пакетная текстовая заливка (bcp) не "катит" (надо по спец.разработанным дескрипторам записи-строки "подправлять" до корректного формата данных.
Необходимость создания и убивания ХП обусловлена тем, что SQL БД множество и они могут плодиться как грибы - в каждую ХП не занесешь, тем более, что они разные по составу таблиц.
При записи Insert`ми делали и с параметрами, и без - разница почти никакая, эффект был получен лишь с заменой инсертов на ХП. Все поля в таблицах символьные - ключей, индексов и других ограничений нет. В SQL лишь добавлено одно поле во все таблицы - автоинкремент, который и является PK.
Fay (2006-07-18 13:38:00) [27]2 Медведъ (18.07.06 9:30) [18]
> упаковываем на клиенте записи в xml пакет
Приходилось ли самому мег по 100 так отправлять ?
tupoy (2006-07-18 12:26:00) [28]MsGuns © (18.07.06 09:20) [17]
перечитал ветку, но не увидел, чем Вас не устраивает bcp, ведь он для этих случаев и создан. Тут вам и прямая загрузка из файлов, и настраиваемая длина батчей, и максимально возможная производительность.
Впрочем, я не претендую на "вумность" cоветов, решайте сами.
Fay (2006-07-18 11:19:00) [29]2 MsGuns © (18.07.06 9:20) [17]
> При записи простым "клиентским" INSERT INTO 1,150 000 записей занимает
> часы, через ХП - 20 мин. Проверенот неоднократно
Без примера это просто слова. Проверенот неоднократно
Desdechado (2006-07-18 10:51:00) [30]как я понимаю, используется некий аналог IB-шных external table?
evvcom (2006-07-18 10:24:00) [31]> При записи простым "клиентским" INSERT INTO 1,150 000 записей
> занимает часы, через ХП - 20 мин
А Insert в этом случае с параметрами? Если без, то естественно. ХП и запрос поставлены в неравные условия.
А нафиг вообще грохать ХП? Зачем мешать dml и ddl?
Медведъ (2006-07-18 09:31:00) [32]>MsGuns © (18.07.06 09:20) [17]
а решения вида "В цикле TADOCommand(cmdStoredProc).Execute. Объект "завернут" на Connection" это просто очень плохо, даже хуже чем мой ник, извините
Медведъ (2006-07-18 09:30:00) [33]>MsGuns © (18.07.06 09:20) [17]
упаковываем на клиенте записи в xml пакет, передаем его в процедуру в которой открываем транзакцию и insert into from openxml
MsGuns (2006-07-18 09:20:00) [34]>Val © (14.07.06 17:37) [11]
>Делай явный старт транзакции(без него, судя по всему у тебя каждый инсерт идет в своей транзакции, поэтому и остаются), инсерты, коммит.
1. Connection.BeginTrans
2. В цикле TADOCommand(cmdStoredProc).Execute. Объект "завернут" на Connection
3. Connection.Commit - Все записи остаются в таблице
3. Connection.Rollback - Иногда часть добавленных записей остается
>Fay © (14.07.06 21:32) [12]
>SET IMPLICIT_TRANSACTIONS { ON | OFF }
Делали. Не помогает.
>> Загрузка данных через ХП ускоряет процесс в десятки раз.
>Бред
Бред - это по поводу и без говорить "бред".
При записи простым "клиентским" INSERT INTO 1,150 000 записей занимает часы, через ХП - 20 мин. Проверенот неоднократно
>tupoy (17.07.06 17:14) [13]
>bulk insert
Не тот случай. Еслы внимательно читали ветку - поймете почему
>tupoy (17.07.06 17:18) [14]
>все сделает за Вас. почитайте BOL
Ничего и ничто ни за кого не делает. Если бы можно было воспользоваться этой фичей, то воспользовался бы.
BOL - настольная "книга". Как, впрочем, и MSDN (2006)
Прежде чем давать "вумные" советы, неплохо бы читать всю ветку. Внимательно.
tupoy (2006-07-17 17:40:00) [35]Вы тоже почитайте
Fay (2006-07-17 17:28:00) [36]2 tupoy (17.07.06 17:18) [14]
Индексы тоже уберёт/создаст?
tupoy (2006-07-17 17:18:00) [37]все сделает за Вас. почитайте BOL
tupoy (2006-07-17 17:14:00) [38]bulk insert
Fay (2006-07-14 21:32:00) [39]2 MsGuns © (14.07.06 16:44)
> Посоветуйте что-нибудь в этом направлении
SET IMPLICIT_TRANSACTIONS { ON | OFF }
> Загрузка данных через ХП ускоряет процесс в десятки раз.
Бред
Val (2006-07-14 17:37:00) [40]Погоди, Сергей, причем тут медленный он или быстрый, если выполняешь
вставку в одной транзакции - при обрыве/сбое ничего не должно остаться.
Делай явный старт транзакции(без него, судя по всему у тебя каждый инсерт идет в своей транзакции, поэтому и остаются), инсерты, коммит.