0

編集:

私はFluentNHibernateを使用しています。NHibernateとOracleDBを使用しているため、実行しているテストは次のとおりです。

    [Test]
    public void CanIInsertLargeVolumesOfDataToOracleInUnder5Mins()
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();
        var entities = GetEntities();

        using (var session = UnitOfStatelessWork.GetUnderlyingSession())
        {
            using (var transaction = session.BeginTransaction(IsolationLevel.ReadCommitted))
            {
                foreach (var entity in entities.Select(entity => new EntityObject(entity) {SomeProperty = 19675464.25M}))
                {
                    session.Insert(entity);
                }

                transaction.Commit();
            }
        }

        stopwatch.Stop();
        var time = stopwatch.Elapsed;
        Assert.IsTrue(time < TimeSpan.FromMinutes(5.0));
    }

私の接続文字列は次のようになります。

<connectionStrings>
  <add connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=some.service.com)));User ID=user;Password=user" name="OracleConnection" providerName="Oracle.DataAccess.Client" />
</connectionStrings>

SQL Serverについては、次の流暢な構成があります。

var fluentConfiguration = Fluently
            .Configure()
            .Database(MsSqlConfiguration.MsSql2005.ConnectionString(c => c.Is(connStr)))
            .Mappings(m => m.FluentMappings.AddFromAssembly(mappingAssembly));
        fluentConfiguration.ExposeConfiguration(f =>
                                                    {
                                                        f.SetProperty("generate_statistics", "false");
                                                        f.SetProperty("command_timeout", "60");
                                                        f.SetListener(ListenerType.PreInsert, new AuditEventListener());
                                                        f.SetListener(ListenerType.PreUpdate, new AuditEventListener());
                                                        f.SetProperty("adonet.batch_size", "1");
                                                        f.SetProperty("hibernate.order_inserts", "true");
                                                        f.SetProperty("hibernate.order_updates", "true");
                                                    });

次に、Oracleの場合:

var fluentConfiguration = Fluently
            .Configure()
            .Database(OracleClientConfiguration.Oracle10.AdoNetBatchSize(1000).ConnectionString(c => c.Is(connStr)))
            .Mappings(m => m.FluentMappings.AddFromAssembly(mappingAssembly));
        fluentConfiguration.ExposeConfiguration(f =>
                                                    {
                                                        f.SetProperty("generate_statistics", "false");
                                                        f.SetProperty("command_timeout", "60");
                                                        f.SetProperty("hibernate.connection.driver_class", "NHibernate.Driver.OracleDataClientDriver");
                                                        f.SetListener(ListenerType.PreInsert, new AuditEventListener());
                                                        f.SetListener(ListenerType.PreUpdate, new AuditEventListener());
                                                        f.SetProperty("hibernate.order_inserts", "true");
                                                        f.SetProperty("hibernate.order_updates", "true");
                                                    });

次に、両方のデータベースにステートレスセッションとバッチ処理を使用しており、約750000レコードをSQLDBに挿入できます。100秒。

Oracleでは、同じテストに約12分かかります。

誰かが私が見ていないギャップのあるエラーを見ますか?

4

1 に答える 1

0
  • ステートレス セッションはバッチ処理を使用しません
  • バッチサイズをオーバーライドしていますSetProperty("adonet.batch_size", "1")

したがって、バッチ処理はそれとは何の関係もありません。あなたのコードがどのように挿入を行っているかについて、さらに役立つ十分な情報がありません。

私の提案は、.net プロファイラーを使用して、時間が費やされている場所を特定することです。

于 2012-06-15T02:03:18.013 に答える