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

Откуда: Київ
Сообщений: 208
Всем привет!

На днях столкнулся с проблемой, при соединении таблицы и подзапроса который выбирает данные через линк, упорно используется NESTED LOOPS вместо HASH JOIN.

Хинты use_hash, no_query_transformation ничего не дали, можно как то заставить Oracle использовать Hash join.


Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
10 окт 12, 16:38    [13297447]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Dima DI,

Ты действительно полагаешь, что абсолютно любой запрос может использовать hash join?
10 окт 12, 16:40    [13297464]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Dima DI,

Покажи текст и план запроса.
10 окт 12, 16:43    [13297485]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Dima DI
Member

Откуда: Київ
Сообщений: 208
dbms_photoshop

нет просто ищу варианты ...
10 окт 12, 16:46    [13297519]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Dima DI
Member

Откуда: Київ
Сообщений: 208
Запрос вот :

SELECT  --+ leading(smsc) no_query_transformation use_hash(smsc,m) 
            TRUNC(m.STARTTIME) AS FNSTDATE,
            smsc.OPER AS OPERATOR,
            'I' AS DIRECTION,
            m.CALLINGPARTYNUMBER AS ORIGINATOR,
            COUNT(1) AS SMS_Q
    FROM  table1 m,
         (SELECT   MIN(OPER) AS OPER,NOMBER
           FROM
           ( SELECT  TO_CHAR(NOMBER) AS NOMBER, OPER AS OPER
             FROM table2@link
             WHERE to_date ('13.09.2012','dd.mm.yyyy') >=FROM_DATE
             UNION ALL
             SELECT TO_CHAR(NOMBER) AS NOMBER, OPER AS OPER
             FROM table3@link
             where nomber<>000000  
             union all
             select '000000' as NOMBER, 'ttttttt' AS OPER from dual  
          )
         GROUP BY NOMBER
         ) smsc
    WHERE m.RECORDTYPE = 9
    AND m.REDIRECTINGNUMBER not LIKE smsc.NOMBER||'%'
    AND substr(m.REDIRECTINGNUMBER,1,5) <> substr(smsc.NOMBER,1,5)
     AND (STARTTIME >= to_date ('13.09.2012','dd.mm.yyyy') AND STARTTIME < to_date ('14.09.2012','dd.mm.yyyy'))
    and m.REDIRECTINGNUMBER not like '0000%'  
    and substr(m.Imsi,1,5) in ('00000','00000') 
    GROUP BY TRUNC(m.STARTTIME),OPER,m.CALLINGPARTYNUMBER
    HAVING COUNT(1)>1000;


 
10 окт 12, 16:50    [13297573]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Dima DI
Member

Откуда: Київ
Сообщений: 208
--------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop | Inst   |IN-OUT|
--------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                     |     1 |   122 |   345K  (1)| 01:20:42 |       |       |        |      |
|*  1 |  FILTER                        |                     |       |       |            |          |       |       |        |      |
|   2 |   HASH GROUP BY                |                     |     1 |   122 |   345K  (1)| 01:20:42 |       |       |        |      |
|   3 |    NESTED LOOPS                |                     |     1 |   122 |   345K  (1)| 01:20:42 |       |       |        |      |
|   4 |     VIEW                       |                     |    16 |   784 |     7  (15)| 00:00:01 |       |       |        |      |
|   5 |      HASH GROUP BY             |                     |    16 |   784 |     7  (15)| 00:00:01 |       |       |        |      |
|   6 |       VIEW                     |                     |    16 |   784 |     6   (0)| 00:00:01 |       |       |        |      |
|   7 |        UNION-ALL               |                     |       |       |            |          |       |       |        |      |
|   8 |         REMOTE                 | table2              |    10 |   340 |     2   (0)| 00:00:01 |       |       |  ITCDB | R->S |
|   9 |         REMOTE                 | table3              |     5 |    70 |     2   (0)| 00:00:01 |       |       |  ITCDB | R->S |
|  10 |         FAST DUAL              |                     |     1 |       |     2   (0)| 00:00:01 |       |       |        |      |
|  11 |     PARTITION RANGE ITERATOR   |                     |     1 |    73 | 21612   (1)| 00:05:03 |  1018 |  1020 |        |      |
|  12 |      PARTITION LIST SINGLE     |                     |     1 |    73 | 21612   (1)| 00:05:03 |   KEY |   KEY |        |      |
|* 13 |       TABLE ACCESS STORAGE FULL| table1              |     1 |    73 | 21612   (1)| 00:05:03 |   KEY |   KEY |        |      |
План :
10 окт 12, 16:54    [13297619]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Dima DI,

А че предикаты не показал?
10 окт 12, 16:57    [13297634]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Dima DI
Member

Откуда: Київ
Сообщений: 208
Вот они:

Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter(COUNT(*)>1000)
  13 - storage("M"."RECORDTYPE"=9 AND (SUBSTR("M"."IMSI",1,5)='00000' OR SUBSTR("M"."IMSI",1,5)='00000') AND 
              "M"."REDIRECTINGNUMBER" NOT LIKE '0000%')
       filter("M"."RECORDTYPE"=9 AND (SUBSTR("M"."IMSI",1,5)='00000' OR SUBSTR("M"."IMSI",1,5)='00000') AND 
              "M"."REDIRECTINGNUMBER" NOT LIKE '0000%' AND "M"."REDIRECTINGNUMBER" NOT LIKE "SMSC"."NOMBER"||'%' AND 
              SUBSTR("M"."REDIRECTINGNUMBER",1,5)<>SUBSTR("SMSC"."NOMBER",1,5))
 
Remote SQL Information (identified by operation id):
----------------------------------------------------
 
   8 - SELECT /*+ */ "NOMBER","OPER","FROM_DATE" FROM "STAT"."SMSIW_SMSC" "SMSIW_SMSC" WHERE "FROM_DATE"<=TO_DATE(' 
       2012-09-13 00:00:00', 'syyyy-mm-dd hh24:mi:ss') (accessing 'table1' )
 
   9 - SELECT /*+ */ "NOMBER","OPER" FROM "STAT"."SMSIW_SMSC_NATIONAL" "SMSIW_SMSC_NATIONAL" WHERE "NOMBER"<>000000 (accessing 
       'table2' )
 
10 окт 12, 17:10    [13297757]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Dima DI
Member

Откуда: Київ
Сообщений: 208
Ну что, где косяк не могу понять ...
10 окт 12, 17:40    [13298034]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Hashкосяк
Guest
Косяк в лайке.
10 окт 12, 18:36    [13298397]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
kinky cat
Member

Откуда: с дивана23
Сообщений: 1238
Dima DI,
лол, You cannot use hash joins unless there is an equality condition.
11 окт 12, 08:57    [13300281]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Dima DI
Member

Откуда: Київ
Сообщений: 208
а где об этом поведении можно почитать ?
11 окт 12, 10:20    [13300687]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Soleri
Member

Откуда:
Сообщений: 80
Dima DI,

http://docs.oracle.com/cd/E11882_01/server.112/e16638/optimops.htm
11 окт 12, 10:44    [13300842]     Ответить | Цитировать Сообщить модератору
 Re: force use_hash  [new]
Dima DI
Member

Откуда: Київ
Сообщений: 208
Спасибо! мат часть это сила ))))
11 окт 12, 10:54    [13300904]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить