Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / and rownum = 1 ?? / 15 сообщений из 15, страница 1 из 1
10.10.2017, 11:42
    #39533926
компот
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
Код: plsql
1.
2.
3.
4.
5.
6.
select tl.customer_trx_id
from oe_order_headers_all h
,ra_customer_trx_lines_all tl
where h.header_id = 22914495 
and (to_char(h.header_id) = tl.interface_line_attribute1 or to_char(h.order_number) = tl.sales_order)
and rownum = 1



план (и факт) дает фуллскан tl

если убрать and rownum = 1
то всё ок

не могу понять почему так

если обернуть в подзапрос, то та же фигня
...
Рейтинг: 0 / 0
10.10.2017, 12:35
    #39533964
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
компот,

А можно по подробнее о "то всё ок"?
Можете показать план где, по Вашим словам, все ок?
...
Рейтинг: 0 / 0
10.10.2017, 12:45
    #39533971
протухший
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
компот,

ORA-00942: таблица или представление пользователя не существует
00942. 00000 - "table or view does not exist"
...
Рейтинг: 0 / 0
10.10.2017, 13:18
    #39534001
компот
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
MaximaXXLкомпот,

А можно по подробнее о "то всё ок"?
Можете показать план где, по Вашим словам, все ок?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1402640224

----------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                           |    71 |  1988 |    44   (0)| 00:00:01 |
|   1 |  CONCATENATION                |                           |       |       |            |          |
|   2 |   NESTED LOOPS                |                           |    69 |  1932 |    24   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| OE_ORDER_HEADERS_ALL      |     1 |    13 |     3   (0)| 00:00:01 |
|*  4 |     INDEX UNIQUE SCAN         | OE_ORDER_HEADERS_U1       |     1 |       |     2   (0)| 00:00:01 |
|   5 |    TABLE ACCESS BY INDEX ROWID| RA_CUSTOMER_TRX_LINES_ALL |    69 |  1035 |    21   (0)| 00:
|*  6 |     INDEX RANGE SCAN          | RA_CUSTOMER_TRX_LINES_N9  |   139 |       |     3   (0)| 00:00:01 |
|   7 |   NESTED LOOPS                |                           |     2 |    56 |    20   (0)| 00:00:01 |
|   8 |    TABLE ACCESS BY INDEX ROWID| OE_ORDER_HEADERS_ALL      |     1 |    13 |     3   (0)| 00:00:01 |
|*  9 |     INDEX UNIQUE SCAN         | OE_ORDER_HEADERS_U1       |     1 |       |     2   (0)| 00:00:01 |
|* 10 |    TABLE ACCESS BY INDEX ROWID| RA_CUSTOMER_TRX_LINES_ALL |     2 |    30 |    17   (0)| 00:00:0
|* 11 |     INDEX RANGE SCAN          | RA_CUSTOMER_TRX_LINES_C1  |   146 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
   4 - access("H"."HEADER_ID"=22914495)
   6 - access("TL"."SALES_ORDER"=TO_CHAR("H"."ORDER_NUMBER"))
   9 - access("H"."HEADER_ID"=22914495)
  10 - filter(LNNVL("TL"."SALES_ORDER"=TO_CHAR("H"."ORDER_NUMBER")))
  11 - access("TL"."INTERFACE_LINE_ATTRIBUTE1"=TO_CHAR("H"."HEADER_ID"))

вот это ОК
кроме того что строк тут >1
...
Рейтинг: 0 / 0
10.10.2017, 14:29
    #39534071
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
компот,

И даже после своего ответа не поняли?
...
Рейтинг: 0 / 0
10.10.2017, 15:11
    #39534109
компот
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
MaximaXXLкомпот,

И даже после своего ответа не поняли?

не
...
Рейтинг: 0 / 0
10.10.2017, 15:14
    #39534110
and rownum = 1 ??
компотMaximaXXLкомпот,

И даже после своего ответа не поняли?

не
сделай rownum < 2 и удивись.
...
Рейтинг: 0 / 0
10.10.2017, 15:23
    #39534123
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
компот,

У Вас в таблице ra_customer_trx_lines_all есть 2 индекса RA_CUSTOMER_TRX_LINES_N9 и RA_CUSTOMER_TRX_LINES_C1 которые используются в запросе. Т.о. Oracle разбивает Ваш селект на 2 запроса оба по индексированым полям. Когда появляется rownum = 1 он не может так разбить, а видя оператор or не может использовать ни один из индексов и принимает решение full_scan

