10w条数据,先插入A表,再取出,并插入到B表(A,B表结构相同)
Mysql, SQL Server
A(bigint, char, char, char) 其中bigint由随机数发生器生成我试过了AddBatch,和直接使用PreparedStatement,效果均不佳
而写存储过程中,发现不便将java中动态生成的bigint赋给存储过程
因此只能赋一次,调一次,效率很低不知高手有什么好的解决办法?在线等!
Mysql, SQL Server
A(bigint, char, char, char) 其中bigint由随机数发生器生成我试过了AddBatch,和直接使用PreparedStatement,效果均不佳
而写存储过程中,发现不便将java中动态生成的bigint赋给存储过程
因此只能赋一次,调一次,效率很低不知高手有什么好的解决办法?在线等!
解决方案 »
- 求人给我定个学习计划啊
- 如何在网页上调用dll的接口?
- [SSH]关于AfterReturningAdvice的一个问题!!高手速进!!!
- 登陆后如何在没有任何操作的情况下超时注销SESSION
- apache urlrewrite 规则问题
- java.io.CharConversionException:ishexDigit问题!高手进来
- jsp页面如何做到只有通过登录页面才能访问,而不能在地址栏输入地址就可以访问?
- 如何实现可录入并有自动检索功能的下拉列表
- 急!请教高人!如何用网页动态配置数据库的.class文件?
- 如何取这样的数据?
- applet + socket server问题:外面主机上的client不能连接到applet server上
- 请教一个jsp插入mysql数据的问题
1。从a表select的时候每次尽量多select几个纪录,其实只有10w条记录尽可以一次全select到CachedRowSet里
2。不要一条一条的插,会很慢,对select处的结果处理生成一个sql文件,这个过程很快
3。去掉b的索引
4。命令行下一次执行这个sql文件
5。重建b的索引
createProcedure.append("Create procedure insertData ()");
createProcedure.append("BEGIN");
for(int i=1; i<30000; i++)
createProcedure.append(" Insert into A Values(" + String.valueOf(IDGen.genID()) + ", '2', '3', '4');");
createProcedure.append("END");
Statement stmt = conn.createStatement();
stmt.executeUpdate(createProcedure.toString()); CallableStatement cstmt = conn.prepareCall("{call insertData()}");
cstmt.executeUpdate();
cstmt.close();
我是生成一个sql StringBuilder,但是有3w条insert语句,这个String的构建就已经很慢了,大概10sec,然后preCall花了10secs,最后执行存储过程却只用了1sec
CREATE TABLE A
(UniqueColumn UNIQUEIDENTIFIER DEFAULT NEWID(),
col_A VARCHAR(10)
col_B VARCHAR(10)
col_C VARCHAR(10) )
GO
那你只需要 createProcedure.append(" Insert into A Values(" + " '2', '3', '4');");
再用过while语句.
Create procedure insertData ()
as
declare @iter int
set @iter=0
while @iter<20000
Insert into A Values( '2', '3', '4')
go
这个函数要去取网卡MAC地址,还要取计算机系统时间
虽然能绝对保持唯一性,但如果大量重复运行,应该是不行吧
(1)先插入:
Create procedure insertData as
BEGIN
Set nocount on;
declare @iter int;
set @iter=0;
while @iter<10000
Begin
Insert into A Values(NEWID(),'2','3','4');
select @iter=@iter+1;
End
create Unique index AID on A(id);
END
(2)再select出来插到b表里
String UpdSQL = "insert into b select * from a order by id asc";
Statement stmt = conn.createStatement();
stmt.execute(UpdSQL);
(3)最后删除a表数据
String DelSQL = "Truncate table a";
Statement stmt = conn.createStatement();
stmt.execute(DelSQL);Mysql:
(1) String InsSQL = "Insert into A Values (?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(InsSQL);
for (int i = 1; i <= 100000; i++) {
pstmt.setLong(1, IDGen.genID()); //好象Mysql没有GUID
pstmt.setString(2, "2");
pstmt.setString(3, "3");
pstmt.setString(4, "4");
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt = conn.prepareStatement("create Unique index AID on A(id)");
pstmt.executeUpdate();
(2),(3)如SQL Server高手看看还有什么能优化的否?
SQL Server 37.937 secs
Mysql 27.703 secs
create prco insertData
count out number;
Begin
count := 0;
while count<100000 loop
insert into A Values(IDGen.genID(), '2','3','4');
count := count + 1;
End loop;
End insertData;
大家看看还有没更好的办法