powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / and rownum = 1 ??
15 сообщений из 15, страница 1 из 1
and rownum = 1 ??
    #39533926
компот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
and rownum = 1 ??
    #39533964
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компот,

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

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

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

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

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

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

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

У Вас в таблице 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
and rownum = 1 ??
    #39534127
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
and rownum = 1 ??
    #39534137
компот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
and rownum = 1 ??
    #39534159
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компот,

В твоем конкретном случае 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
and rownum = 1 ??
    #39534189
компот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
and rownum = 1 ??
    #39534512
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компот,

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

FETCH NEXT 1 ROWS ONLY
...
Рейтинг: 0 / 0
and rownum = 1 ??
    #39534658
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLкомпот,
FETCH NEXT 1 ROWS ONLY
Работает, если order by указать :)
В плане - аналитика.
...
Рейтинг: 0 / 0
and rownum = 1 ??
    #39534710
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / and rownum = 1 ??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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