2

SQL データを ac# アプリケーションに取得するときに、いくつかの奇妙な動作に気付きました。データセット xsd を使用しましたが、これがタイムアウトし始めました。その後、試みた他の操作のデータテーブルを生成して返すクラスが既にあったため、アプローチを変更しました。これもタイムアウト。

SSMS でアクティビティ モニターを開いて、コードが実行されたときに SQL で何が起こっていたかを把握していましたが、fill コマンドをどのように実行しても、SQL サーバーが 100% CPU でピークに達し、コマンドが実行されるまでそこにとどまることに気付きました。キャンセルされます。これは、240Ghz のプロセッサーと 30GB の RAM を搭載した優れたサーバーです。クエリは正確ではありませんが、SSMS で 3 秒以内に 10 万行を返します。

データセットのコードは次のとおりです。

        public DataTable UKDataRefresh ()
    {
        UKREFRESH.UKNewContactsDataTable dt = 
            new UKREFRESH.UKNewContactsDataTable();
        UKREFRESHTableAdapters.UKNewContactsTableAdapter ta = 
            new UKREFRESHTableAdapters.UKNewContactsTableAdapter();

        ta.Connection.ConnectionString += ";Password = xxxxxx;";

        try
        {
        ta.Fill(dt, global::SilverPopTransfer.Properties.Settings.Default.UKDATELASTACTION);

        }
        catch (SqlException )
        {

            throw;
        }

        return dt;

    }

オンザフライでビルドするためのコードは次のとおりです。

public DataTableOperations (string strconnection, string strSelect,string tablename)
{
        SqlConnection c = new SqlConnection(strconnection);
        connection = c;
        SqlDataAdapter da = new SqlDataAdapter(strSelect, connection);
        DataSet ds = new DataSet();
        //added this to see what would happen.
        da.SelectCommand.CommandTimeout = 0;
        connection.Open();
        da.Fill(ds, tablename);
        connection.Close();
        Datatable = ds.Tables[tablename];
        _disposed = false;
    }

完全な解決策ではなく、問題の原因についての手がかりを探しています。
ちなみに、投稿する前に既存のコンソール アプリケーションで同様の機能を実行したところ、接続してエラーなしで実行されました。クエリはほとんど同じでした。

唯一の違いは、既存のアプリケーションでは統合セキュリティを使用することですが、この場合はユーザーとパスワードを指定します。ログイン資格情報を確認しました

4

1 に答える 1

0

インデックスとset nocount on実行前に確認してください。SSMS のパフォーマンスは、優れたパフォーマンス指標ではありません。部分的なデータのみを取得し、非同期で実行します。データの小さなサブセットを呼び出すか、テーブルを埋めることなくクエリを実行してみてください。それがボトルネックになる可能性があります。

パラメータを使用して選択を実行している場合、SQLサーバーはそれを使用して実行し、サーバーはそれをsp_executeコンパイルしてCPEピークを作成します。

于 2012-09-04T16:35:12.117 に答える