如何提高ADO.NET中大规模插入的速度?

如何提高ADO.NET中大规模插入的速度?,.net,system.data.sqlite,advantage-database-server,.net,System.data.sqlite,Advantage Database Server,我下载了AdvancedDatabaseServer(ADS)10.1的试用版,以及ARC和ADO.NET提供程序。我的主要目的是了解与SQLite.NET相比,从数百万条记录中插入大量内容的性能(http://sqlite.phxsoftware.com/) 在ADS中,30分钟内加载了700万条条目 在Sqlite for.NET中,在不到3分钟的时间内加载了700万个相同的条目 为什么??如何提高.NET提供商的广告速度 问候 编辑 感谢您的建议,在ADS代码中,我错误地包含了一些索引的创

我下载了AdvancedDatabaseServer(ADS)10.1的试用版,以及ARC和ADO.NET提供程序。我的主要目的是了解与SQLite.NET相比,从数百万条记录中插入大量内容的性能(http://sqlite.phxsoftware.com/)

在ADS中,30分钟内加载了700万条条目

在Sqlite for.NET中,在不到3分钟的时间内加载了700万个相同的条目

为什么??如何提高.NET提供商的广告速度

问候

编辑 感谢您的建议,在ADS代码中,我错误地包含了一些索引的创建,当我取消此操作时,加载时间为10分钟

让我添加一些示例代码和示例数据(您可以将它们相乘,直到得到700万个条目)。如果您能找到提高和优化性能的方法,请告诉我

SYBASE广告代码:

 public void LoadAds(string opt, string file)
    {
        AdsConnection conn = new AdsConnection(@"data source=C:\apps\dataApps\cmpExistenc\inv.ads;" +
            "ServerType=local; TableType=ADT");
        conn.Open();
        var stV = new st();
        var dicTxt = new Dictionary<object, st>();
        if (opt.ToUpper() == "C")
        {
            using (AdsCommand cmd = conn.CreateCommand())
            {
                try
                {
                    cmd.CommandText = "DROP TABLE lbl; DROP TABLE almlbl";
                    cmd.ExecuteNonQuery();
                }
                catch { }
                cmd.CommandText =
                    "CREATE TABLE lbl (alm varchar(4), alm2 varchar(4), " +
                       "mat varchar(18), ser varchar(20), fac varchar(18), almlbl varchar(10), " +
                       "cant integer, sts varchar(1), ser_2_20 varchar(20), rowid_sap integer, stsmat varchar(100));";
                cmd.ExecuteNonQuery();
                cmd.CommandText =
                    "CREATE TABLE almlbl (almlbl varchar(10), almlbltxt varchar(100), " +
                       "ciudad varchar(50));";
                cmd.ExecuteNonQuery();
            }
        }
        else
            using (AdsCommand cmdTxt = conn.CreateCommand())
            {
                cmdTxt.CommandText = "SELECT * from almlbl";
                AdsDataReader drT = cmdTxt.ExecuteReader();
                while (drT.Read())
                    dicTxt[drT[0]] = new st() { almlblTxt = drT[1], ciudad = drT[2] };
                drT.Dispose();
                cmdTxt.CommandText = "DELETE FROM almlbl";
                cmdTxt.ExecuteNonQuery();
            }


        using (AdsTransaction transac = conn.BeginTransaction())
        {
            AdsCommand cmd = conn.CreateCommand();
            cmd.Transaction = transac;
            AdsParameter param = cmd.CreateParameter();
            cmd = LibCorp.Ads.buildParmsFromTable("lbl", conn, transac);
            long regLei = 0;
            List<object> cols;
            try
            {
                StreamReader sr = new StreamReader(file, Encoding.Default);
                sr.ReadLine(); // Ignore title
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    if ((++regLei % 1000000) == 0)
                        o.show(string.Format(" lbl:{0}", regLei), tbx);
                    cols = new List<object>(line.Split('|'));
                    if (!dicTxt.ContainsKey((string)cols[5]))
                    {
                        stV.almlblTxt = cols[6];
                        stV.ciudad = cols[8];
                        dicTxt[cols[5]] = stV;
                    }
                    if (!cols[3].Equals("") && cols[3].ToString().Length > 18)
                        cols.Add(cols[3].ToString().Substring(1));
                    else
                        cols.Add(DBNull.Value);

                    cmd.Parameters[0].Value = cols[0];       // alm
                    cmd.Parameters[1].Value = cols[1];       // alm2
                    cmd.Parameters[2].Value = cols[2];       // mat
                    cmd.Parameters[3].Value = cols[3];       // ser
                    cmd.Parameters[4].Value = cols[4];       // fac
                    cmd.Parameters[5].Value = cols[5];       // almlbl
                    cmd.Parameters[6].Value = cols[7];       // cant
                    cmd.Parameters[7].Value = DBNull.Value;  // sts
                    cmd.Parameters[8].Value = cols[10];      // ser_2_20
                    cmd.Parameters[9].Value = DBNull.Value;  // rowid_sap
                    cmd.Parameters[10].Value = cols[9];      // stsmat
                    cmd.ExecuteNonQuery();
                }

                foreach (KeyValuePair<object, st> pair in dicTxt)
                {
                    cmd.CommandText = string.Format("INSERT INTO almlbl VALUES('{0}','{1}','{2}')",
                            pair.Key, pair.Value.almlblTxt, pair.Value.ciudad);
                    cmd.ExecuteNonQuery();
                }

                transac.Commit();
            }
            catch (Exception ex)
            {
                o.notify(string.Format("{0}\n\rSitio->{1}", ex, ex.TargetSite.Name));
            }
            finally
            {
                conn.Close();
            }

        }
    }
1030 | 8030 | ADAJKIUSD66K | | | | | 16 |阿拉木图达萨普鲁士特苏拉雷斯| 4 |班达普鲁士| ADA-KI-SD66K适配器MAIDIUM SD-66K 1030 | 8030 | BAT-KI-BPA101 | | | | | 16 |阿拉木图兰塔克鲁斯特苏拉雷斯| 5 |班达普鲁士| BAT-KI-BPA101贝特里萨酒店 1020 | 8020 | TARGESA/P|PC-GC79 | | | | 17 | Perritial CENTER | 9 | POCHASALTA | TARGESA/P|PC-GC79 TARGESA UNIVERSAL P PC GPRS Y WL 1010 | 8010 |塔吉塔/P|PC-GC79 | | | 1014 |领土北1 | 5 |帕帕斯|塔吉萨/P|PC-GC79塔吉塔通用P PC GPRS Y WL 1060 | 8060 |塔吉塔/P|PC-GC79 | | | | 1095 |阿拉木图州立大学| 1 |特罗诺萨德|塔吉萨/P|PC-GC79塔吉萨通用P PC GPRS Y WL

enter code here
问候


注意。

首先,确保在这两种情况下使用的事务和查询是相同的。第二,确保以相同的方式调用Insert查询-不要在一种情况下创建冗余(对于每个Insert调用)连接、查询或适配器对象,但在另一种情况下不创建冗余连接、查询或适配器对象。差别太大了。。。重要。

尝试删除事务。ADS事务不同于传统的RDBMS,需要更多的操作系统刷新操作(ADS不使用检查点)。没有事务处理,性能会更好

编辑注意到您正在使用本地服务器,因此我对该事务的评论与此无关。该死

另外,我不知道第二个循环(插入到almlbl中)涉及多少个循环,但是使用params更改为准备好的查询会有所帮助


很可能所有这些SQLite行都还不在磁盘上。我想有相当多的是在记忆中,并没有被刷新

也就是说,SQL Lite不是嵌入式的吗?它是服务器(这意味着调用通过网络层进行)?我建议在10-20个线程上并行插入。Hello TomTom,我配置了20个线程,但没有重要的增强,平均每插入100万个条目需要2分钟。UGEEN,我包括Sybase和.NET Sqlite的代码;我在PC中运行的代码非常相似,但是.NET Sqlite比Sybase更快。你好,Juliet,我发布了代码。值得一试的是限制事务的大小。我看到过一个例子,其中一个大的更改非常大,以至于需要花费很长时间才能在事务日志中写入一个巨大的条目。Jan,非常感谢你的评论,因为你可以看到Sqlite和ADS的代码条件相同,但Sqlite是目前最快的(至少是批量插入)。我想知道如何在我的程序中使用计数器来限制事务的大小?你好。杰里米,非常感谢你的回答,与lbl相比,almlbl表非常非常小。正如您所看到的,Sqlite和ADS都处于相同的代码条件下,并加载相同数量的记录。我认为ADS试图在不丢失数据方面保持安全,因此加载所需时间稍长(比Sqlite多5到6分钟,即700万条记录),但我从未遇到过Sqlite的问题。当做
COD_ALMACEN_SAP|COD_ALMACEN_SAP2|CODIGO_SAP|NRO_SERIE_INICIAL|NRO_INICIO_FACTURA|COD_ALMACEN|NOMBRE_ALMACEN|CANTIDAD|CIUDAD|NOMBRE_ARTICULO
enter code here