需要解决的问题:公司有个数据库A,里面有1200万条数据,其中有200万条是重复的。我想将这个数据库中的数据导到另一个数据库B中,但去掉重复的。
两个数据库的字段都为:ID(主键),file1(像枚举一样有200个左右值,可以重复),file2(不能有重复的值)。
思路:通过ado.net从数据库A循环取出每一条数据,然后判断B中是否有相同的数据了,如果没有插入,否则不插入。
性能问题:当数据库B中的数据少时性能还可以,但当数据量在10万以上查询是否已经有和file2字段一样的值得速度就慢下来了。请问我应该怎样设置数据库B上的索引和写个什么样的查询语句判断数据是否存在?并且以后在实际生产环境中会一直使用数据库B,几乎每秒都在进行查询file2字段是否已经存在相同的值,如果没有相同的值就插入新数据行的操作.
ps:我不是想问怎样导数据,我是想问在这种情况下应该建立什么索引,我目前在file2这个字段上建了个非聚集索引,整个表没有聚集索引。判断有没有重复的数据的sql语句为:select id from table2 where file2 = @file2
直接select 数据库A的数据 用group by 不就去重了吗?
--索引创建 Create index idx_file2 on TestTable(file2) Go --判断语句 IF EXISTS(SELECT 1 FROM TestTable WHERE file2='XXXX') BEGIN --不插入 select '不插入' END ELSE BEGIN --不插CODE select '插入' END
我是想问下在数据库B上应该建立什么索引?是在file2上建立聚集索引?还是在file2上建立非聚集索引?还是为了防止在file2上建立聚集索引后频繁插入数据来减小聚集索引的填充因子?
@勇攀高峰: 建立非聚集索引。不论建立什么索引总会产生碎片,定期重建索引即可。
可以尝试一下这个思路。
首先,从A库检索出需要插入的数据。直接通过两个数据库表关联(file2)或者再加上file1,帅选出需要增加的数据。
最后,select into即可。
先把数据整体读入内存的一个对象中,如LIst集合,然后在用linq循环其中的每一条。
不要每次都从数据库中查询单条数据再做比对,sql语句可以加lock,加快查询速度