以下的描述是我在“sql数据库中的两个表的记录进行比较!并将结果写入表中!”提问里的描述,现在我也实现了这个功能,不过是用Delphi+access实现,字段也没有那么多,但是记录多的时候可达10万条,所以,执行速度是关键!结果测算,我要实现所有的运算达到30小时左右,因此我要提的问题是如何提高这个速度?(我用的是ADO连接数据库的方式) 以下为我要实现的功能!大家可以看看我以前提的“sql数据库中的两个表的记录进行比较!并将结果写入表中!”问题。sql数据库中的两个表的记录进行比较!sql数据库中有A表和B表,字段结构相同,字段名称为NO,1,2,3,4,5,6,7,8,9,10等11个字段。A,B表中的数据是有a,b,c字符组成,其中A表中的记录是由单个字符构成(即a,b,c),B表中的记录是由单个或双个或三个字符构成(如a,b,c,ab,bc,ac,abc)。现比较A,B表的记录,如果A表的数据包含在B表中,则视为相同,统计A,B表中的字段有几个相同,并将统计的结果写入A表新增加的字段中。
也就是说A表的每条记录要和B表的每条记录进行比较,假设A表的第一条记录和B表的所有的800条记录进行比较,即得出800个结果,得出的结果写入A表第一条记录的后面,包括原来A表的11个字段加上得出的结果共有11+800=811个字段了。A表的其他记录如此依次和B表的记录进行比较,就可以得出最终的结果!
或者换一种方式,即A表的所有记录依次和B表的第一条记录开始比较,就得到一个字段(字段11)的结果,写入A表中。然后在和B表的第二条记录开始比较,得到字段12的结果,写入A表中,如此类推,直到和B表的最后一条记录比较完成,得到最后一个字段811。 如A表
NO 1 2 3 4 5 6 7 8 9 10
1 a c b b c a c c b a
2 b a b c b b a b c a
3 a c a b c b b c a c
4 c c a b a b c a c b
..........
10000 B表
NO 1 2 3 4 5 6 7 8 9 10
1 bc ab bc ac abc ac ab bc ac ab
2 ac abc ab bc ac ab ab bc abc ab
3 ab bc abc ab abc ac bc ac abc ac
4 abc ab bc bc ac ab ab ab ac bc
.......
800 得到的A表结果(共有7个字段相同)
NO 1 2 3 4 5 6 7 8 9 10 11 12 13 14...810
1 a c b b c a c c b a 5 9 10 5 ...
2 b a b c b b a b c a 9 8 5 8 ...
3 a c a b c b b c a c 4 9 9 7 ...
4 c c a b a b c a c b 4 8 7 7 ...
.......
10000 解释:
A表的第一条记录和B表的前面4条记录比较后的结果为5,9,10,5 写入A表的11,12 ,13,14字段里,A表的第二条记录和B表的前面4条记录比较后的结果为9,8,5,8 写入A表的11,12 ,13,14字段里, A表的第三条记录和B表的前面4条记录比较后的结果为4,9,9,7写入A表的11,12 ,13,14字段里,A表的第二条记录和B表的前面4条记录比较后的结果为4,8,7,7 写入A表的11,12 ,13,14字段里。
或者用我说的第二个方式,先得出字段11的值,然后是字段12的值,依此类推... A表有1万条记录,B表中有800条记录,A表中的每条记录和B表中的每条记录进行比较,A表的每条记录和B表800条记录比较后把比较结果写到A表记录新增的800条字段里进行存储。
也就是说A表的每条记录要和B表的每条记录进行比较,假设A表的第一条记录和B表的所有的800条记录进行比较,即得出800个结果,得出的结果写入A表第一条记录的后面,包括原来A表的11个字段加上得出的结果共有11+800=811个字段了。A表的其他记录如此依次和B表的记录进行比较,就可以得出最终的结果!
或者换一种方式,即A表的所有记录依次和B表的第一条记录开始比较,就得到一个字段(字段11)的结果,写入A表中。然后在和B表的第二条记录开始比较,得到字段12的结果,写入A表中,如此类推,直到和B表的最后一条记录比较完成,得到最后一个字段811。 如A表
NO 1 2 3 4 5 6 7 8 9 10
1 a c b b c a c c b a
2 b a b c b b a b c a
3 a c a b c b b c a c
4 c c a b a b c a c b
..........
10000 B表
NO 1 2 3 4 5 6 7 8 9 10
1 bc ab bc ac abc ac ab bc ac ab
2 ac abc ab bc ac ab ab bc abc ab
3 ab bc abc ab abc ac bc ac abc ac
4 abc ab bc bc ac ab ab ab ac bc
.......
800 得到的A表结果(共有7个字段相同)
NO 1 2 3 4 5 6 7 8 9 10 11 12 13 14...810
1 a c b b c a c c b a 5 9 10 5 ...
2 b a b c b b a b c a 9 8 5 8 ...
3 a c a b c b b c a c 4 9 9 7 ...
4 c c a b a b c a c b 4 8 7 7 ...
.......
10000 解释:
A表的第一条记录和B表的前面4条记录比较后的结果为5,9,10,5 写入A表的11,12 ,13,14字段里,A表的第二条记录和B表的前面4条记录比较后的结果为9,8,5,8 写入A表的11,12 ,13,14字段里, A表的第三条记录和B表的前面4条记录比较后的结果为4,9,9,7写入A表的11,12 ,13,14字段里,A表的第二条记录和B表的前面4条记录比较后的结果为4,8,7,7 写入A表的11,12 ,13,14字段里。
或者用我说的第二个方式,先得出字段11的值,然后是字段12的值,依此类推... A表有1万条记录,B表中有800条记录,A表中的每条记录和B表中的每条记录进行比较,A表的每条记录和B表800条记录比较后把比较结果写到A表记录新增的800条字段里进行存储。
记录数这么多,access虽然能支持,恐怕也还是用sql200x吧
sql 语句尽可能要在sql server里优化好了再copy 在delphi的代码里!
Delphi里的ADOQuery1.Prepared:=true;设置为真执行效率高。
有时间的话看看李唯写的叫 ado详解 时间太长了,有点记不清了,专门讲的ADO对象