【问题标题】:select bottleneck and insert into select doesn't work on cockroach db选择瓶颈并插入选择在蟑螂数据库上不起作用
【发布时间】:2019-02-23 05:14:29
【问题描述】:

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

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

▶ 错误: 司机:连接不良 警告:连接丢失! 打开新连接:所有会话设置都将丢失

▶ 日志: 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 =“传输:拨号时出错无法重用客户端连接”。正在重新连接...

【问题讨论】:

    标签: bulkinsert cockroachdb


    【解决方案1】:

    如果我正确理解了您的问题,您正在使用单个语句从 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

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

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2023-03-13
      • 2012-07-01
      • 1970-01-01
      相关资源
      最近更新 更多