Переключение на Главную Страницу Страницы: 1 2 [3]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Тема Использование индексов (ДБФ) часть 2. (число прочтений - 26181 )
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #30 - 09. Ноября 2007 :: 15:39
Печать  
Полезный проект http://fox.wikis.com/wc.dll?Wiki~FoxProWiki
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #31 - 11. Февраля 2008 :: 11:44
Печать  
Часть 3.
При использовании индексов Fox осталась последняя проблема -
соединение нескольких таблиц по индексу.

Например, в результате подзапроса выбрали документы расходные накладные,
и хотелось бы присоединить их табличные части.

У Таблицы "Документ (Мн.ч.) РасходнаяНакладная" , как и у всех таблиц табличных частей
есть индекс
Цитата:
I=IDLINE   |of IDDOC+LineN

или в терминологии Fox
Код
Выбрать все
iddoc+STR(lineno,4) 



Так как значение поля lineno неизвестно - соединиться с использованием индекса не удастся.
Особенно важно это для регистров , где таблица движений имеет индекс
Цитата:
iddoc+STR(lineno,4)+STR(actno,6)


К счастью Fox позволяет выполнять соединение по части строк.
Но чтобы такое соединение заработало нужно выполнить код
Код
Выбрать все
ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
ОлеДБКоманда.Выполнить("EXECSCRIPT('SET ANSI OFF')"); 


Наиболее подходящим местом которой - после создания объекта OLEDBData

Описание команды :
Цитата:
SET ANSI ON | OFF

Параметры
ON

Короткие символьные строки дополняются справа пробелами или нуль-символами (0) для уравнивания их с более длинными символьными строками или выражениями. Когда SET ANSI установлено в ON,  обе сравниваемые символьные строки должны иметь одинаковую длину.

OFF

(По-умолчанию) Определяет, что короткие символьные строки не дополняются справа пробелами или нуль-символами (0) в целях уравнивания длин сравниваемых строк. Когда SET ANSI установлено в OFF,  две символьные строки сравниваются символ за символом по достижению конца короткой строки.

Т.е. это нужно учесть, если есть запросы, где могут использоваться поля разной длины
(для выборок полей это невозможно) Если в запросе вдруг понадобится все таки использовать полное
сравнение достаточно вместо "=" писать "==" (двойное сравнение)

После этого легко соединяться по индексу, для этого в левой части
выражения соединения (после ON) должно идти полное выражение индекса, а справа -
выражение по которому соединяемся

Пример
Код
Выбрать все
|SELECT  
|   ДокРасходнаяНакладная.Iddoc
|  ,$ТаблЧастьРасходнаяНакладная.Товар
|
| FROM
|
| $Документ.РасходнаяНакладная as ДокРасходнаяНакладная  
|    
| LEFT JOIN  $ДокументСтроки.РасходнаяНакладная as ТаблЧастьРасходнаяНакладная  
|  ON асходнаяНакладная.Iddoc
|
|  	WHERE ДокРасходнаяНакладная.iddoc =:ВыбРасход
|
// Используется 2 индекса
// 1. в секции Where - iddoc в таблице журнала
// 2. в секции JOIN - iddoc+STR(lineno,4) индекс таблицы ДокументСтроки.РасходнаяНакладная
  



Итого : время выполнения  0.002с

В секции JOIN есть строка Цитата:
ТаблЧастьРасходнаяНакладная.iddoc+STR(ТаблЧастьРасходнаяНакладная.lineno,4) = ДокРасходнаяНакладная.Iddoc

(Здесь плюсы - строковое сложение)
Т.к. стоит установка ANSI OFF то левое выражение будет обрезано до размера правого выражения ,
т.е. до ТаблЧастьРасходнаяНакладная.iddoc. Таким образом, это условие полностью эквивалентно -
Цитата:
ТаблЧастьРасходнаяНакладная.iddoc=ДокРасходнаяНакладная.Iddoc
, а дополнение после "+" пишется только для того, чтобы Fox понял что нужно использовать индекс.

При
Код
Выбрать все
|LEFT JOIN  $ДокументСтроки.РасходнаяНакладная as ТаблЧастьРасходнаяНакладная  
|	  ON ТаблЧастьРасходнаяНакладная.iddoc=ДокРасходнаяНакладная.Iddoc 



Время выполнения 0.129с
Разница 50 раз. При многопользовательском режиме еще больше.

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


Можно проверить - оптимизирован ли Ваш запрос для выполнения vfpoledb.
Для этого получаем текстовый вид запроса для Fox : Цитата:
глМД = СоздатьОбъект("MetaDataWork");
ТекстЗапросаДляFoxPro=глМД.ОбрМетаСКЛ(ТекстЗапроса);

Выполняем. Если запрос оптимизирован в отдельном окне будет написано Rushmore optimization FULL
или соотвественно NONE
« Последняя редакция: 20. Марта 2008 :: 14:19 - kiruha »  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #32 - 11. Апреля 2008 :: 17:37
Печать  
Содержимое данного сообщения было перенесено СЮДА.
  
Наверх
www  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #33 - 18. Августа 2009 :: 03:45
Печать  
kiruha писал(а) 11. Февраля 2008 :: 11:44:
Выполняем. Если запрос оптимизирован в отдельном окне будет написано Rushmore optimization FULL
или соотвественно NONE

А можно подробнее, где именно это будет написано. Попробовал - результат рабоыт метапарсера вижу, а вот про оптимизацию ни слова ...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #34 - 18. Августа 2009 :: 04:36
Печать  
Dmitry The Wing писал(а) 18. Августа 2009 :: 03:45:
kiruha писал(а) 11. Февраля 2008 :: 11:44:
Выполняем. Если запрос оптимизирован в отдельном окне будет написано Rushmore optimization FULL
или соотвественно NONE

А можно подробнее, где именно это будет написано. Попробовал - результат рабоыт метапарсера вижу, а вот про оптимизацию ни слова ...

Заводи новую тему!
Эта ветка только для FAQ.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
mrs68
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 18. Апреля 2012
Re: Тема Использование индексов (ДБФ) часть 2.
Ответ #35 - 18. Апреля 2012 :: 03:09
Печать  
   Люди добрые! Подскажите пож-та. При открытии базы под FoxPro появилась ошибка "The 'VFPOLEDB.1' provider is not registered on the local machine". Скажите, как регистрировать данный dll?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 
ОтправитьПечать