Oracle Insert Select с заказом по

Я работаю над процедурой plsql, где я использую оператор вставки-выбора. Мне нужно вставить в таблицу в порядке. но порядок, который я использовал в select sql, не работает.

Есть ли какой-либо конкретный способ в оракуле, чтобы упорядоченно вставлять строки?

4 ответа

Использование ORDER BY в пределах INSERT SELECT не является бессмысленным, если он может изменить содержание вставленных данных, то есть с последовательностью NEXTVAL включены в SELECT пункт. И это даже если вставленные строки не будут отсортированы при получении - это роль вашего ORDER BY пункт в вашем SELECT предложение при доступе к строкам.

Для такой цели вы можете использовать ORDER BY предложение в подзапросе, и это работает:

INSERT INTO myTargetTable
(
  SELECT mySequence.nextval, sq.* FROM
    (   SELECT f1, f2, f3, ...fx 
          FROM mySourceTable
         WHERE myCondition
      ORDER BY mySortClause
    ) sq
)

Типичный вариант использования для упорядоченной вставки предназначен для совместного размещения определенного значения в одних и тех же блоках (эффективно снижая коэффициент кластеризации для индексов по столбцам, по которым вы упорядочили данные).

Это обычно требует прямой вставки пути...

insert /*+ append */ into ...
select ...
from   ...
order by ...

В этом нет ничего недопустимого, если вы согласны с тем, что это полезно только для больших объемов данных, что данные будут загружаться только выше максимальной отметки и что существуют проблемы с блокировкой.

Другим подходом, который достигает в основном того же эффекта, но более подходящим для OLTP-систем, является создание таблицы в кластере.

Стандартная таблица Oracle - это таблица с кучей. Организованная в куче таблица - это таблица, в которой строки хранятся в произвольном порядке.

Сортировка не имеет ничего общего при вставке строк. и совершенно бессмысленно. Вам нужно ORDER BY только при проецировании / выборе строк.

Так устроена СУБД Oracle.

Я почти уверен, что Oracle не гарантирует вставку строк в таблицу в каком-либо определенном порядке (даже если строки были вставлены в этом порядке).

Соображения производительности и хранения намного перевешивают соображения заказа (поскольку у каждого пользователя могут быть различные предпочтения для заказа)

Почему бы просто не использовать предложение "ORDER BY" в вашем операторе SELECT?

Или еще лучше, создать VIEW, в котором уже есть предложение ORDER BY?

CREATE VIEW your_table_ordered
SELECT *
FROM your_table
ORDER BY your_column
Другие вопросы по тегам