Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Foxpro/Clipper/Dbase > Оптимизировать запрос


Автор: AlexLogos 29.12.2009, 18:54
Доброго времени суток уважаемые профи. Хочу спросить у Вас совета так как я в Фоксе - "Дуб - дерево хвойное". Одним словом есть несколько таблиц в которых есть  нужные мне данные. Первые три запроса - это я формирую курсоры с промежуточными (уточняющими) данными, а последний - делаю выборку в результате которой получаю кучу строк))) Так вот вопрос в том что в таблице txt находиться 1.5 млн записей - выборка идет несколько минут. Как можна ускорить этот процес?
Код

SELECT txt.ni,txt.d_d FROM txt,words,ss WHERE txt.ni=ss.ni AND txt.d_d>=d2 AND txt.d_d<=d1 AND txt.tva like ALLTRIM(words.word) GROUP BY txt.ni,txt.d_d ORDER BY txt.ni INTO CURSOR c1
SELECT text as l_,kod FROM class WHERE klass=20 INTO CURSOR lin
SELECT text as l_ FROM class WHERE klass=10 AND kod=0 INTO CURSOR org
SELECT ss.ni,txt.tfi,txt.tdb,txt.tva,lin.l_,class.text,class.link1,ss.ss_,txt.d_d,txt.d_t FROM ss,txt,class,c1,lin WHERE txt.ni=ss.ni AND  txt.ni=c1.ni AND (class.kod=VAL(ALLTRIM(ss.sh_)) AND class.klass=10) AND VAL(ALLTRIM(ss.sb_))=lin.kod AND txt.d_d=c1.d_d ORDER BY ss.ni,txt.tdb,txt.tfi INTO CURSOR c2


 И еще - можно ли при выборке провести какие-либо действия с данными своей процедурой? Ну например написать

Код

SELECT MyProc(txt.ni) from txt

Автор: Cashey 30.12.2009, 12:04
посмотрите что возвратит SYS(3054)

Автор: AlexLogos 30.12.2009, 13:00
? SYS(3054) возвращает 0. А что это за функция? Возвращает системное значение чего?(если я правильно понял)

Автор: Данкинг 30.12.2009, 14:30
Цитата(AlexLogos @  30.12.2009,  13:00 Найти цитируемый пост)
А что это за функция?

В справке по фоксу найди. Возвращает уровень оптимизации.


Автор: AlexLogos 30.12.2009, 15:00
А как его повысить?

Автор: Данкинг 30.12.2009, 16:49
Цитата(AlexLogos @  29.12.2009,  18:54 Найти цитируемый пост)
И еще - можно ли при выборке провести какие-либо действия с данными своей процедурой?

Можно, т.е.
Код

select myproc(pole) from dbf()


Цитата(AlexLogos @  30.12.2009,  15:00 Найти цитируемый пост)
А как его повысить? 

Снова-таки, посмотри справку (set rushmore...): я в это не вникал особо, так как не было необходимости.

Автор: AlexLogos 30.12.2009, 16:53
Спасибо посмотрю.

Автор: Cashey 31.12.2009, 09:32
Цитата(AlexLogos @  30.12.2009,  14:00 Найти цитируемый пост)
 SYS(3054) возвращает 0

функцию запускать надо сразу после отработки запроса

Добавлено через 2 минуты и 44 секунды
Цитата(AlexLogos @  30.12.2009,  16:00 Найти цитируемый пост)
А как его повысить?

исключи декартово произведение из запроса (если оно есть), сделай индексы по ключевым полям, бинарный индекс на deleted

Автор: AlexLogos 31.12.2009, 10:20
Цитата

Цитата(AlexLogos @  30.12.2009,  14:00 )
 SYS(3054) возвращает 0


функцию запускать надо сразу после отработки запроса


так и делаю.

Цитата

бинарный индекс на deleted


это как?

Автор: Cashey 11.1.2010, 09:20
Цитата(AlexLogos @  31.12.2009,  11:20 Найти цитируемый пост)
Цитатабинарный индекс на deletedэто как?

Код
INDEX on DELETED() TAG deleted BINARY

Автор: gorev 5.2.2010, 17:57
Цитата

SELECT txt.ni,txt.d_d FROM txt,words,ss WHERE txt.ni=ss.ni AND txt.d_d>=d2 AND txt.d_d<=d1 AND txt.tva like ALLTRIM(words.word) GROUP BY txt.ni,txt.d_d ORDER BY txt.ni INTO CURSOR c1


упростить запрос, для этого разбить запрос на три части: 
1. txt.d_d>=d2 AND txt.d_d<=d1
2. txt.ni=ss.ni
3. txt.tva like ALLTRIM(words.word)

чем меньше результат первого по количеству записей, тем быстрее отработает следующий!

создать индекс по используемым полям d_d, ni, tva!

Автор: AlexLogos 16.3.2010, 18:14
Спасибо, товарищи, указали на некоторые особенности работы!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)