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

Программирование - Практика программирования

Разработки опубликованы на данном сайте по ссылкам:
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 в //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) 418 10.07.08 01:31 Сейчас в теме
(1)(Сhe Burashka)
“...спилберг...”
А это означает “плюс” или “минус”? ;-)))))))
3. Сhe Burashka (CheBurator) 10.07.08 02:01 Сейчас в теме
...непанятна...
а выложить сами тексты тестов...?
4. Владимир (hogik) 418 10.07.08 03:03 Сейчас в теме
(3)
“а выложить сами тексты тестов...?”
Положил. Примерно так это выглядит.
5. Аркадий Кучер (Abadonna) 3675 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) 418 10.07.08 13:37 Сейчас в теме
(5)
“Нет, чтобы мои плагином открыть”
Это дело вкуса. ;-)
Неужели больше замечаний нет? :-(
8. Аркадий Кучер (Abadonna) 3675 10.07.08 14:39 Сейчас в теме
>Неужели больше замечаний нет?
Замечание только одно: dbf - это что??? :)))
Разве ж можно живую 1С и dbf-ом? :)))
У меня даже на отладке и то скуль стоит, я такой матершины как dbf и помнить не желаю
9. Владимир (hogik) 418 10.07.08 14:47 Сейчас в теме
(8)
“Разве ж можно живую 1С и dbf-ом?”
И я об том же. ;-)
В “DBEng32+Advantage” не CDX/DBF, а ADI/ADT.
10. Евгений Мартыненков (JohnyDeath) 290 10.07.08 14:53 Сейчас в теме
(8) Многие и на ДБФ нормально работают!
Ты ж, Аркадий, сам постоянно говоришь про провинции, уровни тамошних з/п и т.д. Теперь прикинь во сколько конторе обойдётся поставить 1С на SQL (ес-но, чтоб всё лицензионное было).
11. Аркадий Кучер (Abadonna) 3675 10.07.08 15:01 Сейчас в теме
(10) Вот тут ты ошибаешься! На ЗП экономят, но, к примеру, если бы зашел в нашей конторе только в туалет и посмотрел, что там - и москвичи могут позавидовать... А как тебе три канала оптики по 2 мегабита с безлимитным инетом? А телефон у КАЖДОГО сотрудника, причем беспроводной? И т.д. и т.п. :)))
12. Евгений Мартыненков (JohnyDeath) 290 10.07.08 15:21 Сейчас в теме
(11) с сортиром у нас тоже всё нормально ;))))))) (может эта такая мода у провинциальных директоров?)
Но если б ты посмотрел на наш "сервер" ты б ах-ел! Я уж не говорю о том, как они относятся к тому, чтобы купить КАКОЙ-ТО там SQL, а потом к нему ещё и лицензии покупать (тоже непонятно какие и зачем). Вот такая вот хреновина у нас за МКАДом ;)
13. Аркадий Кучер (Abadonna) 3675 10.07.08 15:29 Сейчас в теме
(12) >на наш "сервер"
Гы, у нас серверов штук 8 или 10.... Кстати, классную МФУ на днях взяли, включает в себя кроме прочего факсимильный аппарат с лазерной печатью и даже с распознаванием, если надо. Приятный девайсик
14. Владимир (hogik) 418 10.07.08 15:29 Сейчас в теме
(12)
“Вот такая вот хреновина у нас за МКАДом”
И у нас…:-(((
15. Silgis (silgis) 10.07.08 17:29 Сейчас в теме
Тут подсчитали, чтобы перевести свою базу на SQL на 50 пользователей необходимо выложить почти 500000 (полмиллиона) рублеков(покупка SQL сервера+Windows Server+лицензии+выделенный сервер), начальство ужаснулась, и сказали тащите свою базу в 4 Гига на DBF, приходится резать.
16. Владимир (hogik) 418 10.07.08 20:27 Сейчас в теме
Добавлены замеры для DBEng32 (CodeBase 6.5).
17. Владимир (hogik) 418 11.07.08 02:29 Сейчас в теме
Изменены замеры для DBEng32 (CodeBase 6.5) в новой (5.1.2.9) версии.
18. kiruha Дронов (kiruha) 359 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) 359 19.08.08 03:00 Сейчас в теме
И кстати - Тесты проверяют только одну сторону - выборку данных с условием попадающим в индекс.
Отдельно надо проводить тесты на GROUP BY, ORDER BY, JOIN,
а также работу с вложенными подзапросами, а также при непопадании условия в индекс.

Как показывают тесты проведенные на форуме 1Cpp в этих операциях, без которых не обходится ни один
реальный запрос - время отличает очень существенно
20. Владимир (hogik) 418 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) 290 21.08.08 17:35 Сейчас в теме
(20) по п.2
Ну тут всё ожидаемо: с помощью Фокса мы подключаемся к базе "из вне", в отличии от 1sqlite и вашей разработки, которые используют родной движок и родное подключение.
Вот и получается: 1С заблокировала таблицу на запись, а мы пытаемся считать данные Фоксом - имеем "File is in use by another user.". По этой же причине фоксом не получится обращаться к таблицам в монопольном режиме.
22. kiruha Дронов (kiruha) 359 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) 359 21.08.08 20:56 Сейчас в теме
Каков объем оперативки?
(При не навигационном доступе результат запроса размещается в оперативке,
если ее не хватает - дополнительно приходится скидывать данные на диск (для Fox весь результат))
24. Владимир (hogik) 418 21.08.08 21:51 Сейчас в теме
(22-23)(kiruha)
“Каков объем оперативки?”
Мне этот вопрос не понятен в контексте проводимого тестирования. Проверять я не буду, но не думаю, что для выполнения “select sum($хДвижение.Количество) as Колич from…” требуется большой объем оперативной памяти для размещения результата.
“При не навигационном доступе результат запроса размещается в оперативке…”
Не всегда. ;-))) Огромная к Вам просьба. Не тратьте своё время на объяснение для меня таких вещей. Я начал заниматься CУБД в 1973 году.
“Для многопользовательского режима используют патченный драйвер…”
Интересно. А кроме отключения блокировки в исправленном драйвере, что еще делается для обеспечения непротиворечивости информации при кэшировании на стороне рабочей станции?
“но есть и штатный способ”
Где можно с этим ознакомиться?
25. kiruha Дронов (kiruha) 359 22.08.08 11:50 Сейчас в теме
(24) И не думал просвещать про оперативку.
Вопрос был из за особенности Fox - промежуточные данные запроса размещать в курсорах,
которые могут в зависимости от объема или размещаться в оперативке или скидываться на диск.

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

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

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

"Возможно. Я просто продолжаю данную тему после ваших (18-19) сообщений в контексте сравнения скорости выполнения запроса и выяснения причин такого “феномена"
Ок, если будут вопросы по доступу через Fox - тогда на 1cpp.ru
Феномена никакого нет - цифры вполне нормальные.
В Fox также используют навигационный доступ - и в таких задачах навигац. выигрывает у "реляционного".
28. Владимир (hogik) 418 22.08.08 16:14 Сейчас в теме
(27)(kiruha)
“Феномена никакого нет - цифры вполне нормальные.”
;-) Цифры это следствие. Я то написал “…и выяснения причин такого “феномена””.
Но, пока, мне не удаётся нормально запустить “патченный драйвер”. Несколько раз запрос успешно выполнился. Потом я стал запускать запрос с параллельным обновлением таблицы. И с какого то момента стало вылетать сообщение:
…FAILED! ICommandText::Execute(): Undefined critical error!
Вернулся на исходный драйвер – работает. Базу данных восстановил – не помогло… :-(
29. kiruha Дронов (kiruha) 359 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) 418 23.08.08 00:37 Сейчас в теме
(29)(kiruha)
“Альтернативный способ”
Спасибо. При этом способе работает устойчиво. Ошибку, аналогичную, ошибке при использовании 1SQLite, пока, получить не удалось. Тогда у меня возникает вопрос. Невозможность использования драйвера FoxPro в монопольном режиме это основной недостаток данного средства выполнения прямых запросов к DBFной базе? Может мне имеет смысл заняться написанием очередного варианта DBEng32 для решения этой проблемы? Это ещё актуально?
31. kiruha Дронов (kiruha) 359 23.08.08 01:22 Сейчас в теме
(30) Это недостаток и актуальный. Fox не использует 1С для доступа к файлам - поэтому не представляю,
как это можно решить - блокировка идет на уровне ОС.

Если удалось бы решить эту проблему - это было бы здорово :) Но народ считает что это невозможно (.
32. kiruha Дронов (kiruha) 359 23.08.08 01:40 Сейчас в теме
Также должен заметить, что более перспективно использование не OLEDB , а напрямую библиотек Fox
- это позволяет использовать дополнительные возможности библиотек Fox (например отладка, использование
команд без создания хранимых процедур, реализация сервера) - но это тоже пока мечты.
33. Владимир (hogik) 418 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) 359 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) 418 23.08.08 15:40 Сейчас в теме
(34)(kiruha)
“Даже за саму попытку это сделать -”
Уже начал делать. Думаю, к концу следующей недели будет или не будет результат. Но если у меня не получится это сделать простым способом, то всегда остаётся возможность посадить 1С на FoxPro в части движка БД. Но это сложней и дольше делать. Поэтому и пытаюсь разобраться в том, что я написал в следующем абзаце. Т.е. хочу найти в этом большой смысл. ;-)))
(35)(kiruha)
“Fox позволяет достаточно просто делать сервера.”
Это и все что написано вокруг этой фразы мне известно и понятно. Думаю, мне не понятно – а зачем “через” такие способы делается “нечто”. Я когда читаю вот такие фразы “…передаче массивов(точнее из курсора…” у меня крыша едет. Типа, причем тут одно к другому? Суть задач в чем? Не в смысле “напрямую получать массивы из Fox”, а в смысле 1С+FoxPro в целом?
37. Владимир (hogik) 418 23.08.08 19:29 Сейчас в теме
+(36)
Сделал возможность выполнения прямых запросов в монопольном режиме.
http://infostart.ru/profile/2905/projects/2418/
38. kiruha Дронов (kiruha) 359 24.08.08 00:59 Сейчас в теме
(36) "Думаю, мне не понятно – а зачем “через” такие способы делается “нечто”"
База хранится на файл-сервере.
Задача - ускорить выполнение запросов.
При использовании OLEDB Fox тащит часть содержимого таблиц DBF и CDX на клиента, если попали в индекс.
Если нет подходящего индекса - тащится вся таблица(за исключением ненужных столбцов).
Бывают варианты, когда нужно всего несколько строк.
Например это условие по реквизиту спр. без признака "отбор".
В таких случаях выгоднее выполнить запрос на файл сервере.
Также на файл сервере могут стоять более мощные процессоры чем на клиенте.
Остается проблема передачи результата запроса клиенту - пользователю 1С.
Текущие варианты (через строки, через временные файлы) недостаточно эффективны и
могут свести на нет преимущества использования сервера.

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



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

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

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