Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос и сократить время его выполнения / 10 сообщений из 10, страница 1 из 1
02.02.2005, 14:12
    #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
02.02.2005, 14:28
    #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
02.02.2005, 14:45
    #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
02.02.2005, 14:57
    #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
02.02.2005, 15:07
    #32897293
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос и сократить время его выполнения
Владимир, в упор не вижу условия объединения. :( Вижу подзапрос - в подзапросе еще одно обращение к v_crcash, но зачем она фигурирует также и во FROM внешнего запроса?!
...
Рейтинг: 0 / 0
02.02.2005, 15:28
    #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
02.02.2005, 15:44
    #32897378
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос и сократить время его выполнения
Ну так того, что там OR, вполне достаточно, чтобы началось декартово произведение ;-)))
...
Рейтинг: 0 / 0
02.02.2005, 15:47
    #32897385
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос и сократить время его выполнения
2Юля:
ВладимирМ показал, как надо.
...
Рейтинг: 0 / 0
03.02.2005, 06:13
    #32898263
Yuliya_g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос и сократить время его выполнения
ВладимирМ,
inner join не понимает
я работаю в VFP3.0,
в нём интересно будут работать условия объединения??
...
Рейтинг: 0 / 0
03.02.2005, 06:26
    #32898268
Yuliya_g
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос и сократить время его выполнения
Всё разобралась,
Всем спасибо, а особенно Владимиру СПАСИБОЧКИ!!
Всё работает!!!!!!!
Сколького же ещё я не знаю и не умею,
сколькому ещё предстоит научиться...

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


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