powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос и сократить время его выполнения
10 сообщений из 10, страница 1 из 1
Как оптимизировать запрос и сократить время его выполнения
    #32897094
Yuliya_g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток всем!
Подскажите плиз, есть такой запрос:
Select distinct v_crinvoice.id_n, v_crinvoice.numb_in, v_crinvoice.date_in,;
v_crinvoice.lname, v_crinvoice.custname, v_crinvoice.address,;
v_crinvoice.cashdate, v_crinvoice.amount, v_crinvoice.d_amount;
From v_crinvoice, v_crcash;
Where (LEFT(alltrim(v_crinvoice.vsrcode),2)='MS') and;
(v_crinvoice.numb_in not in (Select v_crcash.numb_in From v_crcash;
Where LEFT(alltrim(v_crcash.vsrcode),2)='MS')) or;
((v_crinvoice.numb_in = v_crcash.numb_in and;
LEFT(alltrim(v_crcash.vsrcode),2)='MS' and;
left(v_crinvoice.id_n,2) # left(v_crcash.id_n,2)));
Into cursor 'Temp_Itog'

Выполняется он около 17 минут при том, что компьютер у меня не самый слабый. Результат запроса верный
Помогите, может кто знает как можно его оптимизировать.
Заранее благодарна.

С уважением, Юля.
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32897161
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
Where (LEFT(alltrim(v_crinvoice.vsrcode), 2 )='MS') and;
(v_crinvoice.numb_in not in (Select v_crcash.numb_in From v_crcash;
Where LEFT(alltrim(v_crcash.vsrcode), 2 )='MS')) or;
((v_crinvoice.numb_in = v_crcash.numb_in and;
LEFT(alltrim(v_crcash.vsrcode), 2 )='MS' and;
left(v_crinvoice.id_n, 2 ) # left(v_crcash.id_n, 2 )))

Нужны соответствующие индексы

LEFT(alltrim(v_crinvoice.vsrcode),2)
v_crinvoice.numb_in
v_crcash.numb_in
LEFT(alltrim(v_crcash.vsrcode),2)
left(v_crinvoice.id_n,2)
left(v_crcash.id_n,2)

а также см.
SET EXACT
SET ANSI

и посмотри пример ниже

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE CURSOR test (cChar c ( 20 ))

INDEX ON LEFT(ALLTRIM(cChar), 2 ) TAG cChar

INSERT INTO test (cchar) values('aMSa')
INSERT INTO test (cchar) values('MSab')
INSERT INTO test (cchar) values('aMSb')

SYS( 3054 , 2 )
SELECT * FROM test WHERE LEFT(ALLTRIM(cChar), 2 ) == "MS"  
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32897237
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юля,
ты уверена, что надо
Код: plaintext
1.
2.
select distinct v_crinvoice.??? ;
from v_crinvoice, v_crcash ;
where {нет условия объединения v_crinvoice и v_crcash}
, а не
Код: plaintext
1.
2.
select v_crinvoice.??? ;
from v_crinvoice ;
where {нет условия объединения v_crinvoice и v_crcash}
?
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32897273
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у нее условие объединения. Просто сам запрос "слепо" написан. Может имеет смысл сделать 2 последовательных запроса. Как-то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Select distinct ;
	v_crinvoice.id_n, ;
	v_crinvoice.numb_in, ;
	v_crinvoice.date_in, ; 
	v_crinvoice.lname, ;
	v_crinvoice.custname, ;
	v_crinvoice.address, ; 
	v_crinvoice.cashdate, ;
	v_crinvoice.amount, ;
	v_crinvoice.d_amount, ;
	LEFT(v_crcash.id_n, 2 ) as id_n2 ;
From v_crinvoice ;
LEFT JOIN v_crcash ON v_crinvoice.numb_in = v_crcash.numb_in ;
		AND LEFT(alltrim(v_crcash.vsrcode), 2 )='MS' ;
Into cursor Temp_Itog

А вторым запросом отобрать только записи у которых

Код: plaintext
WHERE NVL(Temp_Itog.id_n2,space( 2 )) # Temp_Itog.id_n 
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32897293
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир, в упор не вижу условия объединения. :( Вижу подзапрос - в подзапросе еще одно обращение к v_crcash, но зачем она фигурирует также и во FROM внешнего запроса?!
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32897343
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот исходный запрос в "адаптированном" виде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Select distinct ;
	v_crinvoice.id_n, ;
	v_crinvoice.numb_in, ;
	v_crinvoice.date_in, ; 
	v_crinvoice.lname, ;
	v_crinvoice.custname, ;
	v_crinvoice.address, ; 
	v_crinvoice.cashdate, ;
	v_crinvoice.amount, ;
	v_crinvoice.d_amount ;
From v_crinvoice, v_crcash ;
Where ;
	(LEFT(alltrim(v_crinvoice.vsrcode), 2 )='MS') ;
	AND (v_crinvoice.numb_in not in (Select v_crcash.numb_in From v_crcash ;
					Where LEFT(alltrim(v_crcash.vsrcode), 2 )='MS')) ;
	OR ;
	((v_crinvoice.numb_in = v_crcash.numb_in ;
		AND LEFT(alltrim(v_crcash.vsrcode), 2 )='MS' ;
		AND LEFT(v_crinvoice.id_n, 2 ) # LEFT(v_crcash.id_n, 2 ))) ; 
Into cursor 'Temp_Itog'

Тут действительно есть лишняя часть, но в таком виде выбросить вторую таблицу нельзя. Объединение идет после OR. По сути, надо выполнить 2 последовательных запроса. Если разделить "в лоб" то получим:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Select ;
	v_crinvoice.id_n, ;
	v_crinvoice.numb_in, ;
	v_crinvoice.date_in, ; 
	v_crinvoice.lname, ;
	v_crinvoice.custname, ;
	v_crinvoice.address, ; 
	v_crinvoice.cashdate, ;
	v_crinvoice.amount, ;
	v_crinvoice.d_amount ;
From v_crinvoice ;
Where ;
	(LEFT(alltrim(v_crinvoice.vsrcode), 2 )='MS') ;
	AND (v_crinvoice.numb_in NOT IN (Select v_crcash.numb_in From v_crcash ;
					Where LEFT(alltrim(v_crcash.vsrcode), 2 )='MS')) ;
UNION ;
Select ;
	v_crinvoice.id_n, ;
	v_crinvoice.numb_in, ;
	v_crinvoice.date_in, ; 
	v_crinvoice.lname, ;
	v_crinvoice.custname, ;
	v_crinvoice.address, ; 
	v_crinvoice.cashdate, ;
	v_crinvoice.amount, ;
	v_crinvoice.d_amount ;
From v_crinvoice ;
INNER JOIN v_crcash ON v_crinvoice.numb_in = v_crcash.numb_in ;
		AND LEFT(alltrim(v_crcash.vsrcode), 2 )='MS' ;
		AND LEFT(v_crinvoice.id_n, 2 ) # LEFT(v_crcash.id_n, 2 )) ;
Into cursor Temp_Itog
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32897378
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так того, что там OR, вполне достаточно, чтобы началось декартово произведение ;-)))
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32897385
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Юля:
ВладимирМ показал, как надо.
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32898263
Yuliya_g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,
inner join не понимает
я работаю в VFP3.0,
в нём интересно будут работать условия объединения??
...
Рейтинг: 0 / 0
Как оптимизировать запрос и сократить время его выполнения
    #32898268
Yuliya_g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё разобралась,
Всем спасибо, а особенно Владимиру СПАСИБОЧКИ!!
Всё работает!!!!!!!
Сколького же ещё я не знаю и не умею,
сколькому ещё предстоит научиться...

С уважением, Юля.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос и сократить время его выполнения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]