Есть небольшой запросик:
SELECT * FROM T_ATTR_AGGR
WHERE VALUE = 100
START WITH ID_AGGR=100
AND (ID_NAME = 100 )
CONNECT BY (PRIOR VALUE=ID_AGGR) AND (ID_NAME = 100 )
Но почему-то на разных системах (Linux Oracle 9.2.0.3 и WinNT Oracle
9.2.0.7) планы выполнения запросов критически разные.
Под Linux:
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
|
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | |
|
|* 1 | FILTER | | | |
|
|* 2 | CONNECT BY WITH FILTERING | | | |
|
| 3 | NESTED LOOPS | | | |
|
|* 4 | TABLE ACCESS CLUSTER | T_ATTR_AGGR | | |
|
|* 5 | INDEX UNIQUE SCAN | IC_AGGR | | |
|
| 6 | TABLE ACCESS BY USER ROWID| T_ATTR_AGGR | | |
|
| 7 | NESTED LOOPS | | | |
|
| 8 | BUFFER SORT | | | |
|
| 9 | CONNECT BY PUMP | | | |
|
|* 10 | TABLE ACCESS CLUSTER | T_ATTR_AGGR | | |
|
|* 11 | INDEX UNIQUE SCAN | IC_AGGR | | |
|
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("T_ATTR_AGGR"."VALUE"=100)
2 - filter("T_ATTR_AGGR"."ID_AGGR"=100 AND "T_ATTR_AGGR"."ID_NAME"=100)
4 - filter("T_ATTR_AGGR"."ID_NAME"=100)
5 - access("T_ATTR_AGGR"."ID_AGGR"=100)
10 - filter("T_ATTR_AGGR"."ID_NAME"=100)
11 - access("T_ATTR_AGGR"."ID_AGGR"=NULL)
Note: rule based optimization
Под NT:
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | FILTER | | | | |
|* 2 | CONNECT BY WITH FILTERING| | | | |
|* 3 | FILTER | | | | |
| 4 | TABLE ACCESS FULL | T_ATTR_AGGR | | | |
| 5 | NESTED LOOPS | | | | |
| 6 | BUFFER SORT | | | | |
| 7 | CONNECT BY PUMP | | | | |
|* 8 | TABLE ACCESS CLUSTER | T_ATTR_AGGR | | | |
|* 9 | INDEX UNIQUE SCAN | IC_AGGR | | | |
| 10 | TABLE ACCESS FULL | T_ATTR_AGGR | | | |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("T_ATTR_AGGR"."VALUE"=100)
2 - filter("T_ATTR_AGGR"."ID_AGGR"=100 AND "T_ATTR_AGGR"."ID_NAME"=100)
3 - filter("T_ATTR_AGGR"."ID_AGGR"=100 AND "T_ATTR_AGGR"."ID_NAME"=100)
8 - filter("T_ATTR_AGGR"."ID_NAME"=100)
9 - access("T_ATTR_AGGR"."ID_AGGR"=NULL)
Note: rule based optimization
Понятно - что в первом случае запрос летает, а во втором еле дышит. А
учитывая, что данный запрос - это подзапрос из под Exists, то исходный
запрос становится вообще мертвым.
Вопрос - как отхинтовать запрос так, что бы на второй системе получить
план такой-же как и на первой системе?
P.S.
Пробовал сделать outlines, но что самое для меня удивительное - хинты они
создали одинаковые в обоих системах, а планы запросов разные???
Валера
Попробуй поиграться с "_OLD_CONNECT_BY_ENABLED"=true|false
для 9.2.0.7
P.S.
Можешь не искать описания этого параметра в официальной документации.
Его там просто нет.
Valera wrote:
> From: "Valera" <val...@ibd.ru>
>
> From: "Valera" <val...@ibd.ru>
>
> Привет всем!!!
>
> Есть небольшой запросик:
> SELECT * FROM T_ATTR_AGGR
> WHERE VALUE = 100
> START WITH ID_AGGR=100
> AND (ID_NAME = 100 )
> CONNECT BY (PRIOR VALUE=ID_AGGR) AND (ID_NAME = 100 )
>
> Hо почему-то на разных системах (Linux Oracle 9.2.0.3 и WinNT Oracle
--
With best wishes,
Olexandr Siroklyn
"Olexandr Siroklyn" <Olexandr...@p128.f95.n464.z2.fidonet.org> wrote
in message news:42758...@news.isd.dp.ua...
> From: Olexandr Siroklyn <qnu...@inbox.ru>
> Subject: Re:
> =?KOI8-U?Q?=EF=D4=C8=C9=CE=D4=CF=D7=C1=D4=D8_=DA=C1=D0=D2=CF?=
> =?KOI8-U?Q?=D3=2E?=
>
> Попробуй поиграться с "_OLD_CONNECT_BY_ENABLED"=true|false
> для 9.2.0.7
SQL> alter system set OLD_CONNECT_BY_ENABLED TRUE;
alter system set OLD_CONNECT_BY_ENABLED TRUE
*
ERROR at line 1:
ORA-02065: illegal option for ALTER SYSTEM
Это не динамический параметр? Его в pfile выставить и перепустить базу?
>>Попробуй поиграться с "_OLD_CONNECT_BY_ENABLED"=true|false
^^^^
>>для 9.2.0.7
>
> SQL> alter system set OLD_CONNECT_BY_ENABLED TRUE;
^^^
> alter system set OLD_CONNECT_BY_ENABLED TRUE
> *
> ERROR at line 1:
> ORA-02065: illegal option for ALTER SYSTEM
>
> Это не динамический параметр? Его в pfile выставить и перепустить базу?
С подчеркивания начинается...
--
Andrew Lesnichenko
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Valera wrote:
> From: "Valera" <val...@ibd.ru>
>
> From: "Valera" <val...@ibd.ru>
>
--
With best wishes,
Olexandr Siroklyn
Valera wrote:
> From: "Valera" <val...@ibd.ru>
>
> From: "Valera" <val...@ibd.ru>
>