数据量很大大概有几百万条,有重复数据分别为 用户名,密码,性别,年龄  保存在一个txt中(五十多个G) 分别对应着数据库中的表 usermessage中的 username ,pwd, sex,age密码在插入时需要加密  Encryption(密码);怎样才能快速插入,我用传统的方法,程序运行了几天了才插入了不到十分之一.插入后要数据无重复,已username列为准

解决方案 »

  1.   

    先生成Exect文件,再用导入数据导入
      

  2.   

    BULK SQL  插入数据库后再去过滤掉重复的
      

  3.   

    你的“传统方法”不会是读取TXT一条,然后插入SQL一条吧先将部分TXT读取到缓存(记得好像有个谁搞过二进制读取TB级TXT)
    用数据库连接池,插入
      

  4.   

    重复的可以等到全部插入结束,然后在删除,用excel导入可以吗?
      

  5.   

    你的问题就在这里。每当插入一条记录时都要先查重,那么当然就会把原本5分钟干完的工作拖到10小时才能干完啦。你应该先导出一个没有重复记录的临时数据集合(以username排序,然后逐行记录导出,时判断username与最后导出的不重复——如果重复就跳过)。然后,创建一个没有任何索引(或主键、或唯一键)的表,把导出的记录傻瓜化地拷贝进去。最后,再为这个新表加上索引(或主键、或唯一键)。
      

  6.   


    所谓bulk copy它就是“先删除所有键、约束、触发器等等,然后拷贝记录,然后再重新启用这些东西”。这跟你自己向一个“没有任何键、约束、触发器的新数据库表”完成插入数据,是一样的。自己懂一些编程机制,可以免得被简单的东西给忽悠了,简单的东西你完全可以自己去实现并测试其效率。
      

  7.   

    数据库 导入有个平面源,直接可以将TXT导入到数据库中!
      

  8.   

    多条一起插入,例如5000条数据一起插入,语句为“Insert into xx values(...);Insert into xx values(...);...”,5000条数据组合好后,提交一次。
    具体的数字根据你程序来定,注意不过超过string对象的最大长度
      

  9.   

    如果你是从txt里面导入数据库的话,SQL语句:LOAD DATA LOCAL INFILE txt路径 INTO TABLE 表名  FIELDS TERMINATED BY ','  
    注:txt路径必须加转义符'\',@"C\\123.txt"  FIELDS TERMINATED BY ',' 这里的意思是逗号分割 
      

  10.   


    MSSQL SERVER自带功能  先导进去  然后再更新密码字段实现加密吧!
    http://www.hanwangtx.com/sql/201209_26516.html
      

  11.   

    先把txt分成多个,再导入,导入完整理
      

  12.   

    将txt转为excel然后直接导入。
      

  13.   

    首先,我们把数据加载到一个DataSet        DataSet ds = new DataSet();
            private void btLoadData_Click(object sender, EventArgs e)
            {
                string dataFile = "CustomersData.xml";
                ds.ReadXml(dataFile);
                bindingSource1.DataSource = ds;
                bindingSource1.DataMember = "Customers";
                dataGridView1.DataSource = bindingSource1;
                
            }
            /// <summary>
            /// 使用新的API,批量导入,这个速度很快,大约26毫秒,很显然,这种方式只写一次日志,不会为每一行写日志
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btBCP_Click(object sender, EventArgs e)
            {
                using (SqlConnection conn = new SqlConnection(GetConnectionString()))
                {
                    SqlBulkCopy bcp = new SqlBulkCopy(conn);
                    bcp.DestinationTableName = "Customers";
                    bcp.BatchSize = 100;//这是批尺寸可以调整
                    for (int i = 0; i < 11; i++)
                    {
                        bcp.ColumnMappings.Add(i, i);
                    }
                    TimeSpan startTime = System.Diagnostics.Process.GetCurrentProcess().UserProcessorTime;
                    conn.Open();
                    bcp.WriteToServer(ds.Tables[0]);
                    TimeSpan duration = System.Diagnostics.Process.GetCurrentProcess().UserProcessorTime.Subtract(startTime);
                    MessageBox.Show("已经全部插入成功,所用时间为" + duration.Milliseconds.ToString() + "毫秒");            }
            }
      

  14.   

    首先你可以把那个txt存成一个xml文件。
      

  15.   

    这个顶天了也只要几分钟吧? 先用SqlBulkCopy批量导入数据库临时表,然后SELECT DISTINCT一下,插入到目标的表就OK啦
      

  16.   

    sql server 2005以上   txt为ansi编码create table ......
    字段与txt中对应顺序一致bulk insert  表名
    from 'c:\1.txt'
    with(
         fieldterminator='\t',--tab分隔
         rowterminator='\n'--回车换行
        )
      

  17.   

    建议先将文件人工分为多个小文件,如1000个,再逐个导入.导入后再处理数据重复问题.
    50多g的文件,就是单纯从C硬盘copy到D硬盘,也需20分钟左右,sql server是否有对如此大文件的快速处理能力,
    如果中途出错,将前功尽弃.
    所以建议先分为多个小txt文件,对小文件试用楼上的各种导入方法,找出最优方法.
    全部文件数据导入后,再处理数据重复问题
      

  18.   

    什么数据库?
    sql server可以用批处理bcp导入,速度很快,字段以tab分割
      

  19.   

    要求不重复,你可以在name列建立主键,直接插就可以,主键要求不能重复,重复会报错,不理这个错误就好。
      

  20.   

    SqlBulkCopy  google下就知道了
      

  21.   

    方法不当的话,会慢到爆,记得上个礼拜一个小程序因为用了IndexOf,导致效率超低,最终不得不找其他办法
      

  22.   

    几分钟应该不太可能,单纯复制,如果是每秒100M,那50G要500秒,就是8分钟;如果是每秒50M,则要1000秒,就是16分钟。
    单纯插入数据库,我之前试过,当时的配置不记得了,好像一秒只能插入1000条左右记录。如果是一百万条,那就是要1000秒,也就是16分钟。
    所以估计差不多半个小时就可以完成了。
      

  23.   

    谢谢大家 解决了 用的  SqlBulkCopy  用了大概十几个小时吧  带加密的