Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Провайдер OLE DB от VFP SP2 (число прочтений - 21045 )
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #15 - 05. Ноября 2007 :: 03:01
Печать  
Uzhast писал(а) 05. Ноября 2007 :: 02:35:
Эээ... В смысле, при использовании GOTO и SKIP Улыбка

Видимо в справке не всё написано Печаль, попробовал в самом фоксе тоже самое. Видимо применять это можно только для:

Note: 
When using SET FILTER to filter data in a grid, use the SET KEY command to increase grid performance.


Вот это не пойдёт?


SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
   [Commands]
   [LOOP]
   [EXIT]
ENDSCAN

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #16 - 05. Ноября 2007 :: 21:14
Печать  
Nick писал(а) 05. Ноября 2007 :: 03:01:
Uzhast писал(а) 05. Ноября 2007 :: 02:35:
Эээ... В смысле, при использовании GOTO и SKIP Улыбка

Видимо в справке не всё написано Печаль, попробовал в самом фоксе тоже самое.

Вообще, странно, конечно Улыбка На форумах по фокспру так бодро советуют, как его использовать Улыбка (Вроде, даже нашего Вадимко там видел Улыбка ) Типа, ставим фильтр, потом достаточно переместить куда-нибудь текущий указатель (например, GO TOP) и все - фильтр работает. А я в prg все так и делал - эффекта 0. Вот и подумал, что это просто косяки OLE DB-провайдера. А, может, я его просто не так готовлю?  Круглые глаза


Nick писал(а) 05. Ноября 2007 :: 03:01:
Видимо применять это можно только для:

Note:  
When using SET FILTER to filter data in a grid, use the SET KEY command to increase grid performance.

Точнее, в этой цитате просто говорится, что для гридов более подходящим будет использование SET KEY, потому что SET KEY работает исключительно на индексах. А SET FILTER может фильтровать не только по индексному выражению, но и по любому другому. Что в общем случае может быть медленным. Однако, если выражение фильтра попадает в индекс, то, по идее, SET FILTER по производительности не должен отличаться от SET KEY. Как на самом деле обстоят дела - не знаю. Да и в любом случае SET KEY не работает тоже Подмигивание


Nick писал(а) 05. Ноября 2007 :: 03:01:
Вот это не пойдёт?


SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
  [Commands]
  [LOOP]
  [EXIT]
ENDSCAN


Аж ностальгия прошибла  Очень довольный Я когда-то ведь знал про эту хреновину и даже использовал. А сейчас забыл все нахрен. Сейчас у меня используется некая рукопашная реализация SCAN. Не знаю, будет ли положительный эффект от перехода на явный SCAN?...
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #17 - 06. Ноября 2007 :: 02:31
Печать  
Ну по крайней мере написано что это как то оптимизируется:

FOR lExpression1

Executes commands only for records for which lExpression1 evaluates to true (.T.). Including the FOR clause lets you filter out records you don't want scanned. Rushmore optimizes a query created with SCAN ... FOR if lExpression1 is an optimizable expression. For best performance, use an optimizable expression in the FOR clause. For more information, see SET OPTIMIZE and Using Rushmore Query Optimization to Speed Data Access.

Улыбка
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #18 - 06. Ноября 2007 :: 03:35
Печать  
Nick писал(а) 06. Ноября 2007 :: 02:31:
Ну по крайней мере написано что это как то оптимизируется:

FOR lExpression1

Executes commands only for records for which lExpression1 evaluates to true (.T.). Including the FOR clause lets you filter out records you don't want scanned. Rushmore optimizes a query created with SCAN ... FOR if lExpression1 is an optimizable expression. For best performance, use an optimizable expression in the FOR clause. For more information, see SET OPTIMIZE and Using Rushmore Query Optimization to Speed Data Access.

Улыбка

Ага, фактически SCAN FOR может сделать SEEK вместо меня, если выражение попадает в индекс. Хм. Наверное, это все же медленнее, чем сделать SEEK напрямую... С другой стороны SCAN FOR позволяет использовать выражения. Сейчас у меня в провайдере для фильтров нужно указывать сырое индексное выражение (например "  1S20071101"). А со SCAN FOR появится возможность указывать что-то вроде такого: IDJournal + DTOS (Date) >= $ЖурналДокументов.Банковские + DTOS (:ДатаНачала~~). Смотрится вроде как лучше Улыбка Надо будет проверить на скорость  Круглые глаза
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #19 - 06. Ноября 2007 :: 03:38
Печать  
А если он еще сможет нормально соптимизировать такое условие, то совсем хорошо будет:

IDJournal = $ЖурналДокументов.Банковские AND DTOS (Date) >=  DTOS (:ДатаНачала~~)
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #20 - 06. Ноября 2007 :: 05:42
Печать  
Неа, не делает SCAN FOR никаких сиков Улыбка
Такой код
Код
Выбрать все
	SCAN FOR DTOS (Date) = '20071026'
		RETURN IDDocDef + IDDoc + DocNo + DTOS (Date)
	ENDSCAN 


Отрабатывает за 300-350 мс.

А такой:
Код
Выбрать все
	IF SEEK ('20071026')
		RETURN IDDocDef + IDDoc + DocNo + DTOS (Date)
	ENDIF 


За 30-40 мс.

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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #21 - 06. Ноября 2007 :: 06:09
Печать  
Нет делает, добавил индекс по полю  Date, вот этот код даёт одинаковые результаты:

dd = SECONDS()
SET CENTURY on

d = CTOD('16/08/2007')
FOR i = 1 TO 10000
SCAN FOR Date = d
ENDSCAN
NEXT i
?SECONDS() - dd


dd = SECONDS()
FOR i = 1 TO 10000
     SEEK (d)
NEXT i            
?SECONDS() - dd
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #22 - 06. Ноября 2007 :: 06:12
Печать  
Nick писал(а) 06. Ноября 2007 :: 06:09:
Нет делает, добавил индекс по полю  Date, вот этот код даёт одинаковые результаты:

dd = SECONDS()
SET CENTURY on

d = CTOD('16/08/2007')
FOR i = 1 TO 10000
SCAN FOR Date = d
ENDSCAN
NEXT i
?SECONDS() - dd


dd = SECONDS()
FOR i = 1 TO 10000
     SEEK (d)
NEXT i            
?SECONDS() - dd


Хотя если поставить SET TALK OFF то всё возвращается на место - раз в 15 медленее Печаль, или эта установка просто на scan не действует
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #23 - 06. Ноября 2007 :: 06:20
Печать  
Nick писал(а) 06. Ноября 2007 :: 06:12:
Хотя если поставить SET TALK OFF то всё возвращается на место - раз в 15 медленее Печаль, или эта установка просто на scan не действует

Стоп. Ты где тестишь? В нормальном Фокспре что ли? Если так, то провайдер для OLE DB и Фокс - две большие разницы, как выясняется.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #24 - 06. Ноября 2007 :: 06:22
Печать  
Поэтому результаты для Фокспра могут быть не применимы в OLE DB.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #25 - 06. Ноября 2007 :: 06:25
Печать  
Uzhast писал(а) 06. Ноября 2007 :: 06:20:
Nick писал(а) 06. Ноября 2007 :: 06:12:
Хотя если поставить SET TALK OFF то всё возвращается на место - раз в 15 медленее Печаль, или эта установка просто на scan не действует

Стоп. Ты где тестишь? В нормальном Фокспре что ли? Если так, то провайдер для OLE DB и Фокс - две большие разницы, как выясняется.

Ну да в фокспре.
На основании чего это выясняется? Я думаю что OLE DB использует те же run time библиотеки что и фокс
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #26 - 06. Ноября 2007 :: 06:28
Печать  
Nick писал(а) 06. Ноября 2007 :: 06:25:
На основании чего это выясняется? Я думаю что OLE DB использует те же run time библиотеки что и фокс

На основании документации и, в частности, списка неподдерживаемых команд в OLE DB Улыбка
Так же вывод можно сделать на том факте, что не поддерживаются SET FILTER и SET KEY, хотя, по отзывам, многие нормально используют эти команды в нормальном фокспре.

OLE DB провайдер для VFP не использует НИКАКИХ внешних библиотек, кроме стандартных виндовых. Смотри "Dependency Walker"ом
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #27 - 06. Ноября 2007 :: 06:30
Печать  
Uzhast писал(а) 06. Ноября 2007 :: 06:28:
Nick писал(а) 06. Ноября 2007 :: 06:25:
На основании чего это выясняется? Я думаю что OLE DB использует те же run time библиотеки что и фокс

На основании документации и, в частности, списка неподдерживаемых команд в OLE DB Улыбка
Так же вывод можно сделать на том факте, что не поддерживаются SET FILTER и SET KEY, хотя, по отзывам, многие нормально используют эти команды в нормальном фокспре.

OLE DB провайдер для VFP не использует НИКАКИХ внешних библиотек, кроме стандартных виндовых. Смотри "Dependency Walker"ом


Про SET FILTER и SET KEY я тебе писал что пробовал в фокспре там они тоже не работают как ты хочешь, а гридки фильтруют!
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #28 - 06. Ноября 2007 :: 06:32
Печать  
Nick писал(а) 06. Ноября 2007 :: 06:30:
Про SET FILTER и SET KEY я тебе писал что пробовал в фокспре там они тоже не работают как ты хочешь, а гридки фильтруют!

А на другом форуме (sql.ru) я читал, что в самом Фоксе SET FILTER и SET KEY работают Улыбка
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Провайдер OLE DB от VFP SP2
Ответ #29 - 06. Ноября 2007 :: 06:35
Печать  
Uzhast писал(а) 06. Ноября 2007 :: 06:32:
Nick писал(а) 06. Ноября 2007 :: 06:30:
Про SET FILTER и SET KEY я тебе писал что пробовал в фокспре там они тоже не работают как ты хочешь, а гридки фильтруют!

А на другом форуме (sql.ru) я читал, что в самом Фоксе SET FILTER и SET KEY работают Улыбка


Чиво тут читать?
1. Делаю фильтр так чтоб первая запись в него не попадала
2. Делаю goto 1
3. RECNO()  = 1
!!!
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать