Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Прямой запрос к DBF базе по сети (число прочтений - 5366 )
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Прямой запрос к DBF базе по сети
05. Ноября 2009 :: 15:07
Печать  
Есть задача - оптимизировать скорость получения остатков по всем ТМЦ.
Условия
  - формат базы -  DBF (объем базы - 3 гига).
  - перевод с DBF в SQL невозможен по определенным причинам.
  - в роли сервера - XP prof (тут лежит база)
  - в роли клиента - 2000 prof

Испытания:
   При запуске на сервере, тоесть в случае когда база локальная:
  - прямой запрос - 3 секунды
  - стандартный запрос 1С - 4 секунды

   При запуске на рабочей станции, тоесть в случае когда база находится где-то в сети
  - прямой запрос - 90 секунд !!!!!
  - стандартный запрос 1С - 8 секунды

Ощущается непонятка. При запуске на сервере прямой запрос отрабатывает быстрее, а при запуске на рабочей станции запрос отрабатывает медленнее.

Вопрос. В ЧЕМ ПРИЧИНА ???.
Прошу гуру выразить своё мнение по этому поводу.

Вот текст запроса:
     |SELECT
     |      Рег.Товар as [ТМЦ $Справочник.Запаси],
     |      SUM(Рег.КоличествоОстаток) as Кількість
     |FROM
     |      (SELECT
     |            $Р.ТМЦ AS Товар,
     |            $Р.Кількість AS КоличествоОстаток
     |      FROM
     |            $РегистрИтоги.ЗапасиК as Р
     |      WHERE
     |            (period = :ПредМесяц~~)
     |            AND ($Р.Склад = :Склад)
     |
     |      UNION ALL
     |
     |      SELECT
     |            $Р.ТМЦ AS Товар,
     |            $Р.Кількість * (1 - Р.debkred * 2) AS КоличествоОстаток
     |      FROM
     |            $Регистр.ЗапасиК AS Р
     |      INNER JOIN
     |            1sjourn jr ON Р.iddoc = jr.iddoc
     |                  AND (jr.date >= :НачалоМесяца~~)
     |                  AND ($ФлагРегистра.ЗапасиК = 1)
     |      WHERE
     |            ($Р.Склад = :Склад)
     |      ) Рег
     |GROUP BY
     |      Рег.Товар
     |";


и, соответственно, стандартный запрос 1С:
     "//{{ЗАПРОС(Сформировать)
     |Период с ВыбНачПериода по ВыбКонПериода;
     |ПОб = Регистр.ЗапасиК.ПОб;
     |Склад = Регистр.ЗапасиК.Склад;
     |Кількість = Регистр.ЗапасиК.Кількість;
     |ТМЦ = Регистр.ЗапасиК.ТМЦ;
     |Функция КількістьКонОст = КонОст(Кількість);
     |Группировка ТМЦ без групп;
     |Условие(ПОб = Перечисление.ТакНі.Так);
     |Условие(Склад = ВыбСклад);


  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Прямой запрос к DBF базе по сети
Ответ #1 - 05. Ноября 2009 :: 15:40
Печать  
Строка подключения какая ?

Структура регистра ?

Данные нужны на ТА ?
  
Наверх
 
IP записан
 
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Re: Прямой запрос к DBF базе по сети
Ответ #2 - 06. Ноября 2009 :: 06:03
Печать  
Строка подключения:

СтрокаСоединения = "Provider=VFPOLEDB.1;Set Deleted=Yes;Data Source=" + Каталог + ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";;

Структура регистра
Регистр      ЗапасиК
Измерения
  ПОб - Перечисление
  Рахунок - Счет
  Склад - справочник склады
  ТМЦ - справочник запаси (ТМЦ)
Ресурсы
  Кількість - Число 18,3
(Структура регистра может показаться странной, но уж какая есть. ПОБ - признак бухгалтерского или общего учета. Рахунок - счет на котором лежит ТМЦ)


