Переключение на Главную Страницу Страницы: 1 2 3 [4] 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Выгрузка из ТЗ во временную таблицу (курсор) (число прочтений - 22524 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #45 - 12. Октября 2007 :: 08:04
Печать  
spock писал(а) 12. Октября 2007 :: 07:58:
А куда эти 20 тыс строк вставляются так реактивно?

Во врем таблицу. Это тест от kiruha
Код
Выбрать все
	ОлеДБКоманда = глОлеДБ.СоздатьКоманду();

	// Создаем курсор с полями ID и  Descr
	ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию("EXECSCRIPT('CREATE CURSOR TmpTable (ID Character(9) ,Descr Character(70)) ')");

	//1. Тест вставки
	ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	ВремяНачалоЗапроса=_GetPerformanceCounter();
	ТекстЗапроса="INSERT INTO TmpTable (ID,Descr )   VALUES (?,?)";
	//Зн_ХХХ = СоздатьОбъект("OLEDBCommand");
	//Зн_ХХХ.
	ОлеДБКоманда.ДобПараметр(1,129,9,0,);
	ОлеДБКоманда.ДобПараметр(1,129,70,0,);
	ОлеДБКоманда.Подготовить(ТекстЗапроса);
	Для ИИ=1 По КоличествоЭлементов Цикл   //
		ID="   12G   ";
		Descr="15-034 MOTOR SUB									";
		ОлеДБКоманда.УстановитьПараметр(1, ID);
		ОлеДБКоманда.УстановитьПараметр(2, Descr);
		ОлеДБКоманда.Выполнить();
	КонеЦЦикла;
    ВремяКонецЗапроса=_GetPerformanceCounter();
	ОлеДБКоманда.ОтменитьПодготовку();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("Запрос вставки OLE DB c параметром "+(ВремяЗапроса/1000)+"с");

	// 2. Тест выборки
	ВремяНачалоЗапроса=_GetPerformanceCounter();
	ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию("SELECT  WW.ID,WW.Descr  from TmpTable as WW  ");
	ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	Сообщить("Запрос выборки длился "+(ВремяЗапроса/1000)+"с");

	//Просмотр ТЗ
	Сообщить("Кол строк "+ТЗ.КоличествоСтрок());
	ТЗ.ВыбратьСтроку();

	//Очищение памяти от временной таблицы
	ОлеДБКоманда.Выполнить("EXECSCRIPT('USE IN TmpTable ')");
 

  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #46 - 12. Октября 2007 :: 08:07
Печать  
А, значит он же, я только чуток подрихтовал этот вариант.
« Последняя редакция: 14. Октября 2007 :: 13:39 - spock »  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #47 - 12. Октября 2007 :: 08:10
Печать  
Так, есть мнение, что нужно переделать УложитьСписокОбъектов() на курсоры.
Вот где был kiruha, когда я бился с получением данных из курсоров?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #48 - 12. Октября 2007 :: 08:28
Печать  
spock писал(а) 12. Октября 2007 :: 08:10:
Так, есть мнение, что нужно переделать УложитьСписокОбъектов() на курсоры.
Вот где был kiruha, когда я бился с получением данных из курсоров?


Честно говоря не думаю, что кто то укладывает очень большие данные
Есть некие проблемы.
1. Не все поправили реестр для правильной работы с параметр. запросами
2. Память от курсора надо освобождать. Я делаю ОлеДБКоманда.Выполнить("EXECSCRIPT('USE IN TmpTable ')");
но если пользователь поменял текущую рабочую область - будет ошибка.
3.Итого - лучше оставить все как есть Улыбка А новые возможности развивать параллельно.

Проверил новую сборку -
- вставка немного улучшилась (30 %),
- выборка на больших объемах ускорилась во много раз,
- глюк с деструктором объекта(очень долгое уничтожение ОлеДБКоманда) пропал.

Думаю на данный момент это достаточно оптимизированный инструмент, по крайне мере для работе с драйвером Fox и дальнейшая оптимизация уже не так актуальна.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #49 - 12. Октября 2007 :: 08:36
Печать  
Цитата:
- выборка на больших объемах ускорилась во много раз,

я тут не причем, если только как-нить косвенно.
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #50 - 12. Октября 2007 :: 08:52
Печать  
spock писал(а) 12. Октября 2007 :: 08:36:
Цитата:
- выборка на больших объемах ускорилась во много раз,

я тут не причем, если только как-нить косвенно.


Да, наверно в замер попадало время уничтожения объекта.(я по наивности сначала думал, что 0 Улыбка )
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #51 - 12. Октября 2007 :: 08:59
Печать  
kiruha писал(а) 12. Октября 2007 :: 08:52:
spock писал(а) 12. Октября 2007 :: 08:36:
Цитата:
- выборка на больших объемах ускорилась во много раз,

я тут не причем, если только как-нить косвенно.


Да, наверно в замер попадало время уничтожения объекта.(я по наивности сначала думал, что 0 Улыбка )

нет я же не менял свой тест только разные 1cpp.dll  подключал
все для OLE DB
время выборки  было
Запрос выборки длился 0.966с
Кол строк 20000

стало с новой dll
Запрос выборки длился 0.129с
Кол строк 20000
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #52 - 12. Октября 2007 :: 09:06
Печать  
Z1 писал(а) 12. Октября 2007 :: 08:59:
kiruha писал(а) 12. Октября 2007 :: 08:52:
spock писал(а) 12. Октября 2007 :: 08:36:
Цитата:
- выборка на больших объемах ускорилась во много раз,

я тут не причем, если только как-нить косвенно.


Да, наверно в замер попадало время уничтожения объекта.(я по наивности сначала думал, что 0 Улыбка )

нет я же не менял свой тест только разные 1cpp.dll  подключал
все для OLE DB
время выборки  было
Запрос выборки длился 0.966с
Кол строк 20000

стало с новой dll
Запрос выборки длился 0.129с
Кол строк 20000


В тест выборки для чистоты нужно
ОлеДБКоманда2 = глОлеДБ.СоздатьКоманду();
и работать  с ней. Просто в старом варианте похоже была утечка памяти.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #53 - 12. Октября 2007 :: 09:23
Печать  
kiruha писал(а) 12. Октября 2007 :: 09:06:
Z1 писал(а) 12. Октября 2007 :: 08:59:
kiruha писал(а) 12. Октября 2007 :: 08:52:
spock писал(а) 12. Октября 2007 :: 08:36:
Цитата:
- выборка на больших объемах ускорилась во много раз,

я тут не причем, если только как-нить косвенно.


Да, наверно в замер попадало время уничтожения объекта.(я по наивности сначала думал, что 0 Улыбка )

нет я же не менял свой тест только разные 1cpp.dll  подключал
все для OLE DB
время выборки  было
Запрос выборки длился 0.966с
Кол строк 20000

стало с новой dll
Запрос выборки длился 0.129с
Кол строк 20000


В тест выборки для чистоты нужно
ОлеДБКоманда2 = глОлеДБ.СоздатьКоманду();
и работать  с ней. Просто в старом варианте похоже была утечка памяти.


Да с ОлеДБКоманда2 = глОлеДБ.СоздатьКоманду();  время выборки одинаковое для старой и новой dll
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #54 - 20. Октября 2007 :: 19:13
Печать  
spock, а твои изменения для подготовленных запросов уже в репе есть? А то у меня в прототипе динамического провайдера вот эти запросы занимают больше 80% времени:
Код
Выбрать все
EXECSCRIPT ('SKIP 1')
EXECSCRIPT ('return EOF () OR BOF ()')
EXECSCRIPT ('return id')
 


В результате провайдер жутко тормозит.

Хм. Интересно, а на "Execscript" "подготовка" запроса как-нибудь повлияет? Подготовка вроде должна оптимизировать выполнение инструкции "EXECSCRIPT", а не скрипта, который надо выполнить. Ох, чует мое сердце, придется делать prg-файлы... Они-то точно компилируются. Во всяком случае для каждого prg-файла возникает некий fxp-файл.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #55 - 20. Октября 2007 :: 22:38
Печать  
Uzhast писал(а) 20. Октября 2007 :: 19:13:
spock, а твои изменения для подготовленных запросов уже в репе есть? А то у меня в прототипе динамического провайдера вот эти запросы занимают больше 80% времени:
Код
Выбрать все
EXECSCRIPT ('SKIP 1')
EXECSCRIPT ('return EOF () OR BOF ()')
EXECSCRIPT ('return id')
 


В результате провайдер жутко тормозит.

Хм. Интересно, а на "Execscript" "подготовка" запроса как-нибудь повлияет? Подготовка вроде должна оптимизировать выполнение инструкции "EXECSCRIPT", а не скрипта, который надо выполнить. Ох, чует мое сердце, придется делать prg-файлы... Они-то точно компилируются. Во всяком случае для каждого prg-файла возникает некий fxp-файл.


Execscript весьма тормознутая вещь, но на больших запросах это незаметно. По идее в доке фокса написано, что многие команды доступны в OLEDB, т.е.  должны выполняться без EXECSCRIPT - я грешил на реализацию. Пока обычный XBase существенно быстрее для операций последовательного перебора.

Подготовка в принципе не должна влиять , т.к. передается указание выполнить скрипт а не запрос.
И по тестам нет разницы.

prg имеют особенность - их результат кэшируется - т.е. если их изменить динамически -
то Fox изменений в текущей ссесии не заметит. Даже если полностью удалить файл.
Т.е. они должны быть статичными.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #56 - 20. Октября 2007 :: 22:46
Печать  
kiruha писал(а) 20. Октября 2007 :: 22:38:
prg имеют особенность - их результат кэшируется - т.е. если их изменить динамически -
то Fox изменений в текущей ссесии не заметит. Даже если полностью удалить файл.
Т.е. они должны быть статичными.

А это пофиг (хотя ты удалял только prg-файл? там ведь еще fxp создается). Если создавать prg-файл с именем "здоровенныйГУИД.prg", то никаких проблем не будет. При удалении провайдера, естественно, prg можно убивать. В общем, если не получится ускорить получение ИДшников через OLE DB, придется идти по пути prg-файлов.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #57 - 20. Октября 2007 :: 23:00
Печать  
Uzhast писал(а) 20. Октября 2007 :: 22:46:
kiruha писал(а) 20. Октября 2007 :: 22:38:
prg имеют особенность - их результат кэшируется - т.е. если их изменить динамически -
то Fox изменений в текущей ссесии не заметит. Даже если полностью удалить файл.
Т.е. они должны быть статичными.

А это пофиг (хотя ты удалял только prg-файл? там ведь еще fxp создается). Если создавать prg-файл с именем "здоровенныйГУИД.prg", то никаких проблем не будет. При удалении провайдера, естественно, prg можно убивать. В общем, если не получится ускорить получение ИДшников через OLE DB, придется идти по пути prg-файлов.


А может возможно обойтись без ExecScript?
Там есть раздел Цитата:
Команды и Функции Visual FoxPro, Поддерживаемые OLE DB Провайдерами

правда с пометкой
Цитата:
Команды и Функции для Хранимых Процедур, Правил, Триггеров и Вычислений Значений по Умолчанию

Хотя в принципе идея prg файлов вполне нормальная.

P/S А если SqlLite взлетит - вся работа насмарку?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #58 - 20. Октября 2007 :: 23:08
Печать  
kiruha писал(а) 20. Октября 2007 :: 23:00:
А может возможно обойтись без ExecScript?

А чем ты предлагаешь заменить, например, "return id"?

kiruha писал(а) 20. Октября 2007 :: 23:00:
P/S А если SqlLite взлетит - вся работа насмарку?

Смотря как взлетит. Если будет работать не медленнее Фокса и возможности по построению SQL-запросов иметь не худшие, то только тогда можно считать взлетевшим.

Ну а если взлетит, провайдер переделать под другую систему выполнения запросов не сложно. Провайдер - вещь вообще не очень сложная.

Кстати, по любому идея с выборкой ИДшников останется лучшей для поставщика данных ТП. Для СКЛ-сервера при выполнении частичных выборок лучшим вариантом считается вариант с открытием курсора. А методы XBase - это и есть аналог курсора.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Выгрузка из ТЗ во временную таблицу (курсор)
Ответ #59 - 20. Октября 2007 :: 23:11
Печать  
Ну и по принципу "избегания однокорзинного яйцеоткладывания" провайдер с XBase-методами для OLE DB все равно не повредит, ибо позволит присобачиваться к другим СУБД, а не только к 1С Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 
ОтправитьПечать