powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разная сортировка при одинаковом по смыслу запросе.
25 сообщений из 25, страница 1 из 1
Разная сортировка при одинаковом по смыслу запросе.
    #39585205
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем день добрый!
Объясните, пожалуйста, почему два одинаковых по смыслу запроса выдают различную сортировку. Данные в табличке подобраны так, что при одинаковых значениях c2 имеются одинаковые значения dt. А если убрать предикат, то будет вообще другая сортировка, хотя данные в подзапросе не меняются. По какому принципу оракл сортирует такие данные?
Первый запрос:
select *
from (
select c1,c2,dt,
row_number() over (partition by c2 order by dt desc) rrn
from t16012018) t
where t.rrn in (1,2,3,4,5,6,7,8,9,10,11,12)

Второй запрос:
select *
from (
select c1,c2,dt,
row_number() over (partition by c2 order by dt desc) rrn
from t16012018) t
where t.rrn between 1 and 12
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585208
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наполнение таблички:
SET DEFINE OFF;
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (0, 2457171, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (0, 2457169, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (0, 2457171, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (0, 2457171, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (0, 2457169, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (0, 2457169, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('08/05/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('08/05/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('08/05/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('08/05/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('08/05/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('08/05/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('07/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('07/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('07/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457171, TO_DATE('07/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('07/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into T16012018 (C1, C2, DT) Values (1, 2457169, TO_DATE('07/01/2010 00:00:00', 'MM/DD/YYYY HH24:MI:SS'));
COMMIT;
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585211
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQL,

У тебя отсутствует сортировка, поэтому ты получаешь данные в том порядке, в котором они обработались.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585214
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLПо какому принципу оракл сортирует такие данные?


Так как не указано order by ... для вывода результата, то ни по какому.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585218
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понятно, почему одни и те же данные, сформированные подзапросом
select c1,c2,dt,
row_number() over (partition by c2 order by dt desc) rrn
from t16012018
имеют разную последовательность на выходе после двух предикатов, которые не осекают вообще никаких данных.
На рандомный вывод не похоже, хочется понять алгоритм, по которому строится выходной набор данных.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585221
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQL, вывод данных не рандомный. Он происходит с учетом обработки большого кол-ва разных параметров
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585223
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLНа рандомный вывод не похоже, хочется понять алгоритм, по которому строится выходной набор данных.
Это внутренняя кухня Oracle, которую тебе никто не расскажет. Например (гадая на кофейной гуще), может зависеть от того, какие данные есть в кэше, а каких нет.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585224
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может неправильно объяснил.
Запрос
select c1,c2,dt,
row_number() over (partition by c2 order by dt desc) rrn
from t16012018

выводит с1 = 0 для rrn = 1 и c2 = 2457171.

Если я напишу
select *
from (
select c1,c2,dt,
row_number() over (partition by c2 order by dt desc) rrn
from t16012018) t
where t.rrn = 1
то для c2 = 2457171, с1 = 1, то есть другое значение c1
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585226
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tru55ArchiSQLНа рандомный вывод не похоже, хочется понять алгоритм, по которому строится выходной набор данных.
Это внутренняя кухня Oracle, которую тебе никто не расскажет. Например (гадая на кофейной гуще), может зависеть от того, какие данные есть в кэше, а каких нет.

Это я понимаю, что внутренняя, вот ее и хочется понять :)
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585227
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе же уже сказали. Если в запросе отсутствует ORDER BY, то порядок строк предсказать невозможно (не гарантирован).
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585229
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLtru55пропущено...

Это внутренняя кухня Oracle, которую тебе никто не расскажет. Например (гадая на кофейной гуще), может зависеть от того, какие данные есть в кэше, а каких нет.

Это я понимаю, что внутренняя, вот ее и хочется понять :)

Зачем? Обуздать все равно не получится. Пропиши явную сортировку
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585231
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLЭто я понимаю, что внутренняя, вот ее и хочется понять :)
Зачем, если ты этим не можешь ни управлять, ни использовать?
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585236
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
шК0ДЕРArchiSQLпропущено...


Это я понимаю, что внутренняя, вот ее и хочется понять :)

Зачем? Обуздать все равно не получится. Пропиши явную сортировку

Конечно же так и сделаю, просто стало интересно, почему так, гугл ничего не дал, пришел сюда, я ж не знаю, может там есть какой четкий алгоритм (по дате заполнения, или по rowid или еще по чему-то). После ответов понял, что скорее всего четкого алгоритма нет.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585241
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLшК0ДЕРпропущено...


Зачем? Обуздать все равно не получится. Пропиши явную сортировку

Конечно же так и сделаю, просто стало интересно, почему так, гугл ничего не дал, пришел сюда, я ж не знаю, может там есть какой четкий алгоритм (по дате заполнения, или по rowid или еще по чему-то). После ответов понял, что скорее всего четкого алгоритма нет.

Попробуйте сравнить планы запросов, может наведет на какие мысли..
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585244
Амир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего разные планы запросов получаются. Там где список скорее всего INLIST ITERATOR. А вообще неплохо бы номер версии Oracle сказать и планы привести. Хотя конечно без order by даже один и тот же запрос может выдавать разный порядок.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585253
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Амирбез order by даже один и тот же запрос может выдавать разный порядок.Даже с order by может выдавать разный порядок.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585258
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQL,

разные планы (сортировки) --> разный результат

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
  1  with t16012018 as (
  2  select 1 c1, 2457171 c2, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS') dt from dual
  3  union all
  4  select 0 c1, 2457171 c2, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS') dt from dual
  5  )
  6  select *
  7  from (
  8  select c1,c2,dt,
  9  row_number() over (partition by c2 order by dt desc) rrn
 10  from t16012018) t
 11  --where t.rrn in (1,2,3,4,5,6,7,8,9,10,11,12)
 12* where t.rrn between 1 and 12
SQL> /

        C1         C2 DT              RRN
---------- ---------- -------- ----------
         1    2457171 01.03.17          1
         0    2457171 01.03.17          2


Execution Plan
----------------------------------------------------------
Plan hash value: 426960394

---------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |      |     2 |    58 |     5  (20)| 00:00:01 |
|*  1 |  VIEW                    |      |     2 |    58 |     5  (20)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK|      |     2 |    32 |     5  (20)| 00:00:01 |
|   3 |    VIEW                  |      |     2 |    32 |     4   (0)| 00:00:01 |
|   4 |     UNION-ALL            |      |       |       |            |          |
|   5 |      FAST DUAL           |      |     1 |       |     2   (0)| 00:00:01 |
|   6 |      FAST DUAL           |      |     1 |       |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------

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

   1 - filter("T"."RRN">=1 AND "T"."RRN"<=12)
   2 - filter(ROW_NUMBER() OVER ( PARTITION BY "C2" ORDER BY
              INTERNAL_FUNCTION("DT") DESC )<=12)

SQL> ed
Wrote file afiedt.buf

  1  with t16012018 as (
  2  select 1 c1, 2457171 c2, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS') dt from dual
  3  union all
  4  select 0 c1, 2457171 c2, TO_DATE('03/01/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS') dt from dual
  5  )
  6  select *
  7  from (
  8  select c1,c2,dt,
  9  row_number() over (partition by c2 order by dt desc) rrn
 10  from t16012018) t
 11  where t.rrn in (1,2,3,4,5,6,7,8,9,10,11,12)
 12* --where t.rrn between 1 and 12
SQL> /

        C1         C2 DT              RRN
---------- ---------- -------- ----------
         0    2457171 01.03.17          1
         1    2457171 01.03.17          2


Execution Plan
----------------------------------------------------------
Plan hash value: 3635513400

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     2 |    58 |     5  (20)| 00:00:01 |
|*  1 |  VIEW            |      |     2 |    58 |     5  (20)| 00:00:01 |
|   2 |   WINDOW SORT    |      |     2 |    32 |     5  (20)| 00:00:01 |
|   3 |    VIEW          |      |     2 |    32 |     4   (0)| 00:00:01 |
|   4 |     UNION-ALL    |      |       |       |            |          |
|   5 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   6 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------

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

   1 - filter("T"."RRN"=1 OR "T"."RRN"=2 OR "T"."RRN"=3 OR "T"."RRN"=4
              OR "T"."RRN"=5 OR "T"."RRN"=6 OR "T"."RRN"=7 OR "T"."RRN"=8 OR
              "T"."RRN"=9 OR "T"."RRN"=10 OR "T"."RRN"=11 OR "T"."RRN"=12)

SQL>
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585259
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Амирбез order by даже один и тот же запрос может выдавать разный порядок.Даже с order by может выдавать разный порядок.
Не надо усложнять до времени :)
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585277
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous-2-пропущено...
Даже с order by может выдавать разный порядок.
Не надо усложнять до времени :)

Нет уж ))) Что-то не верится
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585283
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxterЧто-то не верится
Хинт1: ключ сортировки может не быть уникальным.
Хинт2: NLS_SORT может меняться.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585291
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLпросто стало интересно, почему так, гугл ничего не дал, пришел сюда, я ж не знаю, может там есть какой четкий алгоритм (по дате заполнения, или по rowid или еще по чему-то). После ответов понял, что скорее всего четкого алгоритма нет.
Ищи по форуму, подобная тема не раз уже обсуждалась
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585296
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArchiSQLгугл ничего не дал, пришел сюда
Одна из первых ссылок
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585300
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРОдна из первых ссылок Худшая.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585302
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousFoxterЧто-то не верится
Хинт1: ключ сортировки может не быть уникальным.
Хинт2: NLS_SORT может меняться.

Имелось же ввиду при прочих равных условиях - пример 2 )) И для примера 1 - зачем сортировать по такому полю (с одинаковыми значениями), а если они не одинаковые, а просто с низкой кардинальностью, то сортировка все равно будет одинаковая с применением order by.
...
Рейтинг: 0 / 0
Разная сортировка при одинаковом по смыслу запросе.
    #39585307
ArchiSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, опередили с планом запроса)
Завтра посмотрю)
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разная сортировка при одинаковом по смыслу запросе.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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