Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Возможно ли оптимизировать запрос к dbf (число прочтений - 7688 )
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Возможно ли оптимизировать запрос к dbf
03. Июля 2012 :: 11:03
Печать  
Подскажите пожалуйста как правильнее делать соединения
СправочникАналогов LEFT JOIN СправочникТоваров LEFT JOIN РегистрПартии

Делаю так:
По СтрокаПоиска ищу различные КодАналогов из Спр.Аналоги
затем левым соединением присоединяю Спр.Номенклатура
затем левым соединением присоединяю Рег.ПартииТоваров.
Запрос рабочий.
Но кажется мне что не оптимальный. т.к. перед левым соединением
расчитывается Регистр.ПартииТоваров по всем товарам.

Как мне ограничить расчет Регистр.ПартииТоваров только теми товарами которые получаю после левого соединения с Справочником номенклатура?

Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|	DISTINCT $СпрАналоги.КодАналогов                     AS КодАналогов,
	|	СпрНоменклатура.ID                                   AS [Ссылка $Справочник.Номенклатура],
	|	СпрНоменклатура.Code                                 AS Код,
	|	СпрНоменклатура.DESCR                                AS Наименование,
	|	ИтогиПартииТоваров.ОстатокТовара                     AS Остаток,
	|	CAST(ИтогиПартииТоваров.Стоимость AS NUMERIC(15,2))  AS Стоимость,
	|	CAST(ИтогиПартииТоваров.НДС AS NUMERIC(15,2))        AS НДС
	|FROM
	|	$Справочник.Аналоги AS СпрАналоги
	|LEFT JOIN $Справочник.Номенклатура AS СпрНоменклатура
	|		ON ($СпрНоменклатура.КодАналогов = $СпрАналоги.КодАналогов) AND
	|		   (СпрНоменклатура.IsFolder = 2) AND
	|		   (СпрНоменклатура.IsMark = '')
	|LEFT JOIN (
	|           SELECT
	|				$ИтогиПартии.Товар AS ТоварID,
	|				SUM($ИтогиПартии.ОстатокТовара) AS ОстатокТовара,
	|				SUM($ИтогиПартии.Стоимость) AS Стоимость,
	|				SUM($ИтогиПартии.НДС) AS НДС
	|			FROM
	|				$РегистрИтоги.ПартииТоваров AS ИтогиПартии
	|			WHERE
	|				(period = :ТАМесяц~~)
	|           GROUP BY
	|				$ИтогиПартии.Товар
	|			) AS ИтогиПартииТоваров
	|			ON ИтогиПартииТоваров.ТоварID = СпрНоменклатура.ID
	|
	|WHERE
	|	СпрАналоги.IsMark = '' AND
	|	(LOWER($СпрАналоги.Артикул) = :Артикул)
	|";                                                              

	База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
	Рез = База.Соединение(Соединение);
    Если Рез=0 Тогда
        Сообщить("Подключение к БД не выполнено!", "!");
    КонецЕсли;
    Запрос = База.СоздатьКоманду();
    Запрос.УстановитьТекстовыйПараметр("Артикул", СтрокаПоиска);
    Запрос.УстановитьТекстовыйПараметр("ТАМесяц", НачМесяца(ПолучитьДатуТА()));
    ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #1 - 03. Июля 2012 :: 11:35
Печать  
Marten писал(а) 03. Июля 2012 :: 11:03:


Как мне ограничить расчет Регистр.ПартииТоваров только теми товарами которые получаю после левого соединения с Справочником номенклатура?


Быстрее не будет.

А так, твой запрос нужно переписыть, чтоб задействовал индексы - вот тогда скорость возрастет в разы.

Но если хочешь - то запрос сразу к регистру + условие на номенклатуру, которую получаешь подзапросом.
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #2 - 03. Июля 2012 :: 11:49
Печать  
запрос сразу к регистру + условие на номенклатуру

Можно любой пример? (только к dbf)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #3 - 03. Июля 2012 :: 12:29
Печать  
Код
Выбрать все
	ОлеДБ = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
	Рез = ОлеДБ.Соединение(Соединение);
	Запрос = ОлеДБ.СоздатьКоманду();
	Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
	Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
	Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
	Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");
	Запрос = ОлеДБ.СоздатьКоманду();

	ТекстЗапроса = "
		|   SELECT
		|		 $ИтогиПартии.Товар as [Номенклатура $Справочник.Номенклатура],
	  |		   SUM($ИтогиПартии.ОстатокТовара) AS ОстатокТовара,
	    |	     SUM($ИтогиПартии.Стоимость) AS Стоимость,
	    |				SUM($ИтогиПартии.НДС) AS НДС
		|	FROM
		|		$РегистрИтоги.ПартииТоваров ИтогиПартии
		|	WHERE
		|		DTOS(ИтогиПартии.period)+$ИтогиПартии.Товар --надеюсь, на товар есть галка отбор итогов
		|		LIKE  (DTOS(:НачПериод~~)+'_________')
		|	and $ИтогиПартии.Товар in
		|    (select СпрНоменклатура.id from  $Справочник.Номенклатура AS СпрНоменклатура
		|     where
     	|		   СпрНоменклатура.IsFolder = 2 AND СпрНоменклатура.IsMark = ''
	  |	    and $СпрНоменклатура.КодАналогов in ( SELECT $СпрАналоги.КодАналогов FROM $Справочник.Аналоги AS СпрАналоги
		|	     where СпрАналоги.IsMark = '' AND LOWER($СпрАналоги.Артикул) = :Артикул))
		|";
    Запрос.УстановитьТекстовыйПараметр("Артикул", СтрокаПоиска);
	мд = СоздатьОбъект("MetaDataWork");
	уТА()));
	ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); 



типа того, можешь и заместо where  -  inner join затолкать, если нужны еще поля
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #4 - 03. Июля 2012 :: 12:40
Печать  
Спасибо.
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #5 - 03. Июля 2012 :: 21:07
Печать  
Решил сделать упор на индексы
Все получается. Запрос выполняется в 4 раза быстрее

Только один вопрос.
Прочитал про оптимизацию индексов часть 2. На странице 2 обсуждались индексы когда идет LEFT JOIN

Пробую применить к своему запросу - получается запрос дольше выполняется т.е. не попал в индекс

Ткните носом что не так делаю:

1. Использую один индекс из множества в Спр.Номенклатура
UPPER(sp3163)+UPPER(descr)
sp3163 строка 15
descr строка 100 (так уж сложилось)

