gifts2017

Сравнение скорости чтения данных в 1SQLite и DBEng32

Опубликовал Владимир (hogik) в раздел Программирование - Практика программирования

Разработки опубликованы на данном сайте по ссылкам:
http://infostart.ru/projects/2127/
http://infostart.ru/projects/1359/
http://infostart.ru/projects/811/
Сразу оговорюсь, что это не является полным тестом данных разработок, а лишь информация к размышлению. Для более полного сравнения скорости работы этих разработок необходимо замерять время выполнения чтения по ключу и запись данных. Проводить тестирование по реальной сети в многопользовательский режим. К сожалению, в текущей версии 1SQLite (1018f) не обеспечена совместимость с DBEng32 и не удаётся оценить скорость их совместной работы.

Примечание от 17.07.08:
Замеры для 1SQLite проводились до исправления проблемы в многопользовательском режиме. Подробнее смотрите сообщения 153, 156, 158, 165 в http://infostart.ru/projects/2127/ Снимок экрана при сбое представлен в конце статьи. Замеры будут проводиться повторно, после устранения проблемы автором 1SQLite.

Примечание от 08.09.08:
Добавлены замеры для 1SQLite (1019) после исправления проблемы в многопользовательском режиме.

Выполнялся последовательный просмотр таблицы (справочника) по индексу с суммированием значений одного поля для группы записей. Суммировались только положительные значения. Тест проводился в виртуальной сети на базе “MS Virtual PC 2007” (x64, без SP1), связь через “MS Loopback Adapter” (TCP/IP). Запускались две сессии 1С, каждая в отдельной виртуальной машине. База данных и сервер БД располагались на реальной машине. В одной сессии выполнялся тест, в другой сессии “пользователь” бездействовал. Время указано в секундах. В каждом замере запрос/цикл выполнялся по три раза. Перед каждым замером производилась перезагрузка операционной системы.

Длина ключа: 14 байт для замеров 1,2,3,6,7 и 9 байт для замеров 4,5,8.
Размер файла DBF: 620 мегабайт.
Записей в таблице: 1963065.
Записей отобрано: 510426.

1) Родной движок 1С (штатный язык программирования).
Без транзакции
Время выполнения цикла: 2699
Время выполнения цикла: 2696
Время выполнения цикла: 2698
В транзакции
Время выполнения цикла: 296
Время выполнения цикла: 298
Время выполнения цикла: 293

2) Advantage (без изменения конфигурации).
Время выполнения цикла: 694
Время выполнения цикла: 671
Время выполнения цикла: 683

3) Advantage (добавлено ДВА оператора перед циклом).
Время выполнения цикла: 64
Время выполнения цикла: 67
Время выполнения цикла: 64

4) Advantage (навигационный способ обработки информации).
Время выполнения цикла: 67
Время выполнения цикла: 60
Время выполнения цикла: 61

5) 1SQLite (прямой запрос, родные DBF).
1018f
Время выполнения запроса: 181
Время выполнения запроса: 182
Время выполнения запроса: 182
1019 (NeedTransaction=0)
Время выполнения запроса: 2513
Время выполнения запроса: 2517
Время выполнения запроса: 2516
1019 (NeedTransaction=1)
Время выполнения запроса: 161
Время выполнения запроса: 160
Время выполнения запроса: 160

6) CodeBase (без изменения конфигурации).
Время выполнения цикла: 786
Время выполнения цикла: 711
Время выполнения цикла: 698

7) CodeBase (добавлен ОДИН оператор перед циклом).
Время выполнения цикла: 211
Время выполнения цикла: 212
Время выполнения цикла: 204

8) CodeBase (навигационный способ обработки информации).
Время выполнения цикла: 170
Время выполнения цикла: 171
Время выполнения цикла: 170

Структура справочника:

#==TABLE no 62 : Справочник хДвижение2007
# Name |Descr |Type[A/S/U]|DBTableName|ReUsable
T=SC9998 |Справочник хДвижение2007 |A |SC9998 |1
#-----Fields-------
# Name |Descr |Type|Length|Precision
F=ID |ID object |C |9 |0
F=DESCR |object description |C |14 |0
F=ISMARK |Flag Object is Marke|C |1 |0
F=VERSTAMP |Version stamp |C |6 |0
F=SP10010 |(P)Количество |N |20 |5
.....................................................
.....................................................
#----Indexes------
# Name |Descr |Unique|Indexed fields |DBName
I=IDD |of ID |0 |ID |IDD
I=DESCR |of DESCR |0 |DESCR(UPPER) |DESCR
.....................................................
.....................................................

Тексты программ:
//--------------------------------------
ЗагрузитьВнешнююКомпоненту("AddInExt.dll");
Ext=СоздатьОбъект("AddIn.AddInExt");
//--------------------------------------
Процедура Выполнить()                   // Замер 1,2,6 
	Перем Рег,Кол,Тим;
	Рег=СоздатьОбъект("Справочник.хДвижение2007");
	Кол=0;
	Тим=_GetPerformanceCounter();
	Рег.ПорядокНаименований();
	Рег.ВыбратьЭлементы();
	Пока Рег.ПолучитьЭлемент()>0 Цикл
		Если Рег.Количество>0 Тогда
			Кол=Кол+Рег.Количество;
		КонецЕсли;	
	КонецЦикла;
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 3 
	Перем Рег,Кол,Тим,Имя;
	Рег=СоздатьОбъект("Справочник.хДвижение2007");
	Имя="СправочникхДвижение2007";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Рег.ПорядокНаименований();
	Рег.ВыбратьЭлементы();
	Ext._(60,Имя,"val({Количество})>0");
	Ext._(61,Имя,10);
	Пока Рег.ПолучитьЭлемент()>0 Цикл
		Если Рег.Количество>0 Тогда
			Кол=Кол+Рег.Количество;
		КонецЕсли;	
	КонецЦикла;
	Ext._(61,Имя,0);
	Ext._(60,Имя);
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 4
	Перем Рег,Инд,Зап,Дат,Кол,Тим;
	Рег="СправочникхДвижение2007";
	Инд="IDD";
	Дат=" 2XUFQ   ";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Ext._(60,Рег,"val({Количество})>0");
	Ext._(61,Рег,10);
	Зап=Ext._(41,Рег,Инд,Дат);
	Пока Число(Зап)>0 Цикл
		Кол=Кол+Число(Ext._(43,Рег,"Количество"));
		Зап=Ext._(42,Рег,Инд,Зап,1);	
	КонецЦикла;
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
	Ext._(61,Рег,0);
	Ext._(60,Рег);
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 5 
	Попытка
		база = СоздатьОбъект("SQLiteBase");
	Исключение
		ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
		база = СоздатьОбъект("SQLiteBase");
	КонецПопытки;
	база.Открыть(":memory:");
	запрос = база.НовыйЗапрос();
	запрос.ВыполнитьЗапрос("create virtual table хДвижение using dbeng(Справочник.хДвижение2007)");
	т1 = _GetPerformanceCounter();
	тз = запрос.ВыполнитьЗапрос("
	|select
	|	sum(Количество) Колич
	|from
	|	хДвижение
	|where
	|	ID > "" 2XUFQ   "" and Количество > 0 
	|");
	т2 = _GetPerformanceCounter();
	Сообщить("Время выполнения запроса: " + (т2 - т1));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 7 
	Перем Рег,Кол,Тим,Имя;
	Рег=СоздатьОбъект("Справочник.хДвижение2007");
	Имя="СправочникхДвижение2007";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Рег.ПорядокНаименований();
	Рег.ВыбратьЭлементы();
	Ext._(61,Имя,10);
	Пока Рег.ПолучитьЭлемент()>0 Цикл
		Если Рег.Количество>0 Тогда
			Кол=Кол+Рег.Количество;
		КонецЕсли;	
	КонецЦикла;
	Ext._(61,Имя,0);
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------
Процедура Выполнить()                   // Замер 8
	Перем Рег,Инд,Зап,Дат,Кол,Тим;
	Рег="СправочникхДвижение2007";
	Инд="IDD";
	Дат=" 2XUFQ   ";
	Кол=0;
	Тим=_GetPerformanceCounter();
	Ext._(61,Рег,10);
	Зап=Ext._(41,Рег,Инд,Дат);
	Пока Число(Зап)>0 Цикл
		Кол=Кол+Число(Ext._(43,Рег,"Количество"));
		Зап=Ext._(42,Рег,Инд,Зап,1);	
	КонецЦикла;
	Сообщить("Время выполнения цикла: "+Строка(_GetPerformanceCounter()-Тим));
КонецПроцедуры
//--------------------------------------

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сhe Burashka (CheBurator) 10.07.08 01:09
2. Владимир (hogik) 10.07.08 01:31
(1)(Сhe Burashka)
“...спилберг...”
А это означает “плюс” или “минус”? ;-)))))))
3. Сhe Burashka (CheBurator) 10.07.08 02:01
...непанятна...
а выложить сами тексты тестов...?
4. Владимир (hogik) 10.07.08 03:03
(3)
“а выложить сами тексты тестов...?”
Положил. Примерно так это выглядит.
5. Аркадий Кучер (Abadonna) 10.07.08 04:59
#==TABLE no 62 : Справочник хДвижение2007
# Name |Descr |Type[A/S/U]|DBTableName|ReUsable
Нет, чтобы мои плагином открыть, там по "человечьи" рисует :)
Справочник Аналоги, SQL-таблица: SC552

Поле |Описание |Tип |Длина |Точность
____________________________________________________________­____
ROW_ID |Row ID |I |0 |0
ID |ID object |C |9 |0
CODE |object code |C |8 |0
DESCR |object description |C |100 |0
PARENTEXT |Parent in other tabl|C |9 |0
ISMARK |Object is Marked for|L |0 |0
VERSTAMP |Version stamp |I |0 |0
SP553 |(P)Каталог |C |9 |0
SP554 |(P)ИдентификаторВКат|C |40 |0
6. Георгий (Lesovik) 10.07.08 10:57
7. Владимир (hogik) 10.07.08 13:37
(5)
“Нет, чтобы мои плагином открыть”
Это дело вкуса. ;-)
Неужели больше замечаний нет? :-(
8. Аркадий Кучер (Abadonna) 10.07.08 14:39
>Неужели больше замечаний нет?
Замечание только одно: dbf - это что??? :)))
Разве ж можно живую 1С и dbf-ом? :)))
У меня даже на отладке и то скуль стоит, я такой матершины как dbf и помнить не желаю
9. Владимир (hogik) 10.07.08 14:47
(8)
“Разве ж можно живую 1С и dbf-ом?”
И я об том же. ;-)
В “DBEng32+Advantage” не CDX/DBF, а ADI/ADT.
10. Евгений Мартыненков (JohnyDeath) 10.07.08 14:53
(8) Многие и на ДБФ нормально работают!
Ты ж, Аркадий, сам постоянно говоришь про провинции, уровни тамошних з/п и т.д. Теперь прикинь во сколько конторе обойдётся поставить 1С на SQL (ес-но, чтоб всё лицензионное было).
11. Аркадий Кучер (Abadonna) 10.07.08 15:01
(10) Вот тут ты ошибаешься! На ЗП экономят, но, к примеру, если бы зашел в нашей конторе только в туалет и посмотрел, что там - и москвичи могут позавидовать... А как тебе три канала оптики по 2 мегабита с безлимитным инетом? А телефон у КАЖДОГО сотрудника, причем беспроводной? И т.д. и т.п. :)))
12. Евгений Мартыненков (JohnyDeath) 10.07.08 15:21
(11) с сортиром у нас тоже всё нормально ;))))))) (может эта такая мода у провинциальных директоров?)
Но если б ты посмотрел на наш "сервер" ты б ах-ел! Я уж не говорю о том, как они относятся к тому, чтобы купить КАКОЙ-ТО там SQL, а потом к нему ещё и лицензии покупать (тоже непонятно какие и зачем). Вот такая вот хреновина у нас за МКАДом ;)
13. Аркадий Кучер (Abadonna) 10.07.08 15:29
(12) >на наш "сервер"
Гы, у нас серверов штук 8 или 10.... Кстати, классную МФУ на днях взяли, включает в себя кроме прочего факсимильный аппарат с лазерной печатью и даже с распознаванием, если надо. Приятный девайсик
14. Владимир (hogik) 10.07.08 15:29
(12)
“Вот такая вот хреновина у нас за МКАДом”
И у нас…:-(((
15. Silgis (silgis) 10.07.08 17:29
Тут подсчитали, чтобы перевести свою базу на SQL на 50 пользователей необходимо выложить почти 500000 (полмиллиона) рублеков(покупка SQL сервера+Windows Server+лицензии+выделенный сервер), начальство ужаснулась, и сказали тащите свою базу в 4 Гига на DBF, приходится резать.
16. Владимир (hogik) 10.07.08 20:27
Добавлены замеры для DBEng32 (CodeBase 6.5).
17. Владимир (hogik) 11.07.08 02:29
Изменены замеры для DBEng32 (CodeBase 6.5) в новой (5.1.2.9) версии.
18. kiruha Дронов (kiruha) 19.08.08 02:50
Для чистоты эксперимента тогда уж прошу проверить замеры и для драйвера FoxPro,
особенно учитывая что на нем работают на порядки больше народа , чем на упомянутых движках вместе взятых.
Драйвер брать здесь
http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA -95A3289C5FD4&displaylang=en
Для облегчения проверки
Код
 ЗагрузитьВнешнююКомпоненту("1cpp.dll");
   глОлеДБ = СоздатьОбъект("OLEDBData");
   Рез=глОлеДБ.Соединение(" 
   |Provider=VFPOLEDB.1;
//   |Deleted=Yes; 
   |Null = Yes; 
   |Exclusive = No;
   |SourceType = DBF; 
   |Data Source=" + КаталогИБ() + ";
   |Mode=ReadWrite;
   |Extended Properties="""";
   |User ID="""";
   |Password="""";
   |Mask Password=False;
   |Collating Sequence=MACHINE; 
   |DSN=""""");
   
    запрос = глОлеДБ.СоздатьКоманду(); 
   т1 = _GetPerformanceCounter();
   тз = запрос.ВыполнитьИнструкцию("
   |select
   |   sum($хДвижение.Количество) as Колич
   |from
   |   $Справочник.хДвижение2007 as хДвижение
   |where
   |   хДвижение.ID > ' 2XUFQ   ' and $хДвижение.Количество> 0 
   |");
   т2 = _GetPerformanceCounter();
   Сообщить("Время выполнения запроса: " + (т2 - т1));
Показать полностью


Работет только в разделенном режиме.
Во время первого обращения к таблице за ссесию происходит инициализация.
Наибольшие преимущества в многопользовательском режиме и работа с удаленными данными (на файл сервере)
- т.е. в фактическом "боевом" применении
19. kiruha Дронов (kiruha) 19.08.08 03:00
И кстати - Тесты проверяют только одну сторону - выборку данных с условием попадающим в индекс.
Отдельно надо проводить тесты на GROUP BY, ORDER BY, JOIN,
а также работу с вложенными подзапросами, а также при непопадании условия в индекс.

Как показывают тесты проведенные на форуме 1Cpp в этих операциях, без которых не обходится ни один
реальный запрос - время отличает очень существенно
20. Владимир (hogik) 19.08.08 17:20
(18-19)(kiruha)
1) “тогда уж прошу проверить”
По результатам трех запусков получено время 174, 108, 131 секунд. Но если засекать время не с помощью функции _GetPerformanceCounter(), а по наручным часам то среднее время выполнения запроса, примерно, 30 секунд. Почему так работает данная функция – я не стал разбираться.
2) Если запрос выполнять параллельно с обновлением таблицы из другой сессии, то запрос завершается с ошибкой “…FAILED! ICommandText::Execute(): File is in use by another user.”
3) “И кстати - Тесты проверяют только одну сторону - выборку данных с условием попадающим в индекс.”
Именно такая задача и ставилась при проведении сравнения двух разработок. См. заголовок статьи.
4) “надо проводить тесты на GROUP BY, ORDER BY, JOIN,”
Мне это не надо. Извините…
21. Евгений Мартыненков (JohnyDeath) 21.08.08 17:35
(20) по п.2
Ну тут всё ожидаемо: с помощью Фокса мы подключаемся к базе "из вне", в отличии от 1sqlite и вашей разработки, которые используют родной движок и родное подключение.
Вот и получается: 1С заблокировала таблицу на запись, а мы пытаемся считать данные Фоксом - имеем "File is in use by another user.". По этой же причине фоксом не получится обращаться к таблицам в монопольном режиме.
22. kiruha Дронов (kiruha) 21.08.08 20:26
(20)Извините - я думал Вы в курсе.
Для многопользовательского режима используют патченный драйвер от Ужаса
http://uzhast.fatal.ru/vfpoledb/ (но есть и штатный способ)
Общий FAQ по использованию Fox в ДБФ
http://www.1cpp.ru/forum/YaBB.pl?num=1148038411/25#25
23. kiruha Дронов (kiruha) 21.08.08 20:56
Каков объем оперативки?
(При не навигационном доступе результат запроса размещается в оперативке,
если ее не хватает - дополнительно приходится скидывать данные на диск (для Fox весь результат))
24. Владимир (hogik) 21.08.08 21:51
(22-23)(kiruha)
“Каков объем оперативки?”
Мне этот вопрос не понятен в контексте проводимого тестирования. Проверять я не буду, но не думаю, что для выполнения “select sum($хДвижение.Количество) as Колич from…” требуется большой объем оперативной памяти для размещения результата.
“При не навигационном доступе результат запроса размещается в оперативке…”
Не всегда. ;-))) Огромная к Вам просьба. Не тратьте своё время на объяснение для меня таких вещей. Я начал заниматься CУБД в 1973 году.
“Для многопользовательского режима используют патченный драйвер…”
Интересно. А кроме отключения блокировки в исправленном драйвере, что еще делается для обеспечения непротиворечивости информации при кэшировании на стороне рабочей станции?
“но есть и штатный способ”
Где можно с этим ознакомиться?
25. kiruha Дронов (kiruha) 22.08.08 11:50
(24) И не думал просвещать про оперативку.
Вопрос был из за особенности Fox - промежуточные данные запроса размещать в курсорах,
которые могут в зависимости от объема или размещаться в оперативке или скидываться на диск.

