select 瓶颈并插入 select 对 cockroach db 不起作用

select bottleneck and insert into select doesn't work on cockroach db

我必须像下面的查询那样合并 2 个表。 'table2' 有 15GB 数据。但它显示错误。我设置了 max-sql-memory=.80 但我不知道如何解决这个问题。 当我使用 limit 50000 option 执行此查询 时,它起作用了! 即使 'select * from table2' 也显示相同的错误。 我认为不知何故存在 select 瓶颈.... 此外,对于此查询,只有 3 个节点中的 1 个延迟上升是不寻常的。 (AWS EC2 i3.xlarge 类型)

▶ 查询
插入表 1 ( InvoiceID、PayerAccountId、LinkedAccountId、RecordType、RecordId、ProductName ) select InvoiceID、PayerAccountId、LinkedAccountId、RecordType、RecordId、ProductName 来自表 2;

▶ 错误: driver: 连接不良 警告:连接丢失! 打开新连接:所有 session 设置都将丢失

▶ 日志: W180919 04:59:20.452985 186 storage/raft_transport.go:465 [n3] 到节点 2 的 raft 传输流失败: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 = "transport: Error while dialing cannot reuse client connection"。正在重新连接...

如果我没有正确理解你的问题,那么你正在使用一条语句从 table2 中读取约 15GB 的数据并将其插入 table1。不幸的是,正如您所发现的那样,这是行不通的。请参阅 limits for a single statement,其中完全涵盖了这种情况。设置 --max-sql-memory=.80 无济于事,而且很可能会造成伤害,因为 CockroachDB 需要一些喘息的空间,因为我们的内存跟踪不精确。 "bad connection warning" 和您在日志中发现的错误都是 Cockroach 进程崩溃时出现的症状,大概是由于 运行 内存不足。

如果您需要以事务方式将数据从 table2 复制到 table1,那么此时您有点不走运。虽然您可以尝试使用显式事务并将单个 INSERT 语句分成多个语句,但您很可能 运行 进入事务大小限制。如果您可以处理以非事务方式执行复制,那么我建议将 INSERT 分成几部分。大致如下:

INSERT INTO table1 (...) SELECT ... FROM table2 WHERE InvoiceID > LIMIT 10000 RETURNING InvoiceID

这里的想法是以 10k 行为批次进行复制。您将使用 RETURNING InvoiceID 子句来跟踪复制的最后一个 InvoiceID 并从那里开始下一个插入。