Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разная сортировка при одинаковом по смыслу запросе. / 25 сообщений из 25, страница 1 из 1
16.01.2018, 15:59
    #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
16.01.2018, 16:02
    #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
16.01.2018, 16:04
    #39585211
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
ArchiSQL,

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


Так как не указано order by ... для вывода результата, то ни по какому.
...
Рейтинг: 0 / 0
16.01.2018, 16:15
    #39585218
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
Не понятно, почему одни и те же данные, сформированные подзапросом
select c1,c2,dt,
row_number() over (partition by c2 order by dt desc) rrn
from t16012018
имеют разную последовательность на выходе после двух предикатов, которые не осекают вообще никаких данных.
На рандомный вывод не похоже, хочется понять алгоритм, по которому строится выходной набор данных.
...
Рейтинг: 0 / 0
16.01.2018, 16:17
    #39585221
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
ArchiSQL, вывод данных не рандомный. Он происходит с учетом обработки большого кол-ва разных параметров
...
Рейтинг: 0 / 0
16.01.2018, 16:18
    #39585223
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
ArchiSQLНа рандомный вывод не похоже, хочется понять алгоритм, по которому строится выходной набор данных.
Это внутренняя кухня Oracle, которую тебе никто не расскажет. Например (гадая на кофейной гуще), может зависеть от того, какие данные есть в кэше, а каких нет.
...
Рейтинг: 0 / 0
16.01.2018, 16:18
    #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
16.01.2018, 16:20
    #39585226
ArchiSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
tru55ArchiSQLНа рандомный вывод не похоже, хочется понять алгоритм, по которому строится выходной набор данных.
Это внутренняя кухня Oracle, которую тебе никто не расскажет. Например (гадая на кофейной гуще), может зависеть от того, какие данные есть в кэше, а каких нет.

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

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

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

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


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

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

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


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

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

Попробуйте сравнить планы запросов, может наведет на какие мысли..
...
Рейтинг: 0 / 0
16.01.2018, 16:34
    #39585244
Амир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
Скорее всего разные планы запросов получаются. Там где список скорее всего INLIST ITERATOR. А вообще неплохо бы номер версии Oracle сказать и планы привести. Хотя конечно без order by даже один и тот же запрос может выдавать разный порядок.
...
Рейтинг: 0 / 0
16.01.2018, 16:38
    #39585253
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
Амирбез order by даже один и тот же запрос может выдавать разный порядок.Даже с order by может выдавать разный порядок.
...
Рейтинг: 0 / 0
16.01.2018, 16:40
    #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
16.01.2018, 16:40
    #39585259
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
-2-Амирбез order by даже один и тот же запрос может выдавать разный порядок.Даже с order by может выдавать разный порядок.
Не надо усложнять до времени :)
...
Рейтинг: 0 / 0
16.01.2018, 16:50
    #39585277
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разная сортировка при одинаковом по смыслу запросе.
andrey_anonymous-2-пропущено...
Даже с order by может выдавать разный порядок.
Не надо усложнять до времени :)

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

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


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