(24) Для непротиворечивости выполняется команда Fox -
SET REFRESH TO 0,-1 которая заставляет игнорировать буфер.

Штатный способ - во время загрузки 1С в ссесии Fox "открывать" таблицы ДБФ .
После этого захват таблиц 1С во время проведения не мешает обращаться к ним Fox-у.
Вообще есть много особенностей - половина раздела прямых запросов форума 1С++ этому посвящена -
вряд ли здесь это интересно...

Что касается практической проверки - народ использует доступ где то с 2005 г. На моей базе - года 1.5 в боевом.
26. Владимир (hogik) 22.08.08 14:27
(25)(kiruha)
“Для непротиворечивости выполняется команда Fox”
Я задавал другой вопрос:
“А кроме отключения блокировки в исправленном драйвере, что еще делается для обеспечения непротиворечивости информации при кэшировании на стороне рабочей станции?”
“вряд ли здесь это интересно...”
Возможно. Я просто продолжаю данную тему после ваших (18-19) сообщений в контексте сравнения скорости выполнения запроса и выяснения причин такого “феномена”. Можно и не продолжать. ;-)))
27. kiruha Дронов (kiruha) 22.08.08 14:56
(26) Что в драйвере исправлено - знает только автор
http://uzhast.fatal.ru/ но по его словам он вырезал только аналог LOCK

