2012-01-24 2 views
3

меня ниже запроса:Выполнение запроса очень плохо

SELECT so1b.hasattachments, 
     so1b.sorefitem, 
     so1b.sonumber, 
     so1b.custponumber, 
     so1b.sodate, 
     so1b.ostatus, 
     so1b.osubstatus, 
     so1b.urefitem, 
     so1b.username, 
     so1b.summary, 
     so1b.purefitem 
FROM (SELECT DECODE (COUNT (ATT.SOREFITEM), 0, 0, 1) hasattachments, 
      so1.SOREFITEM, 
      SONUMBER, 
      CUSTPONUMBER, 
      SODATE, 
      so1.OSTATUS, 
      so1.OSUBSTATUS, 
      so1.urefitem AS urefitem, 
      so1.username AS username , 
      ''   AS summary , 
      so1.PUREFITEM 
     FROM ECOrders.SALESORDERS so1, 
      ECORDERS.ATTACHMENTS att, 
      ecusers.ownership o 
     WHERE att.SOREFITEM (+) =so1.SOREFITEM 
     AND so1.UREFITEM  = o.urefitem 
     AND o.uownerref   = ? 
     AND so1.sorefitem  IN 
      (SELECT ot.sorefitem 
      FROM ECOrders.ORDERITEMS ot, 
        ECUSERS.USERINFO USI 
      WHERE ot.sorefitem=so1.sorefitem 
       AND OT.OSELLERID = USI.UREFITEM (+) 
       AND UPPER(USI.USERNAME) LIKE UPPER('%Dell Computer%') ESCAPE '~' 
      ) 
     GROUP BY SO1.SOREFITEM, 
      SONUMBER, 
      CUSTPONUMBER, 
      SODATE, 
      so1.OSTATUS, 
      so1.OSUBSTATUS, 
      so1.UREFITEM, 
      so1.USERNAME, 
      so1.PUREFITEM 
     ORDER BY SOREFITEM DESC /* sort is possible on all columns */ 
    ) so1b 
WHERE rownum BETWEEN 1 AND 10 

Этот запрос выполняет очень плохо, когда данные велика. План выполнения приведен ниже:

ID PA_ID Execution Plan                  COST CARD BYTES 
0  SELECT STATEMENT Optimizer=CHOOSE              2906 10  9480 
1 0 -COUNT (STOPKEY)    
2 1 --FILTER    
3 2 ---VIEW                     2906 381  361188 
4 3 ----SORT (GROUP BY)                  2906 381  32766 
5 4 -----FILTER   
6 5 ------NESTED LOOPS (OUTER)                18  2888 248368 
7 6 -------NESTED LOOPS                  17  2888 231040 
8 7 --------TABLE ACCESS (BY INDEX ROWID) of 'ECUSERS.OWNERSHIP' (TABLE)     1  24  240 
9 8 ---------INDEX (RANGE SCAN) of 'ECUSERS.OWNERSHIP_UOWNERREF' (INDEX)     1  24 
10 7 --------TABLE ACCESS (BY INDEX ROWID) of 'ECORDERS.SALESORDERS' (TABLE)     1  121  8470 
11 10 ---------INDEX (RANGE SCAN) of 'ECORDERS.SO_UREFITEM_OSTATUS_OSUB' (INDEX)    1  76 
12 6 -------INDEX (RANGE SCAN) of 'ECORDERS.ATTACHMENTS_SOREFITEM' (INDEX)     1  1  6 
13 5 ------NESTED LOOPS 2 1 49 
14 13 -------TABLE ACCESS (BY INDEX ROWID) of 'ECORDERS.ORDERITEMS' (TABLE)     1  3  33 
15 14 --------INDEX (RANGE SCAN) of 'ECORDERS.ORDERITEMS_SOREFITEM02' (INDEX)     1  3  
16 13 -------INDEX (RANGE SCAN) of 'ECUSERS.USERINFO_I_USERNAME_UREFITEM' (INDEX (UNIQUE)) 1  1  38 
ID PA_ID Execution Plan                  COST CARD BYTES 

Есть ли способ улучшить производительность этого запроса?

+1

+1 для включения плана выполнения. –

ответ

3

я смотрел бы сделать следующее:

  1. рефакторинг к use ANSI join syntax, для здравомыслия все, кто приходит после того, как вы
  2. рефакторинга устранить необходимость подзапроса в предложении WHERE как этот должен быть выполнен по одному для каждой строки таблицы, а не только 10, которые вы возвращаете.
  3. если вы знаете вы только будете нуждаться в 10 строк, вы можете попробовать добавить /*+ FIRST_ROWS(10) */ намек, чтобы дать Oracle оптимизатору руку помощи.
  4. является необходимым? Похоже, что большая часть вашей работы делается здесь.
+1

Сортировка необходима. Данные отображаются на веб-странице, и пользователь может сортировать на основе нескольких столбцов. Предложение «WHERE» фильтрует записи на основе условия, если я помещаю его как часть основного запроса, также я не получаю никакого улучшения. –

1

Я предлагаю заменить пункт in с exists пунктом - например, так:

 AND exists 
      (SELECT null 
      FROM ECOrders.ORDERITEMS ot 
      JOIN ECUSERS.USERINFO USI 
       on OT.OSELLERID = USI.UREFITEM 
       AND UPPER(USI.USERNAME) LIKE UPPER('%Dell Computer%') ESCAPE '~' 
      WHERE ot.sorefitem=so1.sorefitem 
      ) 

Джойном между ТоварыЗаказом и USERINFO будет внутреннее соединение, потому что вы заинтересованы только в заказанных товарах пользователей от Dell Компьютерные компании.

Смежные вопросы