Могу ли я указать порядок при вставке данных в оракул?

я хочу вставить данные в таблицу unique2 из таблицы unique1 в том же порядке, в котором они существуют в таблице unique1.

insert /*+ append */ into unique2 
        select * from unique1 A where not exists (select 1 from match1 B where A.  promolog_key = B. promolog_key) order by rowid asc;

вставляет ли приведенный выше запрос квалифицированные данные в том же порядке, в котором они существуют в unique1?

Спасибо


person subash    schedule 19.02.2013    source источник
comment
Что для вас значит вставка данных в определенном порядке? Учитывая, что таблица, организованная в куче, по своей природе неупорядочена, физический порядок строк, как правило, довольно бессмысленен. Единственное исключение, о котором я могу думать, было бы, если бы unique2 был сжат, и вы пытались получить строки с повторяющимися значениями в одном и том же блоке. Но ваш order by rowid явно подразумевает, что здесь это не так.   -  person Justin Cave    schedule 19.02.2013
comment
Порядок не имеет значения для того, как строки хранятся в таблице, и это спорное усилие, поскольку вы устанавливаете порядок в своем операторе select для извлечения строк.   -  person Wolf    schedule 19.02.2013
comment
@JustinCave Порядок строк может сильно повлиять на производительность сканирования диапазона индекса, что может сильно повлиять на оптимизатор. Я полагаю, что если бы кто-то хотел скопировать таблицу для целей тестирования, было бы лучше, если бы исходная таблица и ее копия имели одинаковый порядок (конечно, это не единственный важный фактор =)   -  person Vincent Malgrat    schedule 19.02.2013
comment
@VincentMalgrat - Конечно, можно заказать таблицу с кучей, чтобы сделать более эффективным использование любого индекса для сканирования диапазона. Но если это желание, то, как правило, гораздо разумнее использовать таблицу, организованную по индексу, или хэш-кластер, а не таблицу, организованную в куче.   -  person Justin Cave    schedule 19.02.2013
comment
@JustinCave И они могут заказать их только по своему ПК. Я могу представить причины, по которым вам может понадобиться упорядочение данных определенным образом для таблиц кучи, например, с ежедневным обновлением материализованного представления для целей отчетности. Может быть интересно упорядочить этот MV определенным образом (отличным от его PK), чтобы запросы более эффективно использовали индексы.   -  person Vincent Malgrat    schedule 19.02.2013
comment
возможный дубликат INSERT с ORDER в Oracle   -  person Ben    schedule 19.02.2013
comment
@Ben: Это другой вопрос, здесь ОП спрашивает, может ли он повлиять на физический порядок строк с помощью INSERT с ORDER BY, тогда как другой вопрос спрашивает, может ли SELECT без ORDER BY будет извлекать строки предсказуемым образом.   -  person Vincent Malgrat    schedule 19.02.2013
comment
Это @винсент? Чем Есть ли способ управлять порядком, в котором наш оператор INSERT добавляет записи в целевую таблицу? отличается от я хочу вставить данные в таблицу unique2 из таблицы unique1 в том же порядке, в котором они существует в таблице unique1?   -  person Ben    schedule 19.02.2013
comment
@Ben Я согласен с Винсентом в том, что цель вопросов различна - этот другой вопрос на самом деле касается выполнения упорядоченной вставки с целью избежать упорядочения при выборе из вставленной таблицы.   -  person David Aldridge    schedule 19.02.2013
comment
@Ben Они очень похожи теперь, когда я их перечитал. Я думаю, что другой вопрос был интерпретирован как вставка данных в таблицу, чтобы их можно было получить упорядоченно без предложения ORDER BY? Ответ: не совсем возможно. Этот вопрос немного отличается, поскольку вы можете вставлять строки последовательно с помощью ORDER BY.   -  person Vincent Malgrat    schedule 19.02.2013


Ответы (2)


Да, в целом физический порядок строк будет таким же.

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

Однако с функциональной точки зрения упорядочивание по rowid кажется немного сомнительным. Если исходная таблица уже упорядочена желаемым образом, то продвижение полного сканирования таблицы в origin1 будет работать. В противном случае я бы заказал столбцы, в которых вы хотите улучшить кластеризацию/сжатие.

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

person David Aldridge    schedule 19.02.2013

Oracle позволяет указать предложение ORDER BY в операторе INSERT и в документации указано:

  • Что касается предложения ORDER BY подзапроса в DML_table_expression_clause, порядок гарантируется только для вставляемых строк и только в каждом экстенте таблицы. Порядок новых строк относительно существующих строк не гарантируется.

Таким образом, новые строки будут вставлены в вашу таблицу копирования в том же порядке, который вы указали в своем предложении ORDER BY. Это не влияет на старые строки, которые уже есть в таблице.

Ограничение по размеру может не беспокоить вас, потому что вы используете подсказку /*+ append */ и поэтому будете вставлять только выше водяного знака (последовательно, если не параллельно).

person Vincent Malgrat    schedule 19.02.2013
comment
Я думаю, что документы верны только в отношении вставок прямого пути, и даже тогда ссылка на экстенты не совсем верна. Вставки параллельного прямого пути определяют новые экстенты для каждого подчиненного устройства PQ, а вставка последовательного прямого пути — нет. Я отправил читательский комментарий для страницы. - person David Aldridge; 19.02.2013
comment
@DavidAldridge Меня тоже заинтриговало это ограничение. Это может относиться к стандартным вставкам, где вставляемые данные будут упорядочены только в пределах каждого вставленного экстента. Я думаю, что вставки последовательного прямого пути безопасны (по крайней мере, это был мой опыт). - person Vincent Malgrat; 19.02.2013
comment
означает ли это, что если я использую вставки прямого пути или вставки прямого пути с параллельным выполнением, порядок не будет гарантирован? - person subash; 19.02.2013
comment
Будут заказаны вставки прямого пути без параллели. Я не уверен в параллельности и не уверен в стандартной вставке. - person Vincent Malgrat; 20.02.2013
comment
Я почти уверен, что стандартные вставки не будут упорядочены, поскольку блоки, в которые вставляются строки, должны быть в некоторой степени распределены по доступным блокам ниже HWM. Параллельный прямой путь... тоже не уверен. Нет доступного экземпляра для тестирования, но это было бы просто сделать. - person David Aldridge; 20.02.2013