"在数据库表中有张千万级数据量的表,现在有一个结构化数据文件大小约 10g,现在需要根据这个数据文件去比对数据库表,在表里做新增或者更新操作。每条记录有唯一主键。现在纠结有什么高效更新的方案吗? .."
在数据库表中有张千万级数据量的表,现在有一个结构化数据文件大小约 10g,现在需要根据这个数据文件去比对数据库表,在表里做新增或者更新操作。每条记录有唯一主键。现在纠结有什么高效更新的方案吗?😭
可以参考SPL 实践:异构库的数据比对中大数据量有主键的情况,找出新增或更新的记录,然后对应 insert、update 操作
针对这种情况是把表中数据拉下来离线比较好呢还是直接使用数据库游标呢。该怎么选择呢,还有我想知道数据库游标是把数据全拉下来在本地临时文件中存了吗? 因为我发现在使用数据库游标的时候日志好像有打印生成临时文件
好的谢谢!
1、数据库游标其实就是 jdbc 取数(相比读文件会慢),文件和文件的比较从整体上可能会更快(即使要先用数据库工具导出成文本)2、数据库游标本身不会产生临时文件
我有个疑问,可是我在创建游标的时候 (select * from orders orders 表 1000 万数据),去 mysql 查了执行的 sql,查的 processlist 表,发现显示执行的 sql 就是 select * from orders,而且在 spl 的 idea 中我游标创建的代码很慢,好像给我的感觉就是把所有数据都加载内存了,我为了验证这个想法,我去用游标 fetch 了 100 万条数据,然后立马又去查 mysql 的 processlist 表发现确实没有找到 select * from orders 这条 sql,这更加验证了我的猜想,我想知道这个数据库游标是在创建的时候就拉取所有的数据吗? 那拉取的数据是放哪儿了呢? 我甚至试了在创建完游标以后关闭数据库服务,可是我还是可以 fetch 到数据? 所以我感觉是直接拉取了所有数据,那游标的意义在哪里嘞,和我直接写 sql select * from orders 有啥区别呢?,我原本以为是拉取了所有数据存到了本地临时文件,可是您刚才也说了不会生成临时文件
在数据库中使用游标,可以每次返回部分数据,而不将所有结果同时读入内存。游标类似于一个指针,在读取时会通过移动指针的位置来从结果集中每次提取 1 条记录。游标逐条读取的机制常用来处理大数据表,这是因为受内存限制,大批数据往往不能一次全部读入内存。————游标概念
按您的描述,猜测可能和 mysql 本身有关,例如要 useCursorFetch=true 手动启用服务器端游标,您可以再从查询下 mysql 的相关信息。
感谢大佬我试了一下确实是这样,用了这个参数以后就好了。好坑啊是只有 mysql 会这样吗
不客气,碰巧有印象这个会影响,其他的也不太了解了
可以参考SPL 实践:异构库的数据比对中大数据量有主键的情况,找出新增或更新的记录,然后对应 insert、update 操作
针对这种情况是把表中数据拉下来离线比较好呢还是直接使用数据库游标呢。该怎么选择呢,还有我想知道数据库游标是把数据全拉下来在本地临时文件中存了吗? 因为我发现在使用数据库游标的时候日志好像有打印生成临时文件
好的谢谢!
1、数据库游标其实就是 jdbc 取数(相比读文件会慢),文件和文件的比较从整体上可能会更快(即使要先用数据库工具导出成文本)
2、数据库游标本身不会产生临时文件
我有个疑问,可是我在创建游标的时候 (select * from orders orders 表 1000 万数据),去 mysql 查了执行的 sql,查的 processlist 表,发现显示执行的 sql 就是 select * from orders,而且在 spl 的 idea 中我游标创建的代码很慢,好像给我的感觉就是把所有数据都加载内存了,我为了验证这个想法,我去用游标 fetch 了 100 万条数据,然后立马又去查 mysql 的 processlist 表发现确实没有找到 select * from orders 这条 sql,这更加验证了我的猜想,我想知道这个数据库游标是在创建的时候就拉取所有的数据吗? 那拉取的数据是放哪儿了呢? 我甚至试了在创建完游标以后关闭数据库服务,可是我还是可以 fetch 到数据? 所以我感觉是直接拉取了所有数据,那游标的意义在哪里嘞,和我直接写 sql select * from orders 有啥区别呢?,我原本以为是拉取了所有数据存到了本地临时文件,可是您刚才也说了不会生成临时文件
在数据库中使用游标,可以每次返回部分数据,而不将所有结果同时读入内存。游标类似于一个指针,在读取时会通过移动指针的位置来从结果集中每次提取 1 条记录。游标逐条读取的机制常用来处理大数据表,这是因为受内存限制,大批数据往往不能一次全部读入内存。————游标概念
按您的描述,猜测可能和 mysql 本身有关,例如要 useCursorFetch=true 手动启用服务器端游标,您可以再从查询下 mysql 的相关信息。
感谢大佬我试了一下确实是这样,用了这个参数以后就好了。好坑啊是只有 mysql 会这样吗
不客气,碰巧有印象这个会影响,其他的也不太了解了