"Возможно. Я просто продолжаю данную тему после ваших (18-19) сообщений в контексте сравнения скорости выполнения запроса и выяснения причин такого “феномена"
Ок, если будут вопросы по доступу через Fox - тогда на 1cpp.ru
Феномена никакого нет - цифры вполне нормальные.
В Fox также используют навигационный доступ - и в таких задачах навигац. выигрывает у "реляционного".
28. Владимир (hogik) 22.08.08 16:14
(27)(kiruha)
“Феномена никакого нет - цифры вполне нормальные.”
;-) Цифры это следствие. Я то написал “…и выяснения причин такого “феномена””.
Но, пока, мне не удаётся нормально запустить “патченный драйвер”. Несколько раз запрос успешно выполнился. Потом я стал запускать запрос с параллельным обновлением таблицы. И с какого то момента стало вылетать сообщение:
…FAILED! ICommandText::Execute(): Undefined critical error!
Вернулся на исходный драйвер – работает. Базу данных восстановил – не помогло… :-(
29. kiruha Дронов (kiruha) 22.08.08 17:01
(28)Весьма интересное наблюдение..
Альтернативный способ, в глобальнике :
Код
 Перем глОлеДБ Экспорт;
Процедура ИнициализацияOLEDB()
   ЗагрузитьВнешнююКомпоненту("1cpp.dll");
   глОлеДБ = СоздатьОбъект("OLEDBData");
   Рез=глОлеДБ.Соединение(" 
   |Provider=VFPOLEDB.1;
   |Null = Yes; 
   |Exclusive = No;
   |SourceType = DBF; 
   |Data Source=" + КаталогИБ() + ";
   |Mode=ReadWrite;
   |Extended Properties="""";
   |User ID="""";
   |Password="""";
   |Mask Password=False;
   |Collating Sequence=MACHINE; 
   |DSN=""""");
   
   //********** Настройки *********************//
   //  Так как стоит Exclusive = No скрипт  SET EXCLUSIVE OFF не нужен
   локОлеДБКоманда = глОлеДБ.СоздатьКоманду();
   локОлеДБКоманда.Выполнить("EXECSCRIPT('SET ANSI OFF')");  
   // Устанавливаем время ожидания захвата таблиц , если во время выполнения запроса кто то проводит документы
   // Очень полезная функция - аналогична времени ожидания в 1С
   локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
   // Убираем буфепизацию, чтобы данные возвращаемые запросам всегда были актуальны
   локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
   
   
   //********** Открытия таблиц *********************//
       // открываем одну таблицу
   ИмяТаблицы="$Справочник.хДвижение2007";
   текстЗапроса="SELECT  RecNo() FROM "+ИмяТаблицы+" as Спр WHERE  Спр.id='1'"; 
   локОлеДБКоманда.Выполнить(текстЗапроса); 
        // Для проверки сбросим время ожидания в 0
   локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 0 SECONDS')");
   Сообщить("конец инициализации");
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()  Экспорт
//.................
ИнициализацияOLEDB();
КонецПроцедуры
 
Показать полностью

Далее использовать глОлеДБ для создания запросов
30. Владимир (hogik) 23.08.08 00:37
(29)(kiruha)
“Альтернативный способ”
Спасибо. При этом способе работает устойчиво. Ошибку, аналогичную, ошибке при использовании 1SQLite, пока, получить не удалось. Тогда у меня возникает вопрос. Невозможность использования драйвера FoxPro в монопольном режиме это основной недостаток данного средства выполнения прямых запросов к DBFной базе? Может мне имеет смысл заняться написанием очередного варианта DBEng32 для решения этой проблемы? Это ещё актуально?
31. kiruha Дронов (kiruha) 23.08.08 01:22
(30) Это недостаток и актуальный. Fox не использует 1С для доступа к файлам - поэтому не представляю,
как это можно решить - блокировка идет на уровне ОС.

Если удалось бы решить эту проблему - это было бы здорово :) Но народ считает что это невозможно (.
32. kiruha Дронов (kiruha) 23.08.08 01:40
Также должен заметить, что более перспективно использование не OLEDB , а напрямую библиотек Fox
- это позволяет использовать дополнительные возможности библиотек Fox (например отладка, использование
команд без создания хранимых процедур, реализация сервера) - но это тоже пока мечты.
33. Владимир (hogik) 23.08.08 02:45
(31-32)(kiruha)
“поэтому не представляю, как это можно решить”
Я пока не вижу проблем сделать это. Пожалуй, начну делать…
“Если удалось бы решить эту проблему - это было бы здорово”
Мне казалось, что DBFная версия – уже не очень актуальна.
“более перспективно использование не OLEDB , а напрямую библиотек Fox”
Не совсем понимаю. Я использую FoxPro 6.0 из 1С. А в 9-ой версии с этим проблемы?
“реализация сервера”
Совсем не понимаю. Можно поподробней?
34. noprogrammer (noprogrammer) 23.08.08 08:57
33 (hogik)
>> Я пока не вижу проблем сделать это. Пожалуй, начну делать…
Даже за саму попытку это сделать - уже спасибо.

>> Мне казалось, что DBFная версия – уже не очень актуальна.
Боюсь что тут вы сильно ошибаетесь...
35. kiruha Дронов (kiruha) 23.08.08 12:28
(33) "Мне казалось, что DBFная версия – уже не очень актуальна."
Вообще мои замеры показывают, что Fox+1C обгоняет для средних баз и SQL и файловую 8.0.
Причем даже непонятно в перспективе - за счет чего файловая восьмерка сможет существенно обогнать Fox.
В него, мне кажется, труда разработчиков вложено несколько больше.

"Не совсем понимаю. Я использую FoxPro 6.0 из 1С. А в 9-ой версии с этим проблемы?"
Проблема в эффективной передаче массивов(точнее из курсора Fox в Таблицу значений ) - пока
вижу только либо через свойства в цикле, либо через временные файлы ДБФ.
В документации к Fox же написано что возможно из сред С++ напрямую получать массивы из Fox (видимо по адресу в памяти)
Хотелось бы того же в 1С
Ну и выходная типизация к типам 1С - как это сделано для OLEDB или SQLLite.

"<реализация сервера>
Совсем не понимаю. Можно поподробней?"
Fox позволяет достаточно просто делать сервера.
Элементарный пример (для тестов) http://www.1cpp.ru/forum/YaBB.pl?num=1216110955/6#6
И ниже в ветке описание. DCOM , но видимо лучше COM+
36. Владимир (hogik) 23.08.08 15:40
(34)(kiruha)
“Даже за саму попытку это сделать -”
Уже начал делать. Думаю, к концу следующей недели будет или не будет результат. Но если у меня не получится это сделать простым способом, то всегда остаётся возможность посадить 1С на FoxPro в части движка БД. Но это сложней и дольше делать. Поэтому и пытаюсь разобраться в том, что я написал в следующем абзаце. Т.е. хочу найти в этом большой смысл. ;-)))
(35)(kiruha)
“Fox позволяет достаточно просто делать сервера.”
Это и все что написано вокруг этой фразы мне известно и понятно. Думаю, мне не понятно – а зачем “через” такие способы делается “нечто”. Я когда читаю вот такие фразы “…передаче массивов(точнее из курсора…” у меня крыша едет. Типа, причем тут одно к другому? Суть задач в чем? Не в смысле “напрямую получать массивы из Fox”, а в смысле 1С+FoxPro в целом?
37. Владимир (hogik) 23.08.08 19:29
+(36)
Сделал возможность выполнения прямых запросов в монопольном режиме.
http://infostart.ru/profile/2905/projects/2418/
38. kiruha Дронов (kiruha) 24.08.08 00:59
(36) "Думаю, мне не понятно – а зачем “через” такие способы делается “нечто”"
База хранится на файл-сервере.
Задача - ускорить выполнение запросов.
При использовании OLEDB Fox тащит часть содержимого таблиц DBF и CDX на клиента, если попали в индекс.
Если нет подходящего индекса - тащится вся таблица(за исключением ненужных столбцов).
Бывают варианты, когда нужно всего несколько строк.
Например это условие по реквизиту спр. без признака "отбор".
В таких случаях выгоднее выполнить запрос на файл сервере.
Также на файл сервере могут стоять более мощные процессоры чем на клиенте.
Остается проблема передачи результата запроса клиенту - пользователю 1С.
Текущие варианты (через строки, через временные файлы) недостаточно эффективны и
могут свести на нет преимущества использования сервера.

Прошу прощения если слишком подробно )



