07.10.2010 10:23
undos
 
запрос:

SELECT DISTINCT *
FROM (SELECT i.NAME, 'р/с: ' || bank.account || CHR (13) || i.commentary AS RS , i.ident AS ID, doc.createdat,
s.supplierdoc || CHR (13) || s.ID AS num, doc.totalsum,
(SELECT SUM (spvat.taxsum)
FROM supermag.svspecvatwi spvat
WHERE spvat.doctype = doc.doctype
AND spvat.docid = doc.ID) AS nds,
CASE
WHEN s.paymentdelay = 0
THEN sup.paymentdelay
WHEN s.paymentdelay <> 0
THEN s.paymentdelay
END AS d
FROM SMClientBanks bank,
smwaybillsin s,
smdocuments doc,
smclientinfo i,
smsuppliers sup
WHERE bank.idclient(+) = i.id
AND s.ID = doc.ID
AND doc.clientindex = i.ID
AND doc.doctype = 'WI'
AND doc.docstate = 3
AND sup.ID = i.ID
AND bank.isactual = 1
order by i.ident
)
WHERE createdat + d BETWEEN TO_DATE ('20101004', 'YYYYMMDD')
AND TO_DATE ('20101007', 'YYYYMMDD')
AND d <> 0

загружает ЦП процессом oracle.exe на 50% и выполняется не менее 20 минут, посоветуйте, что изменить в нем, чтобы увеличить производительность
07.10.2010 10:56
John Doe
 
с такими вопросами принято выкладывать план запроса.
думается, где-то фулскан валит...
07.10.2010 10:58
undos
 
------------------------------------------------------------

Statement Id=4203172 Type=
Cost=2,64018716311899E-308 TimeStamp=07-10-10::09::58:04

(1) SELECT STATEMENT CHOOSE
Est. Rows: 1 Cost: 335
(15) SORT UNIQUE
Est. Rows: 1 Cost: 335
(14) VIEW (Embedded SQL)
Est. Rows: 1 Cost: 317
(13) SORT ORDER BY
Est. Rows: 1 Cost: 317
(12) NESTED LOOPS
Est. Rows: 1 Cost: 298
(10) NESTED LOOPS
Est. Rows: 1 Cost: 237
(7) HASH JOIN
Est. Rows: 1 Cost: 236
(5) NESTED LOOPS
Est. Rows: 46 Cost: 19
(2) TABLE ACCESS FULL SUPERMAG.SMCLIENTBANKS [Analyzed]
(2) Blocks: 27 Est. Rows: 46 of 4589 Cost: 5
Tablespace: USERS
(4) TABLE ACCESS BY INDEX ROWID SUPERMAG.SMCLIENTINFO [Analyzed]
(4) Blocks: 120 Est. Rows: 4580 of 4580 Cost: 1
Tablespace: USERS
(3) UNIQUE INDEX RANGE SCAN SUPERMAG.SMCCLIENTINFO_PK [Analyzed]
Est. Rows: 4580
(6) TABLE ACCESS FULL SUPERMAG.SMDOCUMENTS [Analyzed]
(6) Blocks: 1417 Est. Rows: 114 of 125257 Cost: 216
Tablespace: USERS
(9) TABLE ACCESS BY INDEX ROWID SUPERMAG.SMSUPPLIERS [Analyzed]
(9) Blocks: 42 Est. Rows: 4462 of 4462 Cost: 1
Tablespace: USERS
(8) UNIQUE INDEX RANGE SCAN SUPERMAG.SMCSUPPLIERS_PK [Analyzed]
Est. Rows: 4462
(11) TABLE ACCESS FULL SUPERMAG.SMWAYBILLSIN [Analyzed]
(11) Blocks: 395 Est. Rows: 60932 of 60932 Cost: 61
Tablespace: USERS
07.10.2010 11:05
John Doe
 
Цитата:
WHERE createdat + d
перенеси + d в правую часть условия, как минимум
07.10.2010 11:06
undos
 
в смысле WHERE createdat BETWEEN TO_DATE ('20101004', 'YYYYMMDD') AND TO_DATE ('20101007', 'YYYYMMDD') + d ?
07.10.2010 11:08
John Doe
 
Если тебя это изменившееся условие устроит, то да.
07.10.2010 11:14
undos
 
условие такое не подходит ( надо чтобы createdat + d
07.10.2010 11:18
John Doe
 
Тогда сделай функциональный индекс что ли...
07.10.2010 11:25
Mtirt
 
наверное условие будет такое, нет?

WHERE createdat BETWEEN TO_DATE ('20101004', 'YYYYMMDD')-d AND TO_DATE ('20101007', 'YYYYMMDD') - d
Часовой пояс GMT +3, время: 16:18.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.