我必须合并2个表,如下所示。 “ table2”具有15GB的数据。但是它显示错误。我设置了max-sql-memory = .80,但我不知道该如何解决。 当我执行此查询限制为50000选项时,它起作用了! 即使“从表2中选择*”也显示相同的错误。 我认为某种程度上存在选择瓶颈。 同样,通过此查询,通常只有3个节点的延迟中的1个上升。 (AWS EC2 i3.xlarge类型)
▶查询
插入表1(
InvoiceID,PayerAccountId,LinkedAccountId,RecordType,RecordId,ProductName
)
选择
InvoiceID,PayerAccountId,LinkedAccountId,RecordType,RecordId,ProductName
来自table2;
▶错误: 驱动程序:连接不良 警告:连接丢失! 打开新连接:所有会话设置都将丢失
▶日志: W180919 04:59:20.452985 186 storage / raft_transport.go:465 [n3]到节点2的筏传输流失败:rpc错误:代码=无法使用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 =“传输:拨号时无法重用客户端连接时出错”。重新连接...
答案 0 :(得分:0)
如果我正确理解了您的问题,则说明您正在使用一条语句从table2
中读取约15GB的数据并将其插入table1
中。不幸的是,您发现这行不通。请参阅limits for a single statement,其中涵盖了这种情况。设置--max-sql-memory=.80
将无济于事,并且很可能会造成伤害,因为CockroachDB需要一些喘息的空间,因为我们的内存跟踪不精确。 “连接错误警告”和您在日志中发现的错误都是Cockroach进程崩溃(可能是由于内存不足)而发生的症状。
如果您需要以事务方式将数据从table2
复制到table1
,那么此时您有点不走运。尽管您可以尝试使用显式事务并将单个INSERT
语句拆分为多个语句,但是您很可能会遇到事务大小限制。如果您可以非事务方式执行复制,则建议将INSERT
分成几部分。类似于:
INSERT INTO table1 (...)
SELECT ... FROM table2 WHERE InvoiceID > $1 LIMIT 10000
RETURNING InvoiceID
这里的想法是您要分批复制1万行。您可以使用RETURNING InvoiceID
子句来跟踪最后复制的InvoiceID
,并从那里开始下一个插入。