Данные нужны на ТА ?
Да. данные нужны на ТА.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прямой запрос к DBF базе по сети
Ответ #3 - 06. Ноября 2009 :: 06:24
Печать  
1. Строка подключения=
Код
Выбрать все
"
	|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=""""" 


2. Если данные нужны только на ТА, то объединение с таблицей движения регистра (FROM $Регистр.ЗапасиК ) не нужно
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Прямой запрос к DBF базе по сети
Ответ #4 - 06. Ноября 2009 :: 06:34
Печать  
Если данные нужны на ТА достаточно только таблицы rg на последний период а не union rg предпоследнего и сумма ra
  
Наверх
 
IP записан
 
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Re: Прямой запрос к DBF базе по сети
Ответ #5 - 06. Ноября 2009 :: 08:06
Печать  
Итак:
После изменения строки подключения и самого прямого запроса результаты лучше, но не утешительные.

Строка подключения взята из поста выше,
переделанный запрос:
|SELECT
|      $Р.ТМЦ AS [ТМЦ $Справочник.Запаси],
|      $Р.Кількість AS Кількість
|FROM
|            $РегистрИтоги.ЗапасиК as Р
|WHERE
|            (period = :НачалоМесяца~~)
|            AND ($Р.ПОб = :ПобТак)
|            AND ($Р.Склад = :Склад)
|";

РЕЗУЛЬТАТЫ:
КАК-БЫ СЕРВЕР (база локальная)
 - прямой запрос - 1 секунда
 - стандартный запрос 1С - 4 секунды

  При запуске на рабочей станции, тоесть в случае когда база находится где-то в сети
- прямой запрос - 30 секунд !!!!!  
- стандартный запрос 1С - 8 секунд

Видно уменьшение времени на рабочей станции с 90 до 30 секунд. прогресс на лицо.
НО !!!
Стандартный запрос отрабатывает быстрее !!!
Вот такие вот пока результаты.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Прямой запрос к DBF базе по сети
Ответ #6 - 06. Ноября 2009 :: 08:18
Печать  
Про dbf мало могу чего сказать.
1.Во первых надо узнать попадаем ли мы в индекс
для прямого запроса.
2.Выполни для теста по сети запрос без типизации какое время
3.Сколько строк возвращается
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прямой запрос к DBF базе по сети
Ответ #7 - 06. Ноября 2009 :: 08:25
Печать  
  

1&&2&&3
Наверх
 
IP записан
 
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Re: Прямой запрос к DBF базе по сети
Ответ #8 - 06. Ноября 2009 :: 08:28
Печать  
Z1 писал(а) 06. Ноября 2009 :: 08:18:
Про dbf мало могу чего сказать.
1.Во первых надо узнать попадаем ли мы в индекс
для прямого запроса.
2.Выполни для теста по сети запрос без типизации какое время
3.Сколько строк возвращается


1. во части WHERE порядок совпадает с порядком в регистре.
2. без типизации, как ни странно, выполняется с таким же временем, ну может на 1 - 2 секунді быстрее.
3. Возвращаентя 3330 строк.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Прямой запрос к DBF базе по сети
Ответ #9 - 06. Ноября 2009 :: 08:36
Печать  
(8) сделай 7
  
Наверх
 
IP записан
 
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Re: Прямой запрос к DBF базе по сети
Ответ #10 - 06. Ноября 2009 :: 09:07
Печать  
#==TABLE no 388    : Регистр ЗапасиК
# Name    |Descr                         |Type[A/S/U]|DBTableName|ReUsable 
T=RG6672  |Регистр ЗапасиК               |A          |RG6672     |1         
#-----Fields-------
# Name      |Descr               |Type|Length|Precision
F=PERIOD    |Period Registr      |D   |8     |0       
F=SP6673    |(P)ПОб              |C   |9     |0       
F=SP6674    |(P)Рахунок          |C   |13    |0       
F=SP6675    |(P)Склад            |C   |9     |0       
F=SP6676    |(P)ТМЦ              |C   |9     |0       
F=SP6678    |(P)Кількість        |N   |19    |3       
F=SP6679    |(P)Резерв           |N   |19    |3       
F=SP6680    |(P)Перспектива      |N   |19    |3       
#----Indexes------
# Name     |Descr         |Unique|Indexed fields                                              |DBName    
I=PROP     |PERIOD+PROP   |0     |PERIOD,SP6673,SP6674,SP6675,SP6676                          |PROP      
I=VIA6674  |VIA6674       |0     |PERIOD,SP6674                                               |VIA6674   
I=VIA6675  |VIA6675       |0     |PERIOD,SP6675                                               |VIA6675   
I=VIA6676  |VIA6676       |0     |PERIOD,SP6676                                               |VIA6676   
#

Запрос типа
|SELECT
|      $Р.ТМЦ AS [ТМЦ $Справочник.Запаси],
|      $Р.Кількість AS Кількість
|FROM
|            $РегистрИтоги.ЗапасиК as Р
|WHERE
|
|      DTOS(Р.period)+$Р.ПОб+$Р.Склад = DTOS(:НачалоМесяца~~)+:ПобТак+:Склад
|

Вообще увеличивает время на сервере с 1 секунды до 4-х
Мне ведь нужно отобрать остатки только с конкретным ПОБ и Складом, и по всем счетам.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Прямой запрос к DBF базе по сети
Ответ #11 - 06. Ноября 2009 :: 09:26
Печать  
После соединения ОлеДБ
ОлеДБКоманда = ОлеДБ.СоздатьКоманду();
ОлеДБКоманда.Выполнить("EXEC('SET ANSI OFF')");

Сам запрос
Код
Выбрать все
|SELECT
|	$Р.ТМЦ AS [ТМЦ $Справочник.Запаси],
|	$Р.Кількість AS Кількість
|FROM
|		$РегистрИтоги.ЗапасиК as Р
|WHERE
|
|	DTOS(Р.period)+$Р.ПОб+$Р.Рахунок+$Р.Склад+$Р.ТМЦ = DTOS(:НачалоМесяца~~)+:ПобТак
|	AND $Р.Склад=:Склад 



т.к. индекс
I=PROP     |PERIOD+PROP   |0     |PERIOD,SP6673,SP6674,SP6675,SP6676

это я не знаю что такое  ПОб - может надо было выбрать индекс с о складом
а вообще в SQLLite - автоматом индексы подбираются
  
Наверх
 
IP записан
 
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Re: Прямой запрос к DBF базе по сети
Ответ #12 - 06. Ноября 2009 :: 09:33
Печать  
Всем спасибо. вот какой получился запрос
|SELECT
|      $Р.ТМЦ AS [ТМЦ $Справочник.Запаси],
|      $Р.Кількість AS Кількість
|FROM
|            $РегистрИтоги.ЗапасиК as Р
|WHERE
|
|      DTOS(Р.period)+$Р.ПОб = DTOS(:НачалоМесяца~~)+:ПобТак
|      AND DTOS(Р.period)+$Р.Склад = DTOS(:НачалоМесяца~~)+:Склад
|

объяснение:
По сколько нужно попасть в индекс
  - попадаем в индекс ПОБ
    DTOS(Р.period)+$Р.ПОб = DTOS(:НачалоМесяца~~)+:ПобТак

   - попадаем в индекс Склад
   AND DTOS(Р.period)+$Р.Склад = DTOS(:НачалоМесяца~~)+:Склад

Результат - сервер - 0.042 сек, рабочая станция - 0,54 сек.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Прямой запрос к DBF базе по сети
Ответ #13 - 06. Ноября 2009 :: 09:39
Печать  
у тебя же индекс
F=PERIOD    |Period Registr      |D   |8     |0       
F=SP6673    |(P)ПОб              |C   |9     |0       
F=SP6674    |(P)Рахунок          |C   |13    |0
F=SP6675    |(P)Склад            |C   |9     |0


вот он наверное и будет перебирать все по
Период +   ПОб
если хочешь чтобы перебор шел по  складу по используй индекс 
I=VIA6675  |VIA6675       |0     |PERIOD,SP6675                                               |VIA6675
т.е. подходящего индекса нет.


PS 1. У тебя этот регистр закрывается ?
2.я не понимаю зачем в качестве файлового сервера использовать ОС ХП ?
  
Наверх
 
IP записан
 
maxan
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 10
Зарегистрирован: 05. Ноября 2009
Re: Прямой запрос к DBF базе по сети
Ответ #14 - 06. Ноября 2009 :: 09:50
Печать  
Z1 писал(а) 06. Ноября 2009 :: 09:39:
у тебя же индекс
F=PERIOD    |Period Registr      |D   |8     |0        
F=SP6673    |(P)ПОб              |C   |9     |0        
F=SP6674    |(P)Рахунок          |C   |13    |0
F=SP6675    |(P)Склад            |C   |9     |0


вот он наверное и будет перебирать все по
Период +   ПОб
если хочешь чтобы перебор шел по  складу по используй индекс  
I=VIA6675  |VIA6675       |0     |PERIOD,SP6675                                               |VIA6675
т.е. подходящего индекса нет.


PS 1. У тебя этот регистр закрывается ?
2.я не понимаю зачем в качестве файлового сервера использовать ОС ХП ?


1. Это регистр остатков ТМЦ на всех складах предприятия. и я не совсем понимаю фразу "регистр закрывается"
2. Это я делаю для филиалов, а там 2 - 3 системника всего.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать