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