powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование данных в таблицу SQL2000
14 сообщений из 14, страница 1 из 1
Копирование данных в таблицу SQL2000
    #36100197
Korolyov_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как импортировать данные из фоксовских таблиц через интерфейс SQL понятно.
Вопрос во в чем.

Прога написана на Vfp9. Работаю с представлениями таблиц базы SQL 2000.
Есть необходимость записи в одну из таблиц SQL большого числа данных (порядка 400 000)
До сих пор, эта задача решалась посредством обычной команды Append From в представление
таблицы. Скорость передачи ужасно медленная (с учетом того, что обмен сетевой).

Подскажите неразумному как процесс ускорить
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100215
Ffffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100228
Ffffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100417
Korolyov_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понимаю, можно с командной строки воспользоваться утилитой и все в ажуре.
А как быть удаленным станциям, у которых даже клиента нет, они и папки на сервере
по сути не видят? Подключение через ODBC.
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100468
Korolyov_S,
сходите на forum.foxclub.ru в раздел "Решения".
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100500
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korolyov_SЯ так понимаю, можно с командной строки воспользоваться утилитой и все в ажуре.
А как быть удаленным станциям, у которых даже клиента нет, они и папки на сервере
по сути не видят? Подключение через ODBC.

Для добавления команда BULK INSERT делает то же самое что и утилита BCP.
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100645
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По умолчанию, передача данных из Remote View или CursorAdapter в таблицу-источник на сервере происходит по следующей схеме:

1. На сервере открывается транзакция
2. Передается одна измененная (добавленная) строка
3. На сервере закрывается транзакция

Далее этот цикл повторяется для каждой измененной/добавленной записи.

Ну, для MS SQL, в данном случае, обработку транзакций лучше не трогать (хотя и возможно). Он очень плохо работает с "длинными" транзакциями. Лучше оставить транзакции "короткими". В смысле, окружающие небольшое количество модификаций.

А вот что стоит изменить - это количество измененных записей, пересылаемых "за раз" в одном пакете. За это отвечает свойство Remote View с именем BatchUpdateCount. По умолчанию, оно равно 1. Т.е. пересылать за раз одну измененную запись. Но для открытого Remote View его можно изменить следующим образом.

Код: plaintext
=CursorSetProp("BatchUpdateCount", 100 ,"MyRemoutView")

Данная команда заставит пересылать за раз 100 записей в одном пакете. Ставить слишком большое значение не стоит, поскольку могут быть ограничения на размер пакета. Это определяется свойствами используемого драйвера ODBC. Как правило, все драйверы позволяют пересылать 8 КБ за раз (8 тысяч символов). А вот можно ли больше - надо смотреть описание драйвера или ставить эксперименты.

В дизайнере View эту же настройку можно настроить через пункт меню

Query \ Advanced Options \ Number of Records to Batch Update

Это, разумеется, будет медленнее, чем BCP, но почти не требует изменений в проекте.

Хотя, организовывать перекачку 400 тысяч записей на регулярной основе - не очень хорошая идея. Надо бы пересмотреть идеологию работы, чтобы исключить подобные операции.
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100732
Korolyov_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,

с установкой

=CursorSetProp("BatchUpdateCount",100,"MyRemoutView")

уже игрался. Видимых изменений не прочувствовал.
Изменить политику обмена не могу. Данные поступают ежесуточно из другой проги
и должны вкатываться для обработки в мою базу.

Попробую Bulk Insert
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100797
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример реализации выгрузки для КАД,
для примера (просто посмотреть),
медленнее чем bulk insert, но все же
(на определенных объемах скорость сопоставима)
могу дать попробовать решение через длл по просьбе в почту
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
* метод переливает данные из локального курсора в табличку на сервере
lparameters tcCreateTableCmd, ; && можно не передавать, если есть уже табличка
			;
			tcTableName,      ; && имя таблички на сервере
			tcKeyField,		  ; && id в табличке
			tcTableFields,    ; && поля таблицы
			;
			tcCursorName,     ; && курсор на локале
			tcCursorFields,   ; && поля курсора
			tcWhere,          ; && условие отбора записей из курсора
			toObject            && объект, у которого есть курсор и у объекта есть приватная датасессия 

if !empty(tcCreateTableCmd) 
	local lcAddCmd
	if at("#", tcTableName)> 0 
		* удаляем только временные таблицы
		text to lcAddCmd  noshow textmerge pretext  3 
			if object_id('tempdb..<<tcTableName>>') is not null drop table <<tcTableName>>
			
		endtext
	else
		lcAddCmd = ""
	endif
	if this.SqlExec(lcAddCmd + tcCreateTableCmd)<= 0 
		return .f.
	endif
endif

if vartype(toObject)="O" and pemstatus( toObject, "dataSessionId",  5 )
	if set("Datasession")<>toObject.dataSessionId
		set datasession to toObject.dataSessionId
	endif 
endif

local loCad, llSuccess, lcCmd
loCad = this.createCadObject(this,				;
							 tcTableName,		;	&& таблица на сервере
							 tcKeyField,		;	&& ключь-линк в таблице
							 "#ALLFIELDS#",		;   && обновляемые поля в таблице
							 .f.,				;	&& схема - преобразов-е типов
							 "1=0", 			;   && условие в запросе
							 "*", 				;   && поля в строке запроса к таблице сервера
							 "", 				;	&& group by
							 "",			    ;	&& order by
							 "",				;	&& добавчик к SelectCmd
							 "", 				;   && если уж совсем нестандартный запрос
							 "SavedTable")			&& имя алиаза
							 
if 	vartype(loCad)="O" and used("SavedTable")

	tcWhere = iif( empty(tcWhere), ".t.", tcWhere)
	* подготавливаем команду для налива данных в курсорадаптер
	Text to lcCmd NOSHOW TEXTMERGE PRETEXT  15 
		insert into SavedTable (<<tcTableFields>>)
			select <<tcCursorFields>>
				from <<tcCursorName>> with (buffering=.t.)
				where <<tcWhere>>
	EndText
	* добавляем данные из локального курсора в пуской курсорадаптер
	try 
		&lcCmd
		llSuccess = .t.
	catch
		messagebox("Ошибка запроса из курсора !",  16 , "oServer.SaveTable") 
	endtry
	* сохраняем данные на сервер
	return (llSuccess and loCad.SaveCursor())

else

	* не поднялся курсорадаптер
	return .f.

endif						 
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100808
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автори должны вкатываться для обработки в мою базу.

там есть какие-то триггера и условия, которые должны отработать при вставке записей,
т.е. необходимо ли выполнять какие-то проверки при добавлении записей?
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36100954
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Korolyov_S
сообщите почту, я вышлю пример
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36101218
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korolyov_S
с установкой

=CursorSetProp("BatchUpdateCount",100,"MyRemoutView")

уже игрался. Видимых изменений не прочувствовал.
У Вас режим буферизации Remote View какой? Строковый или табличный? Т.е. что возвращает

=CursorGetProp("Buffering", "MyRemoutView")

Если 3 (строковый), то переключитесь на табличный (5). Сброс буфера по команде TableUpdate(.T.)
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36101229
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если необходимо выполнить загрузку данных именно с клиента, то я выполняю эту операцию с помощью сериализации данных в XML, отсылку их на сервер через SQLEXEC как параметр хранимой процедуры сервера и извлечение данных из XML в процедуре с помощью функции OPENXML.
Отсылку делаю пакетами по 5000 - 10000 строк (в зависимости от "ширины таблицы").
Если есть возможность загрузку данных переложить на SQL сервера, то воспользуйтесь ссылками на BCP, которые вам дали, или (для выполнения данной операции регулярно) используйте службу DTS.
С уважением, Алексей
...
Рейтинг: 0 / 0
Копирование данных в таблицу SQL2000
    #36102294
Korolyov_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за сообщения.
Применил Bulk Insert
Время закачки сократилось с 15 минут до 5 секунд
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование данных в таблицу SQL2000
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]