2

私はストアド プロシージャを作成しています。このストアド プロシージャは、完了するとステージング テーブルをスキャンして偽のデータを列ごとにスキャンするために使用されます。

演習のステップ 1 は、テーブルをスキャンすることでした --- 以下のコードは、これを実行します。問題は、このコードが 5:45 秒で実行されることです --- ただし、コンソール アプリとして実行される同じコード (もちろん、接続文字列を変更します) は約 44 秒で実行されます。

    using (SqlConnection sqlConnection = new SqlConnection("context connection=true"))
    {
        sqlConnection.Open();
        string sqlText = string.Format("select * from {0}", source_table.Value);
        int count = 0;
        using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection))
        {
            SqlDataReader reader = sqlCommand.ExecuteReader();
            while (reader.Read())
                count++;
            SqlDataRecord record = new SqlDataRecord(new SqlMetaData("rowcount", SqlDbType.Int));
            SqlContext.Pipe.SendResultsStart(record);
            record.SetInt32(0, count);
            SqlContext.Pipe.SendResultsRow(record);
            SqlContext.Pipe.SendResultsEnd();
        }
    }

ただし、同じコード (もちろん異なる接続文字列) がコンソール アプリで約 44 秒で実行されます (これは、クライアント側で期待していたものに近いです)。

SP側で何が欠けているので、実行が非常に遅くなります。

注: 行数が必要な場合は、count(*) 集計を使用する必要があることを十分に理解しています。これは、この演習の目的ではありません。

4

2 に答える 2

1

結局、答えは接続文字列にあるようです。

context connection=true

server=(local); database=foo; integrated security=true

なんらかの奇妙な理由で、「外部」接続を使用すると、SP はコンソール アプリとほぼ同じ速度で実行されます (それでも、それほど速くはありません! -- 55 秒)。

もちろん、アセンブリは Safe ではなく External として展開する必要があります --- これにより、さらにフラストレーションが生じます。

于 2009-05-19T16:24:45.087 に答える