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

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

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

Для добавления команда BULK INSERT делает то же самое что и утилита BCP.
...
Рейтинг: 0 / 0
21.07.2009, 13:13
    #36100645
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование данных в таблицу SQL2000
По умолчанию, передача данных из 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
21.07.2009, 13:38
    #36100732
Korolyov_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование данных в таблицу SQL2000
ВладимирМ,

с установкой

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

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

Попробую Bulk Insert
...
Рейтинг: 0 / 0
21.07.2009, 13:57
    #36100797
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование данных в таблицу SQL2000
пример реализации выгрузки для КАД,
для примера (просто посмотреть),
медленнее чем 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
21.07.2009, 13:59
    #36100808
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование данных в таблицу SQL2000
автори должны вкатываться для обработки в мою базу.

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

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

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

=CursorGetProp("Buffering", "MyRemoutView")

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


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