39. Владимир (hogik) 24.08.08 01:47
(38)(kiruha)
“Прошу прощения если слишком подробно”
Это Вы меня извините, что отнимаю Ваше время своими вопросами. Но задам еще вопросы.
1) Почему не используете нормальный сервер БД?
2) В FoxPro9 снято ограничение на размер таблицы в 1(2) гигабайта.
3) С помощью ОлеДБКоманда.Выполнить("EXECSCRIPT('…')") можно выполнять навигационные команды?
40. kiruha Дронов (kiruha) 24.08.08 02:27
(39)
п1. Пока ДБФ почти полностью устраивает пользователей.
Время запросов до 3 сек (файлы до 50Мб пока), средниее время и того меньше.
Также из за этого нет причин по которым могу обосновать затраты на сервер.

п2 Вроде ограничение в 2Гб не менялось

п3 Можно. Но вызов EXECSCRIPT фактически требует каждый раз новой компиляции, которая занимет существенное
время при массовом использовании. Для навигации лучше использовать хранимые процедуры - по одной на каждую операцию.
41. Владимир (hogik) 24.08.08 03:17
(40)(kiruha)
“файлы до 50Мб пока”
;-) Иногда количественные характеристики лучше проясняют вопрос (тему), чем качественные. По этой теме у меня больше нет вопросов. Мы, то, напоролись на ограничение в 1 гигабайт на первом году эксплуатации, ещё в 2001 году. И ход моих мыслей стал совсем другой. ;-) Закрываем эту тему.
42. Alexander Nick (nickkey) 05.10.11 10:28
Как показывают тесты и практика народа проведенные на форуме 1Cpp с этими операциями, без которых не обходится ни один реальный запрос - время отличается очень и очень существенно так что лишено не лишено смысла решать вам а вообще хороший пост заставляет хорошенько подумать :)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа