powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / возможен ли INSERT с сортировкой?
25 сообщений из 25, страница 1 из 1
возможен ли INSERT с сортировкой?
    #40010133
Кому татор - а кому лятор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри если совсем глупый вопрос! Нужно перенести определенные записи из таблицы A в таблицу B, сгенерировав PrimaryKey PK в таблице B, которого в таблице A нет. Нет проблем, пользуем rownum , получаем такое:
Код: sql
1.
insert into b select rownum pk, a.* from a;


теперь задача усложняется: нужно, чтобы PK был отсортирован по полям таблицы A, т.е. в SELECT таким образом можно получить правильную последовательность значений PK/rownum:

Код: sql
1.
select rownum pk, a.* from a order by a.f1,a.f2



Но в INSERT применять ORDER BY нельзя. Как быть?
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010137
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому татор - а кому лятор,

Технически, такое сделать можно (инлайн вью, аналитика - row_number). Но смысл хотелки непонятен.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010139
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому татор - а кому лятор
Но в INSERT применять ORDER BY нельзя.
в смысле - нельзя? вам запретили?
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010141
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому татор - а кому лятор,

Код: 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.
SQL> create table emp2 as select * from emp where 1=2;

Table created.

SQL> insert into emp2 select * from emp order by ename;

14 rows created.

SQL> set pages 5000 lines 111
SQL> select * from emp2;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7876 ADAMS      CLERK           7788 12.01.1983       1100                    20
      7499 ALLEN      SALESMAN        7698 20.02.1981       1600        300         30
      7698 BLAKE      MANAGER         7839 01.05.1981       2850                    30
      7782 CLARK      MANAGER         7839 09.06.1981       2450                    10
      7902 FORD       ANALYST         7566 03.12.1981       3000                    20
      7900 JAMES      CLERK           7698 03.12.1981        950                    30
      7566 JONES      MANAGER         7839 02.04.1981       2975                    20
      7839 KING       PRESIDENT            17.11.1981       5000                    10
      7654 MARTIN     SALESMAN        7698 28.09.1981       1250       1400         30
      7934 MILLER     CLERK           7782 23.01.1982       1300                    10
      7788 SCOTT      ANALYST         7566 09.12.1982       3000                    20
      7369 SMITH      CLERK           7902 17.12.1980        800                    20
      7844 TURNER     SALESMAN        7698 08.09.1981       1500                    30
      7521 WARD       SALESMAN        7698 22.02.1981       1250        500         30

14 rows selected.

SQL>

SQL> drop table emp2;

Table dropped.

SQL> create table emp2 as select EMPNO,ENAME from emp where 1=2;

Table created.

SQL>
SQL> insert into emp2 select rownum+1000,ename from (select * from emp order by ename);

14 rows created.

SQL> select * from emp2;

     EMPNO ENAME
---------- ----------
      1001 ADAMS
      1002 ALLEN
      1003 BLAKE
      1004 CLARK
      1005 FORD
      1006 JAMES
      1007 JONES
      1008 KING
      1009 MARTIN
      1010 MILLER
      1011 SCOTT
      1012 SMITH
      1013 TURNER
      1014 WARD

14 rows selected.

SQL>



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

Ну-ну. А теперь представь что на момент вставки подходящий экстент начинался с блока 10000. Oracle его заполнил и стал искать второй подходящий экстент и на этот момент подходящий экстент начинался с блока 7000. Что выдаст select? Или на момент вставки подходящий экстент был в datafile с ID = 22 а следующий в datafile с ID = 21. Или банально optimizer решил использовать parallel. SELECT без ORDER BY не гарантирует ибо нет понятия порядок строк в реляционных таблицах и ты это прекрасно знаешь. Так-что INSERT с ORDER BY только замедлит INSERT и не даст никакого гарантированного последующего преимущества типа SELECT без ORDER BY будет выдавать упорядоченные строки.

SY.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010157
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Это сломает rownum from (select ... order by ...) или оконный row_number?
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010161
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Так-что INSERT с ORDER BY только замедлит INSERT и не даст никакого гарантированного последующего преимущества типа SELECT без ORDER BY будет выдавать упорядоченные строки.

insert+order by ему нужен чтобы порядок сгенерированного из rownum empno соответствовал порядку ename, а не для выборки без order by.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010162
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Если вы про эту демонстрацию результата
Stax
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select * from emp2;

     EMPNO ENAME
---------- ----------
      1001 ADAMS
      1002 ALLEN
      1003 BLAKE
...


stax

То здесь вы совершенно правы, она действительно может вводить неокрепшие умы в заблуждение.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010163
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
SY,

Это сломает rownum from (select ... order by ...) или оконный row_number?


select rownum from (select ... order by ...) на данный момент не думаю ибо, насколько я понимаю, optimizer не использует материализацию для in-line view. А вот для with t as (select ... order by ...) select rownum from t думаю может если материализует (select ... order by ...) и скажем решит читать материализацию in parallel. Или если скажем TEMP как швейцарский сыр и при материализации последующий экстент будет начинаться с блока < предыдущего экстента. Оконный row_number joined by the hip (сиамские близнецы) с ORDER BY, так-что нет.

SY.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010166
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
INSERT с ORDER BY только замедлит INSERT и не даст никакого гарантированного последующего преимущества

Ну тут зависит от того, на какое преимущество рассчитывать.
К примеру, в CBOSS была разработана технология сортировки разделов с трафиком для улучшения характеристик отдельных индексов и общего увеличения производительности биллинга за счет кластеризации данных.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010167
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Stax,

Ну-ну. А теперь представь что на момент вставки подходящий экстент начинался с блока 10000. Oracle его заполнил и стал искать второй подходящий экстент и на этот момент подходящий экстент начинался с блока 7000. Что выдаст select? Или на момент вставки подходящий экстент был в datafile с ID = 22 а следующий в datafile с ID = 21. Или банально optimizer решил использовать parallel. SELECT без ORDER BY не гарантирует ибо нет понятия порядок строк в реляционных таблицах и ты это прекрасно знаешь. Так-что INSERT с ORDER BY только замедлит INSERT и не даст никакого гарантированного последующего преимущества типа SELECT без ORDER BY будет выдавать упорядоченные строки.

SY.

не верю что в insert into emp2 select rownum+1000,ename from (select * from emp order by ename);
order by будет проигнорирован
допустим добавлю я еще and rownum<1e100, но зачем?


ps
забыл
select * from emp2;
может выдать в любом порядке, ето просто визуализация что вставилось

.....
stax
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010169
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
не верю что в insert into emp2 select rownum+1000,ename from (select * from emp order by ename);
order by будет проигнорирован
не будет. другое дело, что rownum принудительно сериализует запрос, поэтому с DOP > 1 лучше использовать row_number().
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010175
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
в CBOSS была разработана технология
да есть hybrid columnar compression, зачем далеко ходить.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010176
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
Stax
не верю что в insert into emp2 select rownum+1000,ename from (select * from emp order by ename);
order by будет проигнорирован
не будет.


И где это документировано? Сегодня не будет а завтра...

SY.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010184
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
И где это документировано?
документировано что? что оракл обязан выполнять команды, выданные ему пользователем?

КОГДА ИМЕННО он выполнит order by - да, это хороший вопрос, и замечание про то, что он может быть выполнен до материализации, со всеми вытекающими - совершенно справедливое. ну так это задача программиста - сделать так, чтобы он выполнялся тогда, когда надо.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010185
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
да есть hybrid columnar compression, зачем далеко ходить.


А тут полностью согласен. Даже для advanced compression с условием в наборе есть повторяющиеся данные, т.е. col1 в ORDER BY col1 не unique.

SY.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010186
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
да есть hybrid columnar compression, зачем далеко ходить.

"л" - суффикс прошедшего времени.
Под девятку работали тогда.
Был HCC в девятке? В каком патче?
А тут упомянул просто как пример неочевидных выгод, которые можно получить от внешне бессмысленных действий :)
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010188
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
так это задача программиста - сделать так, чтобы он выполнялся тогда, когда надо.


В яблочко - посему зачем использовать "плано-зависимый" ROWNUM когда есть "плано-независимый" ROW_NUMBER.

SY.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010192
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да это далеко не "бессмысленные действия"
Улучшить фактор кластеризации определенного индекса достигалось именно перестройкой таблицы/секции с определенной сортировкой
Что уж там говорить про BASIC компрессию таблиц/секций, которая тоже весьма и весьма зависела от упорядочености (точнее неуникальности) значений в блоке
И частенько эти факторы совсем друг с другом не бились -- с одной стороны в десятки раз меньший объем чтения с диска за счет эффективного сжатия внутри блоков для массовой обработки (чтения, конечно), с другой стороны применение правильного индекса...
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010230
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY


И где это документировано? Сегодня не будет а завтра...

SY.


Home / Database / Oracle Database Online Documentation 12c, Release 1 (12.1) / Database Administration
авторIf you embed the ORDER BY clause in a subquery and place the ROWNUM condition in the top-level query, then you can force the ROWNUM condition to be applied after the ordering of the rows. For example, the following query returns the employees with the 10 smallest employee numbers. This is sometimes referred to as top-N reporting:

SELECT *
FROM (SELECT * FROM employees ORDER BY employee_id)
WHERE ROWNUM < 11;
In the preceding example, the ROWNUM values are those of the top-level SELECT statement, so they are generated after the rows have already been ordered by employee_id in the subquery.




https://docs.oracle.com/database/121/SQLRF/pseudocolumns009.htm#SQLRF00255

.....
stax
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010235
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
кит северных морей
так это задача программиста - сделать так, чтобы он выполнялся тогда, когда надо.


В яблочко - посему зачем использовать "плано-зависимый" ROWNUM когда есть "плано-независимый" ROW_NUMBER.

SY.

Вашими ж устами
ROW_NUMBER прономерует
есть ли гарантия что выходной набор будет упорядочен по ROW_NUMBER без явного order by

имхо, нет

тоесть надо
select row_number() over (order by ename) rn,ename from emp order by rn


зы
ето ж разовые операции, мож в версии 21-й что-то изменится, променяется и инсерт

....
stax
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010241
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
есть ли гарантия что выходной набор будет упорядочен по ROW_NUMBER без явного order by

нету, но для исходной задачи ТС она и не нужна. ему нужно сгенерировать первичный ключ в правильном порядке, и вставить данные, а произойдет вставка в порядке ПК, или в каком-то другом - не критично. если критично - ну, либо order by, либо clustering by linear order (pk) yes on load на таблице.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010244
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

тоесть надо
select row_number() over (order by ename) rn,ename from emp order by rn


надо

Код: plsql
1.
2.
select row_number() over (order by ename,empno) rn,ename from emp order by ename,empno
/



Код: 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.
SQL> select row_number() over (order by ename,empno) rn,ename from emp order by ename,empno
  2  /

        RN ENAME
---------- ----------
         1 ADAMS
         2 ALLEN
         3 BLAKE
         4 CLARK
         5 FORD
         6 JAMES
         7 JONES
         8 KING
         9 MARTIN
        10 MILLER
        11 SCOTT
        12 SMITH
        13 TURNER
        14 WARD

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3145491563

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   140 |     3   (0)| 00:00:01 |
|   1 |  WINDOW SORT       |      |    14 |   140 |     3   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |   140 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          3  recursive calls
          5  db block gets
          9  consistent gets
          0  physical reads
        992  redo size
        837  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         14  rows processed

SQL>



Оптимизатор прекрасно понимает что сортировать надо один раз.

SY.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010249
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Оптимизатор прекрасно понимает что сортировать надо один раз.

параллельный запрос будет отдавать в поряке колонки, которая указана в over (order by col), но не в порядке результата row_number. при неуникальных значениях это не одно и то же. для этого нужен отдельный order by и отдельный sort в плане.
...
Рейтинг: 0 / 0
возможен ли INSERT с сортировкой?
    #40010312
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей

параллельный запрос будет отдавать в поряке колонки, которая указана в over (order by col), но не в порядке результата row_number. при неуникальных значениях это не одно и то же. для этого нужен отдельный order by и отдельный sort в плане.


Именно поэтому в моем ответе stax ORDER BY ENAME,EMPNO что гарантирует порядок ROW_NUMBER = порядок строк. Если нет уникального поля можно использовать ROWID.

SY.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / возможен ли INSERT с сортировкой?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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