Если я правильно понимаю ваш вопрос, вы используете одно утверждение, чтобы прочитать ~ 15 ГБ данных из table2
и вставить их в table1
.К сожалению, как вы обнаружили, это не сработает.См. пределы для одного оператора , который охватывает именно этот сценарий.Установка --max-sql-memory=.80
не поможет и, скорее всего, повредит, поскольку CockroachDB нужна передышка, поскольку отслеживание нашей памяти не точное.«Предупреждение о плохом соединении» и ошибка, обнаруженная в журналах, являются симптомами, которые возникают при сбое процесса Cockroach, предположительно из-за нехватки памяти.
Если вам необходимо скопировать данные из table2
до table1
, тогда вам немного не повезло.Хотя вы можете попытаться использовать явную транзакцию и разбить один оператор INSERT
на несколько операторов, вы, скорее всего, столкнетесь с ограничениями размера транзакции.Если вы можете справиться с выполнением копии без транзакций, тогда я бы предложил разбить INSERT
на части.Что-то вроде:
INSERT INTO table1 (...)
SELECT ... FROM table2 WHERE InvoiceID > $1 LIMIT 10000
RETURNING InvoiceID
Идея заключается в том, что вы копируете партии по 10 тысяч строк.Вы должны использовать предложение RETURNING InvoiceID
для отслеживания последнего InvoiceID
, который был скопирован, и начать следующую вставку оттуда.