Код
Выбрать все
	|LEFT JOIN $Справочник.Номенклатура AS СпрН
	|		ON (UPPER(СпрН.sp3163)+UPPER(СпрН.descr)
	|			LIKE _________________________________________'))
	|		   AND (СпрН.IsFolder = 2)
	|		   AND (СпрН.IsMark = '')
 

  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #6 - 03. Июля 2012 :: 22:31
Печать  
Как при LEFT JOIN использовать индекс для DBF?

индекс
UPPER(sp3163)+UPPER(descr)
sp3163 строка 15
descr строка 100
sp3056 строка 15

Код
Выбрать все
	|LEFT JOIN $Справочник.Номенклатура AS СпрН
	|		ON (UPPER(СпрН.sp3163)+UPPER(СпрН.descr)
	|			LIKE _________________________________________'))
	|		   AND (СпрН.IsFolder = 2)
	|		   AND (СпрН.IsMark = '')

 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #7 - 04. Июля 2012 :: 09:14
Печать  
вот тут вот качнешь нужное для проверки, попал ли в индекс , али нет
http://www.1cpp.ru/forum/YaBB.pl?num=1210677779/15

зы: сам фокс не нужен, нужны только пару файликов от него..
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #8 - 04. Июля 2012 :: 11:06
Печать  
Использование индекс тэг Idd для оптимизации по технологии Rushmore таблица спрн
Уровень оптимизации Rushmore для таблица спрн: частичная

IDD = Expression id
т.е. в нужный индекс не попал.


нужен индекс VI3163 = Expression UPPER(sp3163)+UPPER(descr)

Правильную ли инструкцию для попадания в индекс использую?

Код
Выбрать все
	|LEFT JOIN $Справочник.ХХХ AS СпрХХХ
	|		ON (описание индекса
	|			LIKE (данные для индекса))
 

  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #9 - 04. Июля 2012 :: 11:14
Печать  
придерживаюсь поста kiruha по Использование индексов (ДБФ) часть 2.

"Т.е. грубо говоря, можно придерживаться следующего простого правила :
для того, чтобы Fox использовал индекс нужно
составить обычный запрос  - как для SQL ,
но только в предложениях WHERE, JOIN - левое выражение дополнять до индекса, который хотим использовать.
И предварительно задать SET ANSI OFF"
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #10 - 04. Июля 2012 :: 11:36
Печать  
Код
Выбрать все
ON (STR(СпрН.sp3163,15)+STR(СпрН.descr,100)
	|			LIKE __________________________________________')) 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #11 - 04. Июля 2012 :: 11:55
Печать  
хотя, с upper должно усё работать..
количество подчеркиваний, точно 100 хоть?

Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

есть в коде ?
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #12 - 04. Июля 2012 :: 12:07
Печать  
100 проверял

Запрос = База.СоздатьКоманду();
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

FAILED! ICommandText::Execute(): Function argument value, type, or count is invalid.

Код
Выбрать все
	|LEFT JOIN $Справочник.Номенклатура AS СпрН
	|		ON (STR(СпрН.sp3163,15)+STR(СпрН.descr,100)
	|			LIKE __________________________________________'))
 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #13 - 04. Июля 2012 :: 12:13
Печать  
Это ошибка на эту команду ?
или на сам текст запроса ?
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #14 - 04. Июля 2012 :: 12:16
Печать  
Только на SET

sp3163 строка 15
descr строка 100
sp3056 строка 15
Поля у меня уже такой длинны (проверял в отладке) зачем SET?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #15 - 04. Июля 2012 :: 12:18
Печать  
Marten писал(а) 04. Июля 2012 :: 12:16:
Только на SET

sp3163 строка 15
descr строка 100
sp3056 строка 15
Поля у меня уже такой длинны (проверял в отладке) зачем SET?


зачет.. как ты хочешь тогда, чтоб индексы работали у тебя ?
Строка подключения какая ?
Сам vfp откуда брал ?
скачай отсюда:
http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA...
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #16 - 04. Июля 2012 :: 12:32
Печать  
Код
Выбрать все
	База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
	Рез = База.Соединение(Соединение);
    Если Рез=0 Тогда
	  Сообщить("Подключение к БД не выполнено!", "!");
    КонецЕсли;


	Запрос = База.СоздатьКоманду();
    Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
 



1.Установил Microsoft OLE DB Provider for Visual FoxPro 9.0
http://www.microsoft.com/downloads/details.aspx?familyid=E1A87D8F-2D58-491F-A0FA...
2.Заменил vfpoledb.dll из vfpoledb_new_sp2.rar
http://uzhast.fatal.ru/vfpoledb/
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #17 - 04. Июля 2012 :: 12:33
Печать  
>>>Заменил vfpoledb.dll из vfpoledb_new_sp2.rar

зафига ?
Улыбка)

для монопольной работы есть решение лучше.

ЗЫ: и вот на этой строке
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

у тебя ошибка теперь, так ?

Вот и не работает у тебя "попадание в индекс"
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #18 - 04. Июля 2012 :: 12:37
Печать  
Заменил vfpoledb.dll из vfpoledb_new_sp2.rar
не для монопольного а для того чтобы таблицы не блокировались
(вроде гдето здесь объяснялось)

Вы же сами спрашивали насчет наличия EXECSCRIPT('SET ANSI OFF')
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #19 - 04. Июля 2012 :: 12:39
Печать  
Убрал
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

Все то же
FAILED! ICommandText::Execute(): Function argument value, type, or count is invalid.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #20 - 04. Июля 2012 :: 12:40
Печать  
не надо ничего заменять.

Использовать провайдер от ужаста не надо (а делался он, для выполнения запросов в монопольном режиме, если что)


Ставить надо это
http://infostart.ru/public/16268/

  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #21 - 04. Июля 2012 :: 12:46
Печать  
А в момент формирования прямого запроса если начнется проведение документа? как поведет себя 1С?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #22 - 04. Июля 2012 :: 12:53
Печать  
Улыбка
ты не поверишь - нормально.
Ты же не апдейтишь/инсертишь таблички.. ты всего лишь читатель.

+ если посмотришь выше - там есть "отключение" блокировок в моём примере.
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #23 - 04. Июля 2012 :: 12:54
Печать  
Спасибо за уделенное время

Скачал.
Буду разбираться.
пользоваться измененной vfpoledb.dll не нужно. я правильно понял?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #24 - 04. Июля 2012 :: 13:00
Печать  
правильно.
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #25 - 04. Июля 2012 :: 15:51
Печать  
Перечитывал свои ответы
нашел неточность

Это ошибка на эту команду ?
или на сам текст запроса ?

Только на SET

sp3163 строка 15
descr строка 100
sp3056 строка 15
Поля у меня уже такой длинны (проверял в отладке) зачем SET?

я имел ввиду STR зачем?
ошибки на SET нет никакой
ошибку выдает когда использую STR

Код
Выбрать все
	|LEFT JOIN $Справочник.Номенклатура AS СпрН
	|		ON (STR(СпрН.sp3163,15)+STR(СпрН.descr,100)
	|			LIKE __________________________________________'))

 



FAILED! ICommandText::Execute(): Function argument value, type, or count is invalid.



Если так то ошибки нет но в нужный индекс не попадаю
Выбиратся автоматом индекс
IDD = Expression id

а хотелось использовать индекс
VI3163 = Expression UPPER(sp3163)+UPPER(descr)

Код
Выбрать все
	|LEFT JOIN $Справочник.Номенклатура AS СпрН
	|		ON (UPPER(СпрН.sp3163)+UPPER(СпрН.descr)
	|			LIKE _________________________________________'))

 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #26 - 04. Июля 2012 :: 17:04
Печать  
Код
Выбрать все
|LEFT JOIN $Справочник.Номенклатура AS СпрН
|		ON (UPPER(СпрН.sp3163)+UPPER(СпрН.descr))
|			LIKE _________________________________________')
 



проверил подобный код - усё отрабатывает и в индекс попадает

ЗЫ: скобочки правильно раставь
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #27 - 04. Июля 2012 :: 17:10
Печать  
А у тебя, либо descr не 100, либо количество _ не верное, для проверки, заместо '___________ .... ' воткни

+'%'
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #28 - 05. Июля 2012 :: 11:08
Печать  
1. (Использовать провайдер от ужаста не надо)  - Убрал
2. (Ставить надо это http://infostart.ru/public/16268/)  - Поставил
3. (скобочки правильно раставь)  - проверил
4. (А у тебя, либо descr не 100, либо количество _ не верное) - descr 100, количество _ = 100
5. (для проверки, заместо '___________ .... ' воткни +'%') - делал

индекс автоматом выбирает по прежнему IDD = Expression id

еще сделано:
пробую использовать индекс VIP3163
parent+STR(isfolder,1)+UPPER(sp3163)+UPPER(descr)

Код
Выбрать все
	|LEFT JOIN 	$Справочник.Номенклатура AS СпрН
	|		ON СпрН.parentid+STR(СпрН.IsFolder,1)+UPPER(СпрН.sp3163)+UPPER(СпрН.descr)
	|			LIKE _________________________________________________________')
	|		   AND (СпрН.IsMark = '')
 



выбирает индекс IDD = Expression id
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #29 - 05. Июля 2012 :: 11:11
Печать  
Пробовал с SET ANSI OFF и ON

Запрос = База.СоздатьКоманду();
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

что я делаю не так?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #30 - 05. Июля 2012 :: 11:21
Печать  
приведи полный текст запроса + строку подключения и установки
  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #31 - 05. Июля 2012 :: 11:39
Печать  
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|	DISTINCT $СпрАналоги.КодАналогов                      AS КодАналогов,
	|	СпрН.ID                                               AS [Ссылка $Справочник.Номенклатура],
	|	СпрН.descr                                            AS Наименование,
	|	ИтогиПартииТоваров.ИтОстаток                          AS Остаток,
	|	CAST(ИтогиПартииТоваров.ИтСтоимость AS NUMERIC(15,2)) AS Стоимость,
	|	CAST(ИтогиПартииТоваров.ИтНДС AS NUMERIC(15,2))       AS НДС
	|FROM
	|	$Справочник.Аналоги AS СпрАналоги
	|LEFT JOIN 	$Справочник.Номенклатура AS СпрН
	|		ON СпрН.parentid+STR(СпрН.IsFolder,1)+UPPER(СпрН.sp3163)+UPPER(СпрН.descr)
	|			LIKE _______________________________________________________________')
	|		   AND (СпрН.IsMark = '')
	//|		ON (UPPER(СпрН.sp3163)+UPPER(СпрН.descr))
	//|			LIKE _______________________________________________')
	//|		   AND (СпрН.IsFolder = 2)
	//|		   AND (СпрН.IsMark = '')
	|LEFT JOIN (
	|           SELECT
	|				ИтогиПартии.SP279 AS ТоварID,
	|				SUM(ИтогиПартии.SP285) AS ИтОстаток,
	|				SUM(ИтогиПартии.SP286) AS ИтСтоимость,
	|				SUM(ИтогиПартии.SP288) AS ИтНДС
	|			FROM
	|				$РегистрИтоги.ПартииТоваров AS ИтогиПартии
	|			WHERE
	|				DTOS(ИтогиПартии.period)+$ИтогиПартии.Товар
	|				LIKE  (DTOS(:НачПериод~~)+'_________')
	|           GROUP BY
	|				ИтогиПартии.SP279
	|			) AS ИтогиПартииТоваров
	|			ON ИтогиПартииТоваров.ТоварID = СпрН.ID
	|WHERE
	|	UPPER(СпрАналоги.sp3058)+UPPER(СпрАналоги.code)
	|	LIKE (:Артикул+'__________')
	|	AND СпрАналоги.IsMark = ''
	|";                                                              

	вр1 = _GetPerformanceCounter();
	База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
	Рез = База.Соединение(Соединение);
    Если Рез=0 Тогда
        Сообщить("Подключение к БД не выполнено!", "!");
    КонецЕсли;
    

	Запрос = База.СоздатьКоманду();
    Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

    Запрос = База.СоздатьКоманду();
	Запрос.Отладка(1);
	Запрос.УстановитьТекстовыйПараметр("Артикул", ВРЕГ(СтрокаПоиска));
	мд = СоздатьОбъект("MetaDataWork");
	уТА()));
	ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
    
	Запрос.Закрыть();
    Запрос = 0;
    База.Закрыть();
    База = 0;
    вр2 = _GetPerformanceCounter();
    Сообщить("Время " + Строка(вр2 - вр1) + "мск.");
 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #32 - 05. Июля 2012 :: 11:44
Печать  
блин..
нафига вот так писать в тексте запроса ?
СпрН.sp3163

  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #33 - 05. Июля 2012 :: 11:46
Печать  
Щас переделаю
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Возможно ли оптимизировать запрос к dbf
Ответ #34 - 05. Июля 2012 :: 11:54
Печать  
Проверяешь потом в обработке от kiruha ?
по-отдельности, вот такой запрос тоже не "подбирает индекс" ?
Код
Выбрать все
|SELECT
|	СпрН.ID AS [Ссылка $Справочник.Номенклатура]
|FROM
|	$Справочник.Аналоги AS СпрАналоги
|LEFT JOIN 	$Справочник.Номенклатура AS СпрН
|		ON (СпрН.parentid+STR(СпрН.IsFolder,1)+UPPER($СпрН.КодАналогов)+UPPER(СпрН.descr)
|			LIKE ('_________'+'2'+UPPER($СпрАналоги.КодАналогов)+'%'))
|		   AND (СпрН.IsMark = '') 

  
Наверх
 
IP записан
 
Marten
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 44
Зарегистрирован: 02. Июля 2012
Re: Возможно ли оптимизировать запрос к dbf
Ответ #35 - 05. Июля 2012 :: 11:56
Печать  
Да индексы проверяю

Всегда так:

Использование индекс тэг Idd для оптимизации по технологии Rushmore таблица спрн
Уровень оптимизации Rushmore для таблица спрн: частичная


Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|	DISTINCT $СпрАналоги.КодАналогов                      AS КодАналогов,
	|	СпрН.ID                                               AS [Ссылка $Справочник.Номенклатура],
	|	СпрН.descr                                            AS Наименование,
	|	ИтогиПартииТоваров.ИтОстаток                          AS Остаток,
	|	CAST(ИтогиПартииТоваров.ИтСтоимость AS NUMERIC(15,2)) AS Стоимость,
	|	CAST(ИтогиПартииТоваров.ИтНДС AS NUMERIC(15,2))       AS НДС
	|FROM
	|	$Справочник.Аналоги AS СпрАналоги
	|LEFT JOIN 	$Справочник.Номенклатура AS СпрН
	|		ON СпрН.parentid+STR(СпрН.IsFolder,1)+UPPER($СпрН.КодАналогов)+UPPER(СпрН.descr)
	|			LIKE _____________________________________________________________________')
	|		   AND (СпрН.IsMark = '')
	//|		ON (UPPER($СпрН.КодАналогов)+UPPER(СпрН.descr))
	//|			LIKE _____________________________________________________')
	//|		   AND (СпрН.IsFolder = 2)
	//|		   AND (СпрН.IsMark = '')
	|LEFT JOIN (
	|           SELECT
	|				$ИтогиПартии.Товар AS ТоварID,
	|				SUM($ИтогиПартии.ОстатокТовара) AS ИтОстаток,
	|				SUM($ИтогиПартии.Стоимость) AS ИтСтоимость,
	|				SUM($ИтогиПартии.НДС) AS ИтНДС
	|			FROM
	|				$РегистрИтоги.ПартииТоваров AS ИтогиПартии
	|			WHERE
	|				DTOS(ИтогиПартии.period)+$ИтогиПартии.Товар
	|				LIKE  (DTOS(:НачПериод~~)+'_________')
	|           GROUP BY
	|				$ИтогиПартии.Товар
	|			) AS ИтогиПартииТоваров
	|			ON ИтогиПартииТоваров.ТоварID = СпрН.ID
	|WHERE
	|	UPPER($СпрАналоги.Артикул)+UPPER(СпрАналоги.code)
	|	LIKE (:Артикул+'__________')
	|	AND СпрАналоги.IsMark = ''
	|";                                                              

	вр1 = _GetPerformanceCounter();
	База = СоздатьОбъект("OLEDBData");
	Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE";
	Рез = База.Соединение(Соединение);
    Если Рез=0 Тогда
        Сообщить("Подключение к БД не выполнено!", "!");
    КонецЕсли;
    

	Запрос = База.СоздатьКоманду();
    Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");

    Запрос = База.СоздатьКоманду();
	Запрос.Отладка(1);
	Запрос.УстановитьТекстовыйПараметр("Артикул", ВРЕГ(СтрокаПоиска));
	мд = СоздатьОбъект("MetaDataWork");
	уТА()));
	ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
    
	Запрос.Закрыть();
    Запрос = 0;
    База.Закрыть();
    База = 0;
    вр2 = _GetPerformanceCounter();
    Сообщить("Время " + Строка(вр2 - вр1) + "мск.");
 


  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать