avatar
y*w
2
从jdbc的result set往表中插入记录,假设类型等meta data完全匹配,怎么效率最高?
1. 循环里挨条差。小应用无所谓,数据量大了就傻眼。
2. 构造insert语句同时插入多条记录,比如100条,这个100可以参数化,可以自动评
估,注意避免sql语句的长度limit。
3. 生成临时(内存)文件,然后批处理load/bcp等。
大家有啥想法?
avatar
m*o
3
Consider the following C++ program declarations for a linked-list class:
class Node {
friend class LinkedList;
int value;
Node* next;
Node() {next = 0;}
}
class LinkedList {
Node* head;
Public:
LinkedList() { head = 0; }
bool addElement(Node * newElement);
...
}
An instance of class LinkedList is to be used to maintain a sorted list.
Write function LinkedList::addElement(Node * newElement) which inserts
newElement into the linked list at the appropriate location and returns
false
avatar
s*w
4
超爱这首歌啊!
avatar
B*g
5
首先,你非药用JDBC吗?hibernate行不行?
数据有先后顺序吗?如果没有,是否考虑多现成?
用sql insert的话至少要batch吧.

高?

【在 y****w 的大作中提到】
: 从jdbc的result set往表中插入记录,假设类型等meta data完全匹配,怎么效率最高?
: 1. 循环里挨条差。小应用无所谓,数据量大了就傻眼。
: 2. 构造insert语句同时插入多条记录,比如100条,这个100可以参数化,可以自动评
: 估,注意避免sql语句的长度limit。
: 3. 生成临时(内存)文件,然后批处理load/bcp等。
: 大家有啥想法?

avatar
d*d
6
这个题很一般啊,好像没什么tricky啊?你要问什么?

【在 m*******o 的大作中提到】
: Consider the following C++ program declarations for a linked-list class:
: class Node {
: friend class LinkedList;
: int value;
: Node* next;
: Node() {next = 0;}
: }
: class LinkedList {
: Node* head;
: Public:

avatar
b*t
7
me too ;-) 这里的知音真多..

【在 s*******w 的大作中提到】
: 超爱这首歌啊!
avatar
y*w
8
不一定jdbc,用c api也可以。
数据不分先后。多线程没问题,如果做通用方案就有个锁的问题; 套个provider/
consumer的pattern实现方面还好.
数据量,假设我有800M records吧。

【在 B*****g 的大作中提到】
: 首先,你非药用JDBC吗?hibernate行不行?
: 数据有先后顺序吗?如果没有,是否考虑多现成?
: 用sql insert的话至少要batch吧.
:
: 高?

avatar
t*t
9
对于这种直接贴题的我都忽略

【在 d*******d 的大作中提到】
: 这个题很一般啊,好像没什么tricky啊?你要问什么?
avatar
t*m
10
我也很喜欢这首歌。
1996年前的Celine Deion真好听。
avatar
y*w
11
btw, 对hibernate的性能不信任,如果它能搞定我100条一插估计也能比它好些。关键
还是数据量。

【在 B*****g 的大作中提到】
: 首先,你非药用JDBC吗?hibernate行不行?
: 数据有先后顺序吗?如果没有,是否考虑多现成?
: 用sql insert的话至少要batch吧.
:
: 高?

avatar
s*e
12
这些都是Knight Capital Group的Electronic Trading Group
的Developer candidate screening questions吧。
人家都说了要你自己做了。Please keep them PRIVATE。

Consider the following C++ program declarations for a linked-list class:
class Node {
friend class LinkedList;
int value;
Node* next;
Node() {next = 0;}
}
class LinkedList {
Node* head;
Public:
LinkedList() { head = 0; }
bool addElement(Node * newElement);
...
}
An instance of class LinkedList is to be used to maintain a sorted list.
Write function Li

【在 m*******o 的大作中提到】
: Consider the following C++ program declarations for a linked-list class:
: class Node {
: friend class LinkedList;
: int value;
: Node* next;
: Node() {next = 0;}
: }
: class LinkedList {
: Node* head;
: Public:

avatar
b*t
13
同感.

【在 t*m 的大作中提到】
: 我也很喜欢这首歌。
: 1996年前的Celine Deion真好听。

avatar
w*r
14
800M, yo bet you need to use loader tool
parallel insert may get the record in, but later table maintenance is issue:
i.e. how record scattered to different disk blocks, data block splitting ,
indexing data file fragment, reorg table etcetc.

【在 y****w 的大作中提到】
: 不一定jdbc,用c api也可以。
: 数据不分先后。多线程没问题,如果做通用方案就有个锁的问题; 套个provider/
: consumer的pattern实现方面还好.
: 数据量,假设我有800M records吧。

avatar
t*t
15
倒也不一定是那里的题, 类似的题在网上很久了.

【在 s******e 的大作中提到】
: 这些都是Knight Capital Group的Electronic Trading Group
: 的Developer candidate screening questions吧。
: 人家都说了要你自己做了。Please keep them PRIVATE。
:
: Consider the following C++ program declarations for a linked-list class:
: class Node {
: friend class LinkedList;
: int value;
: Node* next;
: Node() {next = 0;}

avatar
y*w
16
loader工具对insert的优势也不在fragment这方面。这里处理大数据就suppose没那么其他东西来捣乱,乱是乱不了的,就是乱了也不怕,这很容易控制和纠正,
loader的问题是怎么和内存(cursor)挂接起来,没有方便的api。似乎只能通过文件(哪怕是内存文件)中转下。
800M是一个极端,就是讲效率必须被重视。
btw, staging表暂时禁用log也是有价值的。

issue:
,

【在 w*r 的大作中提到】
: 800M, yo bet you need to use loader tool
: parallel insert may get the record in, but later table maintenance is issue:
: i.e. how record scattered to different disk blocks, data block splitting ,
: indexing data file fragment, reorg table etcetc.

avatar
s*e
17
他问的两题都是一模一样的screening questions。
我前几天刚刚做过,赫赫。一个小的hedge fund。

【在 t****t 的大作中提到】
: 倒也不一定是那里的题, 类似的题在网上很久了.
avatar
w*r
18
其他的我不知道,TD上面就有这个问题,你做很多 parallel insert, 如果target
table data block 64K, 很容易出现很多small data block, fragment. 做完了,我
还得在做一个insert/select..
如果loader, 一定木的这个问题
redo/undo log在loader里面直接disable,如果SQL, 每个trsanction 都在生成redo/
undo log (journal in teradata).
内存挂钩有很多tool , 直接用informatica 处理,nongstaged loader (named pipe
under unix)不就是你说的挂钩了?

么其他东西来捣乱,乱是乱不了的,就是乱了也不怕,这很容易控制和纠正,
(哪怕是内存文件)中转下。

【在 y****w 的大作中提到】
: loader工具对insert的优势也不在fragment这方面。这里处理大数据就suppose没那么其他东西来捣乱,乱是乱不了的,就是乱了也不怕,这很容易控制和纠正,
: loader的问题是怎么和内存(cursor)挂接起来,没有方便的api。似乎只能通过文件(哪怕是内存文件)中转下。
: 800M是一个极端,就是讲效率必须被重视。
: btw, staging表暂时禁用log也是有价值的。
:
: issue:
: ,

avatar
S*g
19
都是经典书目里的经典内容

【在 t****t 的大作中提到】
: 对于这种直接贴题的我都忽略
avatar
y*w
20
不太懂TD. loader这方面一定好,毫无疑问。
我现在倾向于还是写文件出来了再调用load api了。也许可以做成几种可选的模式,只在超大表上这么搞。 不是太夸张的碎片大多数还是可以忍受的。
不能直接用load api的原因主要是source和target不同构。

【在 w*r 的大作中提到】
: 其他的我不知道,TD上面就有这个问题,你做很多 parallel insert, 如果target
: table data block 64K, 很容易出现很多small data block, fragment. 做完了,我
: 还得在做一个insert/select..
: 如果loader, 一定木的这个问题
: redo/undo log在loader里面直接disable,如果SQL, 每个trsanction 都在生成redo/
: undo log (journal in teradata).
: 内存挂钩有很多tool , 直接用informatica 处理,nongstaged loader (named pipe
: under unix)不就是你说的挂钩了?
:
: 么其他东西来捣乱,乱是乱不了的,就是乱了也不怕,这很容易控制和纠正,

avatar
m*o
21
没想到大家都准备得那么充分啊
avatar
w*r
22
市场上成熟的软件(data stage/informatica/abintio)解决这种mapping的问题
都是point/click的mapping editor
call api这些软件也都做到了,

只在超大表上这么搞。 不是太夸张的碎片大多数还是可以忍受的。

【在 y****w 的大作中提到】
: 不太懂TD. loader这方面一定好,毫无疑问。
: 我现在倾向于还是写文件出来了再调用load api了。也许可以做成几种可选的模式,只在超大表上这么搞。 不是太夸张的碎片大多数还是可以忍受的。
: 不能直接用load api的原因主要是source和target不同构。

avatar
y*w
23
1.处于抠门模式的...
2.ETL工具作这块更重视通用性,方便开发,速度说不上多好吧。
现在我想的就是弄个小的,对特定应用优化的冬冬。这些大型工具是不合适的。

【在 w*r 的大作中提到】
: 市场上成熟的软件(data stage/informatica/abintio)解决这种mapping的问题
: 都是point/click的mapping editor
: call api这些软件也都做到了,
:
: 只在超大表上这么搞。 不是太夸张的碎片大多数还是可以忍受的。

avatar
g*l
24
巨量插入删除还是要ETL的软件,或者BCP,否则光LOG也把数据库搞死了。我觉得自己编
的BATCH软件就是垃圾,就应该全部LOAD进STAGING TABLE,然后用SP去VALIDATE,全通
过的用FAST TABLE LOAD LOAD进去,一边LOAD一边VALIDATE,要猴年马月才能LOAD完啊
avatar
y*w
25
那就考虑下etl软件是怎么实现这块的吧,
btw,不用validate,纯数据插入问题。

【在 g***l 的大作中提到】
: 巨量插入删除还是要ETL的软件,或者BCP,否则光LOG也把数据库搞死了。我觉得自己编
: 的BATCH软件就是垃圾,就应该全部LOAD进STAGING TABLE,然后用SP去VALIDATE,全通
: 过的用FAST TABLE LOAD LOAD进去,一边LOAD一边VALIDATE,要猴年马月才能LOAD完啊
: 。

avatar
g*l
26
最快BCP,SSIS有FAST TABLE LOAD,以前有DTS的,基本原则是数据已经VALIDATE了,
不LOG,这样才能快速LOAD进去,DW都是这么LOAD的

【在 y****w 的大作中提到】
: 那就考虑下etl软件是怎么实现这块的吧,
: btw,不用validate,纯数据插入问题。

avatar
y*w
27
;)好像话题已经引偏太多了。

【在 g***l 的大作中提到】
: 最快BCP,SSIS有FAST TABLE LOAD,以前有DTS的,基本原则是数据已经VALIDATE了,
: 不LOG,这样才能快速LOAD进去,DW都是这么LOAD的

avatar
g*l
28
你说那种小打小闹地INSERT点吧,一行两行的,RECORD多了还是去CALL STORED
PROCEDURE吧,否则慢就一个字。

【在 y****w 的大作中提到】
: ;)好像话题已经引偏太多了。
avatar
y*w
29
我的初始方案就有批处理,或分批load了。还是缺少新idea.
思维先调转90度,把自己放到etl工具厂商的角度去看这个问题。
从我几个地方得到的反馈看,也很难有很创意的idea了。
有些地方只是自己需要打磨把匕首,用不着去花钱买坦克。

【在 g***l 的大作中提到】
: 你说那种小打小闹地INSERT点吧,一行两行的,RECORD多了还是去CALL STORED
: PROCEDURE吧,否则慢就一个字。

avatar
a*y
30
恩,数据量大了就傻眼.想想银行那么多客户.听说过某人帐户里突然出现几万美金的好
事,哎,怎么就轮不到我涅?

高?

【在 y****w 的大作中提到】
: 从jdbc的result set往表中插入记录,假设类型等meta data完全匹配,怎么效率最高?
: 1. 循环里挨条差。小应用无所谓,数据量大了就傻眼。
: 2. 构造insert语句同时插入多条记录,比如100条,这个100可以参数化,可以自动评
: 估,注意避免sql语句的长度limit。
: 3. 生成临时(内存)文件,然后批处理load/bcp等。
: 大家有啥想法?

avatar
m*y
31
可以试试把所有要insert/update的record做成xml file, 然后写个stored proc, 用sp
_xml_preparedocument and OPENXML把所有records弄到temp table/table variable去
, 然后做batch update/insert. 当然可以省中间一部,但是records太多可能会引起
blocking.
avatar
g*l
32
XML,慢死人的,千万别用XML,FILE直接DTS进TABLE,TABLE之间DTS快的多,DB
PROGRAMMER抢了VB PROGRAMMER的饭碗,VB PROGRAMMER现在基本没饭吃了。

sp

【在 m******y 的大作中提到】
: 可以试试把所有要insert/update的record做成xml file, 然后写个stored proc, 用sp
: _xml_preparedocument and OPENXML把所有records弄到temp table/table variable去
: , 然后做batch update/insert. 当然可以省中间一部,但是records太多可能会引起
: blocking.

avatar
m*y
33
很多时候你没法多DTS的,我们用XML实时处理一些银行的settlement reponse file还
是可以的。

【在 g***l 的大作中提到】
: XML,慢死人的,千万别用XML,FILE直接DTS进TABLE,TABLE之间DTS快的多,DB
: PROGRAMMER抢了VB PROGRAMMER的饭碗,VB PROGRAMMER现在基本没饭吃了。
:
: sp

avatar
B*g
34
VB没饭吃了和DB没啥关系吧,GO JAVA!!

【在 g***l 的大作中提到】
: XML,慢死人的,千万别用XML,FILE直接DTS进TABLE,TABLE之间DTS快的多,DB
: PROGRAMMER抢了VB PROGRAMMER的饭碗,VB PROGRAMMER现在基本没饭吃了。
:
: sp

avatar
g*l
35
JAVA编出的东西都跟蜗牛一样,LOL

【在 B*****g 的大作中提到】
: VB没饭吃了和DB没啥关系吧,GO JAVA!!
avatar
v*r
36
假如后台是 Oracle, client 用 jdbc load data 的话,效率最高的应该是用 jdbc 的
batch operation + bind variable, 基本上能达到 pl/sql 的bulk insert 的
performance。
你说的2 好像是这个意思,但没提到 bind variable,你可以 不用 bind variable 来
batch 100 条 record inserts, the only thing you save comparing with "no
batch" is a little bit less network traffic for sending requests, 不会有什么
performance 提高,只有同时用 bind variable, oracle 才能 bind all 100 input
values,then execute them as one run inside sql engine,. Bulk size 100 有点
低,我一般 500 起。做benchmark 的时候,你应该很容易找到一个最适合你 server
的 bulk size.
对SQLServer 不甚了解,但tsql 的 bulk insert syntax 好像是从file 里load data,
不知道 jdbc for sqlserver 能否 interact with sql engine directly in
sqlserver (like the case of oracle). 如果非要用 data file 的活,oracle 有更
快更方便的方法来 load, jdbc 就没必要了。

高?

【在 y****w 的大作中提到】
: 从jdbc的result set往表中插入记录,假设类型等meta data完全匹配,怎么效率最高?
: 1. 循环里挨条差。小应用无所谓,数据量大了就傻眼。
: 2. 构造insert语句同时插入多条记录,比如100条,这个100可以参数化,可以自动评
: 估,注意避免sql语句的长度limit。
: 3. 生成临时(内存)文件,然后批处理load/bcp等。
: 大家有啥想法?

avatar
v*r
37
这绝对是误解

【在 g***l 的大作中提到】
: JAVA编出的东西都跟蜗牛一样,LOL
avatar
B*g
38
java编出来的东西蓝是因为蓝java developer太多了。

【在 v*****r 的大作中提到】
: 这绝对是误解
avatar
y*w
39
good point. 这个我这几天也在考虑,不过没有做实验验证过。毕竟我不是programmer
,这些也就是,思考思考。
argument:
1. executeBatch是成批将sql语句送到dbms执行,节省反复传送大批sql语句的时间,
是否本地执行就可能有比较大区别。
2. dbms这边这些insert还是单行插入的。数据库寻找slot,插入,logging等cost跑不
了,也很零碎。这是自己组装大型sql语句的考虑。与1相比,假如batch size相同,性
能应该更有优势。
3. 将executeBatch与组装大型sql语句结合。这是我目前最倾向的方案,对于中等规模
的数据。应该能够有不错的性能,关键是够简洁,也可配置。
其他可以加进来的是a) 流水。引进一个provider/consumer模式并不难。 b) 很容易扩
展a支持并发。
对大型数据,还是包装loader合适。
btw,我只是想讨论下这块的实现技术。即便说ssis之类,这些工具把数据倒到内村里也要考虑怎么做,所以就假设你自己在实现一个c或者java版本的ssis好了。

input

【在 v*****r 的大作中提到】
: 假如后台是 Oracle, client 用 jdbc load data 的话,效率最高的应该是用 jdbc 的
: batch operation + bind variable, 基本上能达到 pl/sql 的bulk insert 的
: performance。
: 你说的2 好像是这个意思,但没提到 bind variable,你可以 不用 bind variable 来
: batch 100 条 record inserts, the only thing you save comparing with "no
: batch" is a little bit less network traffic for sending requests, 不会有什么
: performance 提高,只有同时用 bind variable, oracle 才能 bind all 100 input
: values,then execute them as one run inside sql engine,. Bulk size 100 有点
: 低,我一般 500 起。做benchmark 的时候,你应该很容易找到一个最适合你 server
: 的 bulk size.

avatar
y*w
40
作为db guy, doubt你这个结论:)
数据库单条插入和分组插入的性能差的不是一点半点。100个prepare包含100行数据的
insert,比10000个数据库插入的额外成本一般情况下要少多了。

来: batch 100 条 record inserts, the only thing you save comparing with "no

【在 v*****r 的大作中提到】
: 这绝对是误解
avatar
y*w
41
现在的java已经很不错了,需要用c/c++来改善性能瓶颈的地方越来越少了。十年前到
现在,我一直算是c/c++的坚定fans,但现在需要做些什么脚本搞不定的东西,还是越
来越多借重Java了。做database,有时候想搞点什么工具类的东西时,c/c++的往往api
要更丰富些。

【在 B*****g 的大作中提到】
: java编出来的东西蓝是因为蓝java developer太多了。
avatar
g*l
42
关键不是这个,是LOG,有LOG就慢,因为要考虑TRANSSACTION失败ROLLBACK,所以不管
你是一个一个的插还是一组一组的插都好不到哪里去。

no

【在 y****w 的大作中提到】
: 作为db guy, doubt你这个结论:)
: 数据库单条插入和分组插入的性能差的不是一点半点。100个prepare包含100行数据的
: insert,比10000个数据库插入的额外成本一般情况下要少多了。
:
: 来: batch 100 条 record inserts, the only thing you save comparing with "no

avatar
y*w
43
人就不兴做几个针对性版本么。再说,不是所有dbms都不能暂时禁用表logging的。
你一直在讲工具。是我没说清楚,我们在讨论的是,假如你在做这个工具,你怎么处理。有多少已知的api可以借用。ssis或者其他什么federation tool是怎么实现的?这些也许有些地方有文档透露些痕迹,有些只能去猜测。

【在 g***l 的大作中提到】
: 关键不是这个,是LOG,有LOG就慢,因为要考虑TRANSSACTION失败ROLLBACK,所以不管
: 你是一个一个的插还是一组一组的插都好不到哪里去。
:
: no

avatar
y*w
44
insert相对load最慢的地方还不是logging -- 虽然整天有培训师在那么讲"因为没有
logging" -- 而是寻址插入的开销。简单的说,这个数据插入是不是必须经过sql引擎
以及批量大小。
问题是,如果我们需要这种load的机制,如何借用?如何接近?这是真正要思考的问题
。至于用工具,那是系统集成问题,不是我想讨论的东西。

【在 g***l 的大作中提到】
: 关键不是这个,是LOG,有LOG就慢,因为要考虑TRANSSACTION失败ROLLBACK,所以不管
: 你是一个一个的插还是一组一组的插都好不到哪里去。
:
: no

avatar
g*l
45
太高深了,不懂了,撤了。

【在 y****w 的大作中提到】
: insert相对load最慢的地方还不是logging -- 虽然整天有培训师在那么讲"因为没有
: logging" -- 而是寻址插入的开销。简单的说,这个数据插入是不是必须经过sql引擎
: 以及批量大小。
: 问题是,如果我们需要这种load的机制,如何借用?如何接近?这是真正要思考的问题
: 。至于用工具,那是系统集成问题,不是我想讨论的东西。

avatar
y*w
46
是我开始没说清楚,我那两个帖子其实到底真正想搞清楚的是一回事儿,即在公开的编
程接口上,我们能怎样接近厂商的工具,或者厂商给我们提供的接口能提供多高的性能
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。