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

Откуда:
Сообщений: 28
Есть некий запрос, например:

select t1.ID, t2.NUMBER
from table1 t1, table2 t2
where t1.ID = t2.ID

На каждый ID в таблице 1 приходится несколько NUMBER из таблицы 2.
Как сделать, чтобы из таблицы 2 запрос отбирал не больше пяти намберов и переходил к следующему ID ?
24 июн 10, 11:34    [8992831]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
Deluxe0488
Member

Откуда:
Сообщений: 28
rownum вряд ли поможет, потому что нужно именно во второй таблице брать 5 значений на каждый ID. Аналитикой тоже не получалось. Таблицы очень большие, нужно пооптимальнее придумать
24 июн 10, 11:44    [8992944]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
rsltr
Member

Откуда: Москва
Сообщений: 464
row_number() over () rn    rn<=5

не поможет?
24 июн 10, 11:52    [8993044]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Deluxe0488,

Выбирайте все записи, а потом уже аналитика.
24 июн 10, 11:58    [8993133]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
Deluxe0488
Member

Откуда:
Сообщений: 28
rsltr,

Пробовал. Если в over в order by прописывать number, то гораздо дольше работает. Проще все выгружать. Попробую туда ID прописать. Order by сам по себе не нужен, но требуется синтаксисом
24 июн 10, 12:05    [8993229]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
Deluxe0488,

Если 5 произвольных, то
over (order by dbms_random.value)
из минусов - результат запроса будет меняться
24 июн 10, 12:13    [8993345]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
DENIS_PR
Member

Откуда: Almaty
Сообщений: 334
select * from
(select t1.ID, t2.NUMBER_, row_number() over(partition by t2.ID order by t2.ID) rn
  from table1 t1, table2 t2 
  where t1.ID = t2.ID)
  where rn <=5
24 июн 10, 12:16    [8993395]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
env
Deluxe0488,

Если 5 произвольных, то
over (order by dbms_random.value)
из минусов - результат запроса будет меняться


из минусов то, что аналитика пройдет по всей таблице
24 июн 10, 12:16    [8993403]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
rsltr
Member

Откуда: Москва
Сообщений: 464
Deluxe0488,

select id,number from (
select t1.ID ID, t2.NUMBER NUMBER,row_number() over (partition by id order by id) rn
from table1 t1, table2 t2
where t1.ID = t2.ID ) t where rn<=5
24 июн 10, 12:17    [8993414]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
DENIS_PR
Member

Откуда: Almaty
Сообщений: 334
Deluxe0488
Есть некий запрос, например:

select t1.ID, t2.NUMBER
from table1 t1, table2 t2
where t1.ID = t2.ID

На каждый ID в таблице 1 приходится несколько NUMBER из таблицы 2.
Как сделать, чтобы из таблицы 2 запрос отбирал не больше пяти намберов и переходил к следующему ID ?
24 июн 10, 12:18    [8993448]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
AlexFF__|,

Ой-ли?
Оптимизатор может внести фильтр "внутрь"
select *
from
(select ac_id, field1, row_number() over (partition by ac_id order by dbms_random.value) rn from table_with_70M_rows) t1,
table_with_10M_rows ac
where ac.id=t1.ac_id and t1.rn<=5

Plan hash value: 1006393166

----------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                         |    76M|    15G|       |   728K  (1)| 02:25:43 |  |       |        |      |            |
|   1 |  PX COORDINATOR                 |                         |       |       |       |            |          |  |       |        |      |            |
|   2 |   PX SEND QC (RANDOM)           | :TQ10002                |    76M|    15G|       |   728K  (1)| 02:25:43 |  |       |  Q1,02 | P->S | QC (RAND)  |
|*  3 |    HASH JOIN                    |                         |    76M|    15G|  2091M|   728K  (1)| 02:25:43 |  |       |  Q1,02 | PCWP |            |
|   4 |     BUFFER SORT                 |                         |       |       |       |            |          |  |       |  Q1,02 | PCWC |            |
|   5 |      PX RECEIVE                 |                         |    11M|  1958M|       | 51032   (1)| 00:10:13 |  |       |  Q1,02 | PCWP |            |
|   6 |       PX SEND BROADCAST         | :TQ10000                |    11M|  1958M|       | 51032   (1)| 00:10:13 |  |       |        | S->P | BROADCAST  |
|   7 |        TABLE ACCESS FULL        | AC                      |    11M|  1958M|       | 51032   (1)| 00:10:13 |  |       |        |      |            |
|*  8 |     VIEW                        |                         |    76M|  2833M|       |   389K  (2)| 01:17:52 |  |       |  Q1,02 | PCWP |            |
|*  9 |      WINDOW SORT PUSHED RANK    |                         |    76M|   799M|  1458M|   389K  (2)| 01:17:52 |  |       |  Q1,02 | PCWP |            |
|  10 |       PX RECEIVE                |                         |    76M|   799M|       |   389K  (2)| 01:17:52 |  |       |  Q1,02 | PCWP |            |
|  11 |        PX SEND HASH             | :TQ10001                |    76M|   799M|       |   389K  (2)| 01:17:52 |  |       |  Q1,01 | P->P | HASH       |
|* 12 |         WINDOW CHILD PUSHED RANK|                         |    76M|   799M|       |   389K  (2)| 01:17:52 |  |       |  Q1,01 | PCWP |            |
|  13 |          PX BLOCK ITERATOR      |                         |    76M|   799M|       | 54020   (2)| 00:10:49 |1 |    30 |  Q1,01 | PCWC |            |
|  14 |           INDEX FAST FULL SCAN  | T1#AC                   |    76M|   799M|       | 54020   (2)| 00:10:49 |1 |    30 |  Q1,01 | PCWP |            |
----------------------------------------------------------------------------------------------------------------------------------------------------------------

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

   3 - access("AC"."ID"="T1"."AC_ID")
   8 - filter("T1"."RN"<=5)
   9 - filter(ROW_NUMBER() OVER ( PARTITION BY "AC_ID" ORDER BY "DBMS_RANDOM"."VALUE"())<=5)
  12 - filter(ROW_NUMBER() OVER ( PARTITION BY "AC_ID" ORDER BY "DBMS_RANDOM"."VALUE"())<=5)

24 июн 10, 12:30    [8993623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
Deluxe0488
Member

Откуда:
Сообщений: 28
rsltr,

да, так и сделал. только когда добавляешь rn<=5, то запрос минут на 30 дольше отбирает, чем если просто всё выводить. Аналитика только в подзапросе может быть. Есть ли способ без подзапроса?
24 июн 10, 12:36    [8993705]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Еще раз
AlexFF__|
env
Deluxe0488,

Если 5 произвольных, то
over (order by dbms_random.value)
из минусов - результат запроса будет меняться


из минусов то, что аналитика пройдет по всей таблице
24 июн 10, 12:36    [8993707]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
AlexFF__|,

Согласен, ступил. Внесённый фильтр не будет работать как STOPKEY.
24 июн 10, 12:43    [8993814]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
Deluxe0488
Member

Откуда:
Сообщений: 28
env,

спасибо, но всё же аналитикой и так, и сяк получается в разы дольше, чем всё выгружать. Хотелось бы без лишнего подзапроса в коде.
24 июн 10, 13:14    [8994201]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно составить запрос  [new]
Deluxe0488
Member

Откуда:
Сообщений: 28
Если без добавления в where rn<=5, то план

Plan
SELECT STATEMENT CHOOSE Cost: 41,885 Bytes: 142 Cardinality: 1

Если добавить rn<=5, то:

Plan
SELECT STATEMENT CHOOSE Cost: 1.388.437 Bytes: 2.119.488 Cardinality: 12,616
24 июн 10, 14:03    [8994718]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить