Postgres INSERT INTO с выбором SELECT - PullRequest
0 голосов
/ 12 июня 2018

При вставке в Postgres с помощью оператора select гарантированно вставляются строки в том же порядке, в котором их возвращает оператор select?

То есть с учетом таблицы bar (где id равно SERIAL PRIMARY KEY, name равно TEXT):

id | name
---+-----
 0 | A
 1 | B
 2 | C

И еще одна таблица, foo (пустая и с той же схемой), если I INSERT INTO foo (name) SELECT name FROM bar ORDER BY id DESC будет foo гарантированно будет иметь:

id | name
---+-----
 0 | C
 1 | B
 2 | A

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

Я прочитал раздел 13.8 в стандарте SQL-92 и в общем правиле № 3 утверждается, что «выражение запроса эффективно оценивается перед вставкой каких-либо строк в B.», но оно явно ничего не говорит оупорядоченность.Является ли стандарт целенаправленно расплывчатым (возможно, чтобы разрешить параллельные вставки?), А упорядоченность - это деталь реализации?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я спросил в списке рассылки Postgres, и они помогли мне прояснить ситуацию.Оказывается, это специфический для базы данных ответ, поэтому, если вы читаете его и используете другую базу данных, ответ может не совпадать.

Postgres, явно по состоянию на 9.6, будет логически вставляться в порядоквозвращенного набора результатов.

Поведение явно кодифицировано в этом коммите: https://github.com/postgres/postgres/commit/9118d03a8cca3d97327c56bf89a72e328e454e63

Из описания фиксации:

Например, в SELECT x, nextval ('seq') ОТ вкладки ORDER BY x LIMIT 10;вероятно, желательно, чтобы значения nextval () были упорядочены так же, как и x, и чтобы nextval () не запускался более 10 раз.

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

tl; dr;Порядок вставки - это деталь реализации, но целенаправленно закодированная в Postgres 9.6 и выше, чтобы соответствовать интуиции.До 9.6 гарантий не было.

0 голосов
/ 12 июня 2018

Строки в новой таблице будут вставлены в порядке, указанном в предложении ORDER BY, поэтому id, сгенерированный из последовательности, будет отражать этот порядок.

Чтобы убедиться в этом, посмотрите наплан выполнения, где вы должны увидеть узел Sort перед Insert.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...