【发布时间】:2013-07-25 14:12:06
【问题描述】:
我需要休眠来生成像这样INSERT INTO table_a (a_id, a_name) VALUES (5, 'a5'),(6, 'a6');这样的sql。
使用这样的 sql,您可以使用 1 条语句添加 2 行。我可以得到
a_id, a_name
------------------
5 a5
6 a6
在hibernate中,当你保存一组一对多关系时,hibernate会插入multiple insert statement。如果您使用 HQL 将 1000 行插入到 1 个表中,这将导致如下结果:
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1, 'a');
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (2, 'a');
....
...
..
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1000, 'a');
经过的时间是:
Executed 1,000 queries; elapsed time (seconds) - Total: 0.78, SQL query: 0.78, Building output: 0
当我使用相同的值进行测试时,使用 SQL INSERT INTO table_a (a_id, a_name) VALUES (5, 'a'),(6, 'a'),(),...,...,(1000, 'a'); 将导致这样的经过时间:
Query 1 of 1, Rows read: 0, Elapsed time (seconds) - Total: 0.02, SQL query: 0.02, Building output: 0
我的测试结果是,1000 个值(0.02 秒)的 1 个语句将比 1000 个插入语句快 39 倍,每个语句都有 1 个值(0.78 秒),就像休眠一样。那么有没有一种方法可以让 HQL 生成类似用于插入或更新的 SQL。或者这意味着我们必须重写休眠方言?
感谢任何提示
【问题讨论】:
标签: mysql performance hibernate optimization hql