В двух словах - так.
...
Рейтинг: 0 / 0
10.10.2017, 15:30
    #39534127
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
MaximaXXLУ Вас в таблице ra_customer_trx_lines_all есть 2 индекса RA_CUSTOMER_TRX_LINES_N9 и RA_CUSTOMER_TRX_LINES_C1 которые используются в запросе. Т.о. Oracle разбивает Ваш селект на 2 запроса оба по индексированым полям. Когда появляется rownum = 1 он не может так разбить , а видя оператор or не может использовать ни один из индексов и принимает решение full_scan

И почему же не может?
COUNT STOPKEY отменили?
...
Рейтинг: 0 / 0
10.10.2017, 15:39
    #39534137
компот
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
MaximaXXLкомпот,

У Вас в таблице ra_customer_trx_lines_all есть 2 индекса RA_CUSTOMER_TRX_LINES_N9 и RA_CUSTOMER_TRX_LINES_C1 которые используются в запросе. Т.о. Oracle разбивает Ваш селект на 2 запроса оба по индексированым полям. Когда появляется rownum = 1 он не может так разбить, а видя оператор or не может использовать ни один из индексов и принимает решение full_scan

В двух словах - так.

я думал, rownum применяется вконце, видать ошибался

но почему тогда вот так тоже "не может так разбить" ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select *
from (
select tl.customer_trx_id
from oe_order_headers_all h
,ra_customer_trx_lines_all tl
where h.header_id = 22914495 
and (to_char(h.header_id) = tl.interface_line_attribute1 or to_char(h.order_number) = tl.sales_order))
where rownum < 10
...
Рейтинг: 0 / 0
10.10.2017, 15:56
    #39534159
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
компот,

В твоем конкретном случае COUNT STOPKEY влияет на CONCATENATION трансформацию.
Если есть желание их изолировать, добавь в inline view хинт no_merge или еще более жестко "and rownum >= 1".

Какой план для
Код: plaintext
1.
2.
3.
4.
5.
6.
select *
  from (select tl.customer_trx_id
          from oe_order_headers_all h, ra_customer_trx_lines_all tl
         where h.header_id = 22914495
           and (to_char(h.header_id) = tl.interface_line_attribute1 or to_char(h.order_number) = tl.sales_order)
           and rownum >= 1)
 where rownum < 10
?
...
Рейтинг: 0 / 0
10.10.2017, 16:13
    #39534189
компот
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
dbms_photoshopКакой план для
Код: plaintext
1.
2.
3.
4.
5.
6.
select *
  from (select tl.customer_trx_id
          from oe_order_headers_all h, ra_customer_trx_lines_all tl
         where h.header_id = 22914495
           and (to_char(h.header_id) = tl.interface_line_attribute1 or to_char(h.order_number) = tl.sales_order)
           and rownum >= 1)
 where rownum < 10
?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1382145390

----------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                           |     9 |   117 |    16   (7)| 00:00:01 |
|*  1 |  COUNT STOPKEY                   |                           |       |       |            |          |
|   2 |   VIEW                           |                           |     9 |   117 |    16   (7)| 00:00:01 |
|   3 |    COUNT                         |                           |       |       |            |          |
|*  4 |     FILTER                       |                           |       |       |            |          |
|   5 |      NESTED LOOPS                |                           |     9 |   252 |    16   (7)| 00:00:01 |
|   6 |       TABLE ACCESS BY INDEX ROWID| OE_ORDER_HEADERS_ALL      |     1 |    13 |     3   (0)| 00:
|*  7 |        INDEX UNIQUE SCAN         | OE_ORDER_HEADERS_U1       |     1 |       |     2   (0)| 00:00:01 |
|*  8 |       TABLE ACCESS FULL          | RA_CUSTOMER_TRX_LINES_ALL |     9 |   135 |    13   (8)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(ROWNUM<10)
   4 - filter(ROWNUM>=1)
   7 - access("H"."HEADER_ID"=22914495)

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
   8 - filter("TL"."INTERFACE_LINE_ATTRIBUTE1"=TO_CHAR("H"."HEADER_ID") OR
              "TL"."SALES_ORDER"=TO_CHAR("H"."ORDER_NUMBER"))
...
Рейтинг: 0 / 0
11.10.2017, 11:33
    #39534512
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
компот,

С Oracle 12c (кажется) работает

FETCH NEXT 1 ROWS ONLY
...
Рейтинг: 0 / 0
11.10.2017, 13:35
    #39534658
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
MaximaXXLкомпот,
FETCH NEXT 1 ROWS ONLY
Работает, если order by указать :)
В плане - аналитика.
...
Рейтинг: 0 / 0
11.10.2017, 14:22
    #39534710
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
and rownum = 1 ??
andrey_anonymous,

И без order by работает

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as (select 2 a from dual union all
select 1 a from dual union all
select 3 a from dual)

SELECT * FROM   t
FETCH NEXT 1 ROWS ONLY

A
2
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / and rownum = 1 ?? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]