powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос с over(): что задает сортировку?
4 сообщений из 4, страница 1 из 1
запрос с over(): что задает сортировку?
    #32162782
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассматриваю запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT dept, name, salary, 
       ROW_NUMBER() OVER ( PARTITION BY dept ORDER BY salary DESC ) top 
FROM emp2;

DEPT         NAME                   SALARY        TOP
 ------------ ------------------ ---------- ----------
 
Department  1  Maud Ivey              1671 . 26            1 
             Bertram Ahlemann       1424 . 85            2 

Department  2  Evadne Pilcher         1951 . 39            1 
             Anita Sean             1856 . 22            2 
             Rolph Sladder          1746 . 07            3 
             Maisie Kendall         1532 . 96            4 
             Woodley Barkley        1492 . 23            5 
             Lucretia Mendel        1418 . 68            6 
             Blaine Pinkston         1322 . 8            7 
             Randal Lucca           1202 . 41            8 
             Isabella Eastwood       1160 . 4            9 
             Xenia Haarper          1079 . 89           10 

Department  3  Roderick Tillman       1640 . 11            1 


Не могу понять, что в этом запросе задает сортировку по DEPT.
PARTITION BY dept ведь означает только групировку, или также неявную сортировку?

Физически Department'ы не следую в отсортированном порядке.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> select dept from emp2;

DEPT
 ------------
 
Department  2 
Department  2 
Department  2 
Department  2 
Department  2 
Department  1 
Department  2 
Department  2 
Department  1 
Department  2 
Department  3 
Department  2 
Department  2 
...
Рейтинг: 0 / 0
запрос с over(): что задает сортировку?
    #32162813
Angel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А при группировке и сортируется.
Попробуй select dept from emp2 group by dept;
...
Рейтинг: 0 / 0
запрос с over(): что задает сортировку?
    #32162838
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно! Я конечно стандарты SQL далеко не наизусть знаю. До сих пор считала что group by имеет смысл только при агрегатных функциях, или это просто особенность оркала?

Проверила

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select dept from emp2 group by dept;

DEPT
 ---------------
 
Department  1 
Department  2 
Department  3 

Elapsed:  00 : 00 : 00 . 00 

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE
    1      0    SORT (GROUP BY)
    2      1      TABLE ACCESS (FULL) OF 'EMP2'


и

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select distinct dept from emp2;

DEPT
 ---------------
 
Department  1 
Department  2 
Department  3 

Elapsed:  00 : 00 : 00 . 00 

Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE
    1      0    SORT (UNIQUE)
    2      1      TABLE ACCESS (FULL) OF 'EMP2'


Правильно ли я понимаю что для осуществления группировки и оределения уникальных значений, Оракл всегда использует сортировку?

PS
Скорость сравнить не удалось (Elapsed: 00:00:00.00). Можно ли сказать по Execution Plan какой запрос будет быстрее?
...
Рейтинг: 0 / 0
запрос с over(): что задает сортировку?
    #32163503
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю ответ лежит в области программирования -- группировка и поиск уникальных значений требуют сортировки. Либо явной, либо неявной (например использовать уже готовую сортировку в индексе).

Другое дело, что упорядоченность при этой вынужденной сортировке может отличаться от так называемой "интуитивной".

Metalink Note Id: No114507.1

Technical Tips: Avoiding Sort

Examining the Optimizer strategy is one way to see whether a sort is being performed. However, there are are some standard operators that will often cause a sort to occur. You should keep these in mind when tuning queries and tuning sort for Oracle Rdb.
As described in this article, DISTINCT will often cause sort to be used so that rows with the same values can be eliminated.


GROUP BY and ORDER BY will order the set of data using sort if no suitable index is available. This is always true when these clauses use columns from different tables or when they contain expressions.


The UNION operator, by default, returns only the distinct rows from the merged tables. If you know that the results are already unique, or if you can tolerate the duplicate rows, use the UNION ALL operator.


Joins between tables with no suitable sorted index may require a sort so that the matching rows can be found and returned for the query.
The Rdb optimizer Optimizer will attempt to eliminate unnecessary sorts if possible. For instance, an exaggerated query that over-specifies the ordering will still only perform one sort operation.


В принципе сие http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm тоже подтверждает оное: сортировка будет, но не гарантируется.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / запрос с over(): что задает сортировку?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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