Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема медленно работает через oledb (число прочтений - 2930 )
Serge
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Местоположение: Moscow
Зарегистрирован: 20. Декабря 2011
Пол: Мужской
медленно работает через oledb
18. Июля 2013 :: 14:16
Печать  
есть запрос для выборки подчиненных доков:

Код
Выбрать все
SELECT
	doc.CHILDID as [Документ $Документ],
	j.IDDOCDEF as [Документ_вид],
	DTOS(j.DATE)+j.TIME+j.IDDOC  as Ind
from
	1SJOURN j
INNER JOIN
	1SCRDOC doc ON doc.CHILDID = j.IDDOC
where
	doc.PARENTVAL = :Док*
	AND doc.MDID = '   0'
	AND DTOS(j.DATE)+j.TIME+j.IDDOC BETWEEN (DTOS(:ДатаНач~~)+'		   ') AND (DTOS(:ДатаКон~~)+'ZZZZZZZZZZZZZZZ')
ORDER BY
	Ind 



и выполняется он жутко медленно,
без использования индексов в where запрос выполнялся почти 1 сек, после добавления индексов почти в 3 раза быстрее

проц не древний G620, винда 7, установлен OLE DB Provider for Visual FoxPro 9.0 SP2

размеры файлов:
1SJOURN - 50 Мб
1SCRDOC - 65 Мб

база DBF

что можно сделать чтоб запрос летал? Улыбка
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: медленно работает через oledb
Ответ #1 - 18. Июля 2013 :: 15:24
Печать  
А строка подключения какая?
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: медленно работает через oledb
Ответ #2 - 18. Июля 2013 :: 15:27
Печать  
+ еще в зависимости от периода выборки эффективность меняется
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: медленно работает через oledb
Ответ #3 - 19. Июля 2013 :: 04:49
Печать  
Дык ты не задействуешь индекс, никакой.
Тебе нужно использовать индекс I=PARENT в тексте запроса
  
Наверх
 
IP записан
 
Serge
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Местоположение: Moscow
Зарегистрирован: 20. Декабря 2011
Пол: Мужской
Re: медленно работает через oledb
Ответ #4 - 19. Июля 2013 :: 07:02
Печать  
Salimbek писал(а) 18. Июля 2013 :: 15:24:
А строка подключения какая?

Код
Выбрать все
База_ = СоздатьОбъект("OLEDBData");
Соединение_ = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN=""";
Рез_ = База_.Соединение(Соединение_);
RS = База_.СоздатьКоманду(); 



Цитата:
+ еще в зависимости от периода выборки эффективность меняется

ставил весь период, но все равно 1 секунда это ну очень долго
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



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



дальше смотри #3
  
Наверх
 
IP записан
 
Serge
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Местоположение: Moscow
Зарегистрирован: 20. Декабря 2011
Пол: Мужской
Re: медленно работает через oledb
Ответ #6 - 19. Июля 2013 :: 08:16
Печать  
Eprst писал(а) 19. Июля 2013 :: 04:49:
Дык ты не задействуешь индекс, никакой.
Тебе нужно использовать индекс I=PARENT в тексте запроса

Заменил на
Код
Выбрать все
doc.MDID+doc.PARENTVAL+DTOS(doc.CHILDDATE)+doc.CHILDTIME+doc.CHILDID
		BETWEEN ('   0'+:Док*+DTOS(:ДатаНач~~)+'		   ')
		AND ('   0'+:Док*+DTOS(:ДатаКон~~)+'ZZZZZZZZZZZZZZZ') 


и все заработало
большое спасибо, не заметил этот индекс почемуто
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать