【问题标题】:Optimize inserts优化刀片
【发布时间】:2010-03-18 16:06:39
【问题描述】:

我在 VB .Net 中做了一个导入程序,女巫从 SQLServer 获取数据,然后通过 ADSL 连接将这些数据插入到远程 MySQL 服务器中。

最初是 200 条记录,但现在有超过 500.000 条记录,导出所有数据需要花费 11 个小时,这很糟糕,非常糟糕。

我需要优化我的导入器,现在将数据放入数据表中,并且我有一个带有循环(行到行)的函数,通过“插入”查询插入数据... 像这样:

            For Each dr As DataRow In dt.Rows
            Console.Write(".")

            Dim sql As String = "INSERT INTO clientes(id,nombrefis,nombrecom,direccion,codpos,municipio_id,telefono,fax,cif)" & _
                        "VALUES (@id,@nombrefis,@nombrecom,@direccion,@codpos,@municipio_id,@telefono,@fax,@cif)"
            cmd = New MySqlCommand(sql, cnn)
            cmd.Parameters.AddWithValue("id", Int32.Parse(dr("ID EMPRESA").ToString))
            cmd.Parameters.AddWithValue("nombrefis", dr("NOMEMP"))
            cmd.Parameters.AddWithValue("nombrecom", dr("EMPRESA"))
            cmd.Parameters.AddWithValue("direccion", dr("DIRECC"))
            cmd.Parameters.AddWithValue("codpos", dr("CODPOS"))
            cmd.Parameters.AddWithValue("municipio_id", Int32.Parse(dr("CODIGO MUNICIPIO")).ToString)
            cmd.Parameters.AddWithValue("telefono", dr("TELEF"))
            cmd.Parameters.AddWithValue("fax", dr("FAX"))
            cmd.Parameters.AddWithValue("cif", dr("CIF"))
            cmd.ExecuteNonQuery()
        Next

有什么想法或建议吗? 非常感谢

【问题讨论】:

    标签: .net mysql sql-server


    【解决方案1】:
    1. 在循环之前创建命令、添加参数并准备命令(Prepare 方法)。然后,在循环中,设置参数值并执行命令
    2. 以 1000 条左右的命令批量执行事务中的命令

    编辑:我刚刚意识到您正在使用 MySQL...所以除非您使用 InnoDB 表,否则您不能使用事务。无论如何,你仍然可以使用我的第一个建议,这样命令只准备一次

    【讨论】:

    • 嘿!感谢您的回答!但是 prepare 方法会更快地成为我的应用程序吗?是的...我的表类型是 MyISAM,但如果它代表更快地成为我的应用程序,我可以更改它。还是谢谢!
    • 是的,提前准备好语句可能会提高性能(至少稍微提高一点)。我不太确定这笔交易,您必须尝试一下...
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 2015-11-28
    • 1970-01-01
    • 2020-03-05
    • 2016-03-18
    • 2018-01-17
    • 2015-11-08
    • 2019-01-31
    相关资源
    最近更新 更多