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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

42 Comments

  1. CheBurator

    …спилберг…

    Reply ↓
  2. hogik

    (1)(Сhe Burashka)

    “…спилберг…”

    А это означает “плюс” или “минус”? ;-)))))))

    Reply ↓
  3. CheBurator

    …непанятна…

    а выложить сами тексты тестов…?

    Reply ↓
  4. hogik

    (3)

    “а выложить сами тексты тестов…?”

    Положил. Примерно так это выглядит.

    Reply ↓
  5. Abadonna

    #==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

    Reply ↓
  6. Lesovik

    кинулся тестировать:)

    Reply ↓
  7. hogik

    (5)

    “Нет, чтобы мои плагином открыть”

    Это дело вкуса. 😉

    Неужели больше замечаний нет? 🙁

    Reply ↓
  8. Abadonna

    >Неужели больше замечаний нет?

    Замечание только одно: dbf — это что??? :)))

    Разве ж можно живую 1С и dbf-ом? :)))

    У меня даже на отладке и то скуль стоит, я такой матершины как dbf и помнить не желаю

    Reply ↓
  9. hogik

    (8)

    “Разве ж можно живую 1С и dbf-ом?”

    И я об том же. 😉

    В “DBEng32+Advantage” не CDX/DBF, а ADI/ADT.

    Reply ↓
  10. JohnyDeath

    (8) Многие и на ДБФ нормально работают!

    Ты ж, Аркадий, сам постоянно говоришь про провинции, уровни тамошних з/п и т.д. Теперь прикинь во сколько конторе обойдётся поставить 1С на SQL (ес-но, чтоб всё лицензионное было).

    Reply ↓
  11. Abadonna

    (10) Вот тут ты ошибаешься! На ЗП экономят, но, к примеру, если бы зашел в нашей конторе только в туалет и посмотрел, что там — и москвичи могут позавидовать… А как тебе три канала оптики по 2 мегабита с безлимитным инетом? А телефон у КАЖДОГО сотрудника, причем беспроводной? И т.д. и т.п. :)))

    Reply ↓
  12. JohnyDeath

    (11) с сортиром у нас тоже всё нормально ;))))))) (может эта такая мода у провинциальных директоров?)

    Но если б ты посмотрел на наш «сервер» ты б ах-ел! Я уж не говорю о том, как они относятся к тому, чтобы купить КАКОЙ-ТО там SQL, а потом к нему ещё и лицензии покупать (тоже непонятно какие и зачем). Вот такая вот хреновина у нас за МКАДом 😉

    Reply ↓
  13. Abadonna

    (12) >на наш «сервер»

    Гы, у нас серверов штук 8 или 10…. Кстати, классную МФУ на днях взяли, включает в себя кроме прочего факсимильный аппарат с лазерной печатью и даже с распознаванием, если надо. Приятный девайсик

    Reply ↓
  14. hogik

    (12)

    “Вот такая вот хреновина у нас за МКАДом”

    И у нас…:-(((

    Reply ↓
  15. silgis

    Тут подсчитали, чтобы перевести свою базу на SQL на 50 пользователей необходимо выложить почти 500000 (полмиллиона) рублеков(покупка SQL сервера+Windows Server+лицензии+выделенный сервер), начальство ужаснулась, и сказали тащите свою базу в 4 Гига на DBF, приходится резать.

    Reply ↓
  16. hogik

    Добавлены замеры для DBEng32 (CodeBase 6.5).

    Reply ↓
  17. hogik

    Изменены замеры для DBEng32 (CodeBase 6.5) в новой (5.1.2.9) версии.

    Reply ↓
  18. kiruha

    Для чистоты эксперимента тогда уж прошу проверить замеры и для драйвера 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));

    Показать полностью

    Работет только в разделенном режиме.

    Во время первого обращения к таблице за ссесию происходит инициализация.

    Наибольшие преимущества в многопользовательском режиме и работа с удаленными данными (на файл сервере)

    — т.е. в фактическом "боевом" применении

    Reply ↓
  19. kiruha

    И кстати — Тесты проверяют только одну сторону — выборку данных с условием попадающим в индекс.

    Отдельно надо проводить тесты на GROUP BY, ORDER BY, JOIN,

    а также работу с вложенными подзапросами, а также при непопадании условия в индекс.

    Как показывают тесты проведенные на форуме 1Cpp в этих операциях, без которых не обходится ни один

    реальный запрос — время отличает очень существенно

    Reply ↓
  20. hogik

    (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,”

    Мне это не надо. Извините…

    Reply ↓
  21. JohnyDeath

    (20) по п.2

    Ну тут всё ожидаемо: с помощью Фокса мы подключаемся к базе «из вне», в отличии от 1sqlite и вашей разработки, которые используют родной движок и родное подключение.

    Вот и получается: 1С заблокировала таблицу на запись, а мы пытаемся считать данные Фоксом — имеем «File is in use by another user.». По этой же причине фоксом не получится обращаться к таблицам в монопольном режиме.

    Reply ↓
  22. kiruha

    (20)Извините — я думал Вы в курсе.

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

    http://uzhast.fatal.ru/vfpoledb/ (но есть и штатный способ)

    Общий FAQ по использованию Fox в ДБФ

    http://www.1cpp.ru/forum/YaBB.pl?num=1148038411/25#25

    Reply ↓
  23. kiruha

    Каков объем оперативки?

    (При не навигационном доступе результат запроса размещается в оперативке,

    если ее не хватает — дополнительно приходится скидывать данные на диск (для Fox весь результат))

    Reply ↓
  24. hogik

    (22-23)(kiruha)

    “Каков объем оперативки?”

    Мне этот вопрос не понятен в контексте проводимого тестирования. Проверять я не буду, но не думаю, что для выполнения “select sum($хДвижение.Количество) as Колич from…” требуется большой объем оперативной памяти для размещения результата.

    “При не навигационном доступе результат запроса размещается в оперативке…”

    Не всегда. ;-))) Огромная к Вам просьба. Не тратьте своё время на объяснение для меня таких вещей. Я начал заниматься CУБД в 1973 году.

    “Для многопользовательского режима используют патченный драйвер…”

    Интересно. А кроме отключения блокировки в исправленном драйвере, что еще делается для обеспечения непротиворечивости информации при кэшировании на стороне рабочей станции?

    “но есть и штатный способ”

    Где можно с этим ознакомиться?

    Reply ↓
  25. kiruha

    (24) И не думал просвещать про оперативку.

    Вопрос был из за особенности Fox — промежуточные данные запроса размещать в курсорах,

    которые могут в зависимости от объема или размещаться в оперативке или скидываться на диск.

    (24) Для непротиворечивости выполняется команда Fox —

    SET REFRESH TO 0,-1 которая заставляет игнорировать буфер.

    Штатный способ — во время загрузки 1С в ссесии Fox «открывать» таблицы ДБФ .

    После этого захват таблиц 1С во время проведения не мешает обращаться к ним Fox-у.

    Вообще есть много особенностей — половина раздела прямых запросов форума 1С++ этому посвящена —

    вряд ли здесь это интересно…

    Что касается практической проверки — народ использует доступ где то с 2005 г. На моей базе — года 1.5 в боевом.

    Reply ↓
  26. hogik

    (25)(kiruha)

    “Для непротиворечивости выполняется команда Fox”

    Я задавал другой вопрос:

    “А кроме отключения блокировки в исправленном драйвере, что еще делается для обеспечения непротиворечивости информации при кэшировании на стороне рабочей станции?”

    “вряд ли здесь это интересно…”

    Возможно. Я просто продолжаю данную тему после ваших (18-19) сообщений в контексте сравнения скорости выполнения запроса и выяснения причин такого “феномена”. Можно и не продолжать. ;-)))

    Reply ↓
  27. kiruha

    (26) Что в драйвере исправлено — знает только автор

    http://uzhast.fatal.ru/ но по его словам он вырезал только аналог LOCK

    «Возможно. Я просто продолжаю данную тему после ваших (18-19) сообщений в контексте сравнения скорости выполнения запроса и выяснения причин такого “феномена»

    Ок, если будут вопросы по доступу через Fox — тогда на 1cpp.ru

    Феномена никакого нет — цифры вполне нормальные.

    В Fox также используют навигационный доступ — и в таких задачах навигац. выигрывает у «реляционного».

    Reply ↓
  28. hogik

    (27)(kiruha)

    “Феномена никакого нет — цифры вполне нормальные.”

    😉 Цифры это следствие. Я то написал “…и выяснения причин такого “феномена””.

    Но, пока, мне не удаётся нормально запустить “патченный драйвер”. Несколько раз запрос успешно выполнился. Потом я стал запускать запрос с параллельным обновлением таблицы. И с какого то момента стало вылетать сообщение:

    …FAILED! ICommandText::Execute(): Undefined critical error!

    Вернулся на исходный драйвер – работает. Базу данных восстановил – не помогло… 🙁

    Reply ↓
  29. kiruha

    (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();
    КонецПроцедуры
    

    Показать полностью

    Далее использовать глОлеДБ для создания запросов

    Reply ↓
  30. hogik

    (29)(kiruha)

    “Альтернативный способ”

    Спасибо. При этом способе работает устойчиво. Ошибку, аналогичную, ошибке при использовании 1SQLite, пока, получить не удалось. Тогда у меня возникает вопрос. Невозможность использования драйвера FoxPro в монопольном режиме это основной недостаток данного средства выполнения прямых запросов к DBFной базе? Может мне имеет смысл заняться написанием очередного варианта DBEng32 для решения этой проблемы? Это ещё актуально?

    Reply ↓
  31. kiruha

    (30) Это недостаток и актуальный. Fox не использует 1С для доступа к файлам — поэтому не представляю,

    как это можно решить — блокировка идет на уровне ОС.

    Если удалось бы решить эту проблему — это было бы здорово 🙂 Но народ считает что это невозможно (.

    Reply ↓
  32. kiruha

    Также должен заметить, что более перспективно использование не OLEDB , а напрямую библиотек Fox

    — это позволяет использовать дополнительные возможности библиотек Fox (например отладка, использование

    команд без создания хранимых процедур, реализация сервера) — но это тоже пока мечты.

    Reply ↓
  33. hogik

    (31-32)(kiruha)

    “поэтому не представляю, как это можно решить”

    Я пока не вижу проблем сделать это. Пожалуй, начну делать…

    “Если удалось бы решить эту проблему — это было бы здорово”

    Мне казалось, что DBFная версия – уже не очень актуальна.

    “более перспективно использование не OLEDB , а напрямую библиотек Fox”

    Не совсем понимаю. Я использую FoxPro 6.0 из 1С. А в 9-ой версии с этим проблемы?

    “реализация сервера”

    Совсем не понимаю. Можно поподробней?

    Reply ↓
  34. noprogrammer

    33 (hogik)

    >> Я пока не вижу проблем сделать это. Пожалуй, начну делать…

    Даже за саму попытку это сделать — уже спасибо.

    >> Мне казалось, что DBFная версия – уже не очень актуальна.

    Боюсь что тут вы сильно ошибаетесь…

    Reply ↓
  35. kiruha

    (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+

    Reply ↓
  36. hogik

    (34)(kiruha)

    “Даже за саму попытку это сделать -”

    Уже начал делать. Думаю, к концу следующей недели будет или не будет результат. Но если у меня не получится это сделать простым способом, то всегда остаётся возможность посадить 1С на FoxPro в части движка БД. Но это сложней и дольше делать. Поэтому и пытаюсь разобраться в том, что я написал в следующем абзаце. Т.е. хочу найти в этом большой смысл. ;-)))

    (35)(kiruha)

    “Fox позволяет достаточно просто делать сервера.”

    Это и все что написано вокруг этой фразы мне известно и понятно. Думаю, мне не понятно – а зачем “через” такие способы делается “нечто”. Я когда читаю вот такие фразы “…передаче массивов(точнее из курсора…” у меня крыша едет. Типа, причем тут одно к другому? Суть задач в чем? Не в смысле “напрямую получать массивы из Fox”, а в смысле 1С+FoxPro в целом?

    Reply ↓
  37. hogik

    +(36)

    Сделал возможность выполнения прямых запросов в монопольном режиме.

    http://infostart.ru/profile/2905/projects/

    Reply ↓
  38. kiruha

    (36) «Думаю, мне не понятно – а зачем “через” такие способы делается “нечто”»

    База хранится на файл-сервере.

    Задача — ускорить выполнение запросов.

    При использовании OLEDB Fox тащит часть содержимого таблиц DBF и CDX на клиента, если попали в индекс.

    Если нет подходящего индекса — тащится вся таблица(за исключением ненужных столбцов).

    Бывают варианты, когда нужно всего несколько строк.

    Например это условие по реквизиту спр. без признака «отбор».

    В таких случаях выгоднее выполнить запрос на файл сервере.

    Также на файл сервере могут стоять более мощные процессоры чем на клиенте.

    Остается проблема передачи результата запроса клиенту — пользователю 1С.

    Текущие варианты (через строки, через временные файлы) недостаточно эффективны и

    могут свести на нет преимущества использования сервера.

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

    Reply ↓
  39. hogik

    (38)(kiruha)

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

    Это Вы меня извините, что отнимаю Ваше время своими вопросами. Но задам еще вопросы.

    1) Почему не используете нормальный сервер БД?

    2) В FoxPro9 снято ограничение на размер таблицы в 1(2) гигабайта.

    3) С помощью ОлеДБКоманда.Выполнить(«EXECSCRIPT(‘…’)») можно выполнять навигационные команды?

    Reply ↓
  40. kiruha

    (39)

    п1. Пока ДБФ почти полностью устраивает пользователей.

    Время запросов до 3 сек (файлы до 50Мб пока), средниее время и того меньше.

    Также из за этого нет причин по которым могу обосновать затраты на сервер.

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

    п3 Можно. Но вызов EXECSCRIPT фактически требует каждый раз новой компиляции, которая занимет существенное

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

    Reply ↓
  41. hogik

    (40)(kiruha)

    “файлы до 50Мб пока”

    😉 Иногда количественные характеристики лучше проясняют вопрос (тему), чем качественные. По этой теме у меня больше нет вопросов. Мы, то, напоролись на ограничение в 1 гигабайт на первом году эксплуатации, ещё в 2001 году. И ход моих мыслей стал совсем другой. 😉 Закрываем эту тему.

    Reply ↓
  42. nickkey

    Как показывают тесты и практика народа проведенные на форуме 1Cpp с этими операциями, без которых не обходится ни один реальный запрос — время отличается очень и очень существенно так что лишено не лишено смысла решать вам а вообще хороший пост заставляет хорошенько подумать 🙂

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *