Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вопрос про запрос  [new]
АНТ
Member

Откуда: Москва
Сообщений: 124
Сушествуют большие таблицы...
Wplace 1000000 row
Wplace_tov 5000000 row

К ним идут запросы

Select /*+ index(w1, PKWPLACE) index(wt1, FKWHPLACE_TOV_TOVAR_KL) */max(w1.dtpodtv)
 from Wplace w1, Wplace_tov wt1
Where w1.iwplaceid = wt1.iwplaceid 
  and w1.iklientid in
(select /*+ index(kte, FKKLIENTTYPEEXT_METROGROUP) */ kte.iklientid from KlientTypeExt kte
 Where kte.iMetroGroupID = &p_iMetroGroupID) 
  and wt1.itovar_klid in
(
--!!
SELECT Distinct ssi.iid
 FROM sessionsklinfo ssi
WHERE ssi.isid = &ISID
--!!
)
group by wt1.itovar_klid
Идет порядка минуты-другой

SELECT STATEMENT, GOAL = CHOOSE			18	1	71
 SORT GROUP BY			18	1	71
  NESTED LOOPS			16	1	71
   NESTED LOOPS			14	1	47
    MERGE JOIN CARTESIAN			12	1	34
     TABLE ACCESS BY INDEX ROWID	DBO	KLIENTTYPEEXT	12	242	1936
      INDEX RANGE SCAN	DBO	FKKLIENTTYPEEXT_METROGROUP	1	242	
     BUFFER SORT				1	26
      INDEX RANGE SCAN	DBO	PKSESSIONSKLINFO		1	26
    TABLE ACCESS BY INDEX ROWID	DBO	WPLACE_TOV	2	1	13
     INDEX RANGE SCAN	DBO	FKWHPLACE_TOV_TOVAR_KL	2	300	
   TABLE ACCESS BY INDEX ROWID	DBO	WPLACE	2	1	24
    INDEX UNIQUE SCAN	DBO	PKWPLACE	1	1	



Если же в этом подзапросе, выбрать заранее все записи и воткнуть в in уже константой
SELECT Distinct ssi.iid
 FROM sessionsklinfo ssi
WHERE ssi.isid = &ISID

, то все ускоряется раз в сто например:


Select /*+ index(w1, PKWPLACE) index(wt1, FKWHPLACE_TOV_TOVAR_KL) */max(w1.dtpodtv)
 from Wplace w1, Wplace_tov wt1
Where w1.iwplaceid = wt1.iwplaceid 
  and w1.ikod_type = 2
  and w1.iAfur_n = &p_iAfur_n 
  and w1.iKod_type = 2
  and w1.dtPodtv is not null
  and w1.iklientid in
(select /*+ index(kte, FKKLIENTTYPEEXT_METROGROUP) */ kte.iklientid from KlientTypeExt kte
 Where kte.iMetroGroupID = &p_iMetroGroupID) 
  and wt1.itovar_klid in
(60108,66140,40001669,40001826,40002085,40002181,40002354,40002387,40002425,40002449,40002521,40002672,40002693,40002699,40002730,40002736,40002763,40002768,40002802,40002837,40002838,40002842,40002920,40002923,40002939,40002971,40002985,40003000,40003004,40003005,40003058,40003070,40003081,40003083,40003123,40003124,40003125,40003126,40003128,80000411,80000448,80000514,80002251,80002571,80002572,80004026,80004442,80004504,80004591,80004679,80004749,80005697,80005925,80006167,80006523,80007175,80007372,80008869,80009184,80009243,80009366,80009462,80009683,80009690,80009720,80009796,80009797,80009807,80009951,80010163,80010252,80010253,80010289,80010376,80010586)
group by wt1.itovar_klid


Запрос идет секунда-другая, а иногда и менее полусекунды

SELECT STATEMENT, GOAL = CHOOSE			61886	11	495
 SORT GROUP BY			61886	11	495
  HASH JOIN			61884	11	495
   NESTED LOOPS			61871	10	370
    INLIST ITERATOR					
     TABLE ACCESS BY INDEX ROWID	DBO	WPLACE_TOV	16921	22475	292175
      INDEX RANGE SCAN	DBO	FKWHPLACE_TOV_TOVAR_KL	88	22475	
    TABLE ACCESS BY INDEX ROWID	DBO	WPLACE	2	1	24
     INDEX UNIQUE SCAN	DBO	PKWPLACE	1	1	
   TABLE ACCESS BY INDEX ROWID	DBO	KLIENTTYPEEXT	12	242	1936
    INDEX RANGE SCAN	DBO	FKKLIENTTYPEEXT_METROGROUP	1	242	


в чем загвоздка?) Чего не так...

С хинтами все правильно они ускоряют без них ваше по полчаса сервак работает...
10 окт 08, 15:04    [6291040]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про запрос  [new]
Пилот Пиркс
Member

Откуда: Москва
Сообщений: 352
раз уж так не хочется напрягать оптимизатор, тогда сделайте так
(
SELECT Distinct ssi.iid
 FROM sessionsklinfo ssi
WHERE ssi.isid = &ISID
and rownum >0
)
10 окт 08, 18:42    [6292421]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про запрос  [new]
leader
Member

Откуда:
Сообщений: 264
попробуй

Select /*+ index(w1, PKWPLACE) index(wt1, FKWHPLACE_TOV_TOVAR_KL) */max(w1.dtpodtv)
 from Wplace w1, Wplace_tov wt1,
(
--!!
SELECT Distinct ssi.iid
 FROM sessionsklinfo ssi
WHERE ssi.isid = &ISID
--!!
) ssi
Where w1.iwplaceid = wt1.iwplaceid 
  and w1.iklientid in
(select /*+ index(kte, FKKLIENTTYPEEXT_METROGROUP) */ kte.iklientid from KlientTypeExt kte
 Where kte.iMetroGroupID = &p_iMetroGroupID) 
  and wt1.itovar_klid = ssi.iid
group by wt1.itovar_klid
10 окт 08, 21:19    [6292665]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про запрос  [new]
stax..
Guest
АНТ
Сушествуют большие таблицы...
Wplace 1000000 row
Wplace_tov 5000000 row

К ним идут запросы

попробовать из хинтов поставить только first_rows

ps
(если не поможет вбивать NL)
.....
stax
10 окт 08, 21:23    [6292675]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить