powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ROWNUM
14 сообщений из 14, страница 1 из 1
ROWNUM
    #39542691
DmtP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два запроса:
SELECT DISTINCT o.OrderKey
FROM WH1.ORDERS o, WH1.RECEIPT r
WHERE o.RequestedShipDate < v_arch_date and o.editdate<v_arch_date
--AND ROWNUM < 1000
AND o.Type = '8'
AND o.OrderKey = r.Susr2
AND r.Type = '8'
AND NOT EXISTS(SELECT 1 FROM WH1.LOTXLOCXID A, WH1.Lotattribute B
WHERE a.lot = b.lot AND a.qty <> 0 AND b.lottable02 = r.ReceiptKey);
и

SELECT DISTINCT o.OrderKey
FROM WH1.ORDERS o, WH1.RECEIPT r
WHERE o.RequestedShipDate < v_arch_date and o.editdate<v_arch_date
AND ROWNUM < 1000
AND o.Type = '8'
AND o.OrderKey = r.Susr2
AND r.Type = '8'
AND NOT EXISTS(SELECT 1 FROM WH1.LOTXLOCXID A, WH1.Lotattribute B
WHERE a.lot = b.lot AND a.qty <> 0 AND b.lottable02 = r.ReceiptKey);

Первый в зависимости от даты v_arch_date выводит 10-12 тыс записей, второй 970-999. Есть объяснение почему ROWNUM не дает точной отсечки по значению?
...
Рейтинг: 0 / 0
ROWNUM
    #39542701
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmtPЕсть объяснение почему ROWNUM не дает точной отсечки по значению?

Есть. И оно написано в плане запроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ROWNUM
    #39542705
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DmtP,

А так сколько выдает ?

Код: plsql
1.
  select * from ( твой селект без условия rownum<1000 ) where rownum < 1000  
...
Рейтинг: 0 / 0
ROWNUM
    #39542731
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmtP,

Код: plsql
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.
  1* select job from emp where rownum<10
SQL> /

JOB
---------
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT

9 rows selected.

SQL> ed
Wrote file afiedt.buf

  1* select DISTINCT job from emp where rownum<10
SQL> /

JOB
---------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST




.....
stax
...
Рейтинг: 0 / 0
ROWNUM
    #39542736
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РогафипDmtP,

А так сколько выдает ?

Код: plsql
1.
  select * from ( твой селект без условия rownum<1000 ) where rownum < 1000  


так вернет 999 записей

....
stax
...
Рейтинг: 0 / 0
ROWNUM
    #39542786
DmtP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax, Dimitry Sibiryakov ,
вы правы: DISTINCT применяется после ограничения по ROWNUMBER
Спасибо
...
Рейтинг: 0 / 0
ROWNUM
    #39691010
роман23t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не начинать новую тему...

Есть таблица, в ней один числовой столбец. В ней 1кк строк примерно 100к уникальных значений. На поле создан обыкновенный индекс.

Задача выбрать первые 100 строк в порядке возрастания.

Подготовка данных:

Код: plsql
1.
2.
3.
4.
5.
create table test_1234 as select round(dbms_random.value * 100000) as res from dual connect by level < 1000000;

create index test_1234_idx on test_1234(res);

call dbms_stats.gather_table_stats(ownname => user,tabname => 'TEST_1234');




Разминочный вопрос: знает ли кто причину "фичи", по которой, чтобы исключить сортировку в памяти и использовать порядок из индекса нужно указывать столбец в условии фильтрации?

1) хороший план
Код: plsql
1.
select res from (select * from test_1234 where res = res order by res ) where rownum < 100





2) плохой план
Код: plsql
1.
select res from (select * from test_1234 order by res ) where rownum < 100






Основной вопрос: как выбрать 100 уникальных строк в порядке возрастания без выполнения сортировки в памяти(ну или на диске).

Т.е. чтобы результат такой же, как вернет запрос ниже
Код: plsql
1.
select res from (select distinc * from test_1234 where res = res order by res ) where rownum < 100




P.S. версия 11.2.0.4.0
...
Рейтинг: 0 / 0
ROWNUM
    #39691024
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
роман23twhere res = resres is not null
...
Рейтинг: 0 / 0
ROWNUM
    #39691026
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
роман23tЧтобы не начинать новую тему...Напрасно.
роман23t Разминочный вопрос: знает ли кто причину "фичи", по которой, чтобы исключить сортировку в памяти и использовать порядок из индекса нужно указывать столбец в условии фильтрации? Намек : как хранятся null-ы в индексе?
роман23t Основной вопрос: как выбрать 100 уникальных строк в порядке возрастания без выполнения сортировки в памяти(ну или на диске).
Т.е. чтобы результат такой же, как вернет запрос нижеОбеспечить гарантию того, что все строки таблицы есть в индексе.
...
Рейтинг: 0 / 0
ROWNUM
    #39691062
роман23t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по первому вопросу точно подмечено! А вроде и всегда знал, про то что null не хранится в индексе...

по второму добавление ограничения not null на столбец не помогло. Видимо я тебя не правильно понял
...
Рейтинг: 0 / 0
ROWNUM
    #39691515
роман23t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге так получилось

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select distinct res 
from (select  /*+ index (t test_1234_idx)*/       
         dense_rank() over(order by res) rnk  
        ,res
      from test_1234  t
      where res = res     
      order by res)
where rnk < 100





Хотя план рисует не ахти по стоимости, выбирает мгновенно, сортировки нет в памяти. (причем и на целевой таблице)
...
Рейтинг: 0 / 0
ROWNUM
    #39695015
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
роман23t,
роман23tсортировки нет в памяти
а SORT UNIQUE NOSORT по твоему что такое?
...
Рейтинг: 0 / 0
ROWNUM
    #39695028
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagorа SORT UNIQUE NOSORT по твоему что такое?

Ну это не сортировка а "заметка" - просили отсортировать а данные итак отсортированы (ведь данные читаем по INDEX FULL SCAN.

SY.
...
Рейтинг: 0 / 0
ROWNUM
    #39695067
роман23t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagorроман23t,
роман23tсортировки нет в памяти
а SORT UNIQUE NOSORT по твоему что такое?

твой коммент из серии накинуть г..на на вентилятор.

По мне так SORT UNIQUE NOSORT это удаление дубликатов строк из уже отсортированной выборки.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ROWNUM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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