выберите узкое место и вставьте в выберите не работает на дб таракан - PullRequest
0 голосов
/ 19 сентября 2018

Я должен объединить 2 таблицы, как показано ниже.и «table2» имеет данные 15 ГБ.Но это показывают ошибки.Я установил max-sql-memory = .80, и я не знаю, как это решить.Когда я выполняю этот запрос с параметром ограничения 50000 , он работает!Даже 'select * from table2' показывает ту же ошибку.Я думаю, что есть некоторые узкие места как-то .... Кроме того, с этим запросом это необычно, только 1 из 3nodes задержки увеличивается.(AWS EC2 i3.xlarge тип)

▶ Запрос
вставка в таблицу1 (InvoiceID, PayerAccountId, LinkedAccountId, RecordType, RecordId, ProductName), выберите InvoiceID, PayerAccountId, LinkedAccountId, RecordId, RecordType;

▶ Ошибка: драйвер: плохое соединение, предупреждение: соединение потеряно!открытие нового соединения: все настройки сеанса будут потеряны

▶ Журнал: W180919 04: 59: 20.452985 186 storage / raft_transport.go: 465 [n3] сбой потока транспортировки плота к узлу 2: ошибка rpc: code = недоступнаdesc = транспорт закрывается W180919 04: 59: 20.452996 190 vendor / google.golang.org / grpc / clientconn.go: 1158 grpc: addrConn.createTransport не удалось подключиться к {10.240.98.xxx:26257 0}.Ошибка: ошибка соединения: desc = "transport: Ошибка при наборе номера не может повторно использовать соединение клиента".Воссоединение ...

1 Ответ

0 голосов
/ 19 сентября 2018

Если я правильно понимаю ваш вопрос, вы используете одно утверждение, чтобы прочитать ~ 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, который был скопирован, и начать следующую вставку оттуда.

...