0

30 秒以上かかるクエリを作成しました。

私のコード:

MySqlConnection myConnection = new    MySqlConnection(ConfigurationSettings.AppSettings["CollectiveIntelligence"]);

    string query = @"SELECT TBL.NAME1,
                           TBL.NAME2 
                      FROM (SELECT MLD1.LOGIN_NAME AS NAME1,
                                   MLD2.LOGIN_NAME AS NAME2 
                              FROM FEDERATED_M_LOGIN_DETAILS MLD1 
                              JOIN FEDERATED_M_LOGIN_DETAILS MLD2 
                             WHERE MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
                          ORDER BY NAME1,NAME2) TBL
                     WHERE NOT EXISTS (SELECT USER_NAME1,
                                              USER_NAME2 
                                         FROM CONNECTION C
                                        WHERE (C.USER_NAME1 = TBL.NAME1 AND C.USER_NAME2 = TBL.NAME2));";

    MySqlCommand myCommand = new MySqlCommand(query, myConnection);

    //Open Connection
    myConnection.Open();
    myCommand.CommandTimeout = 0;
    MySqlDataReader reader = myCommand.ExecuteReader();

    DataTable dt = new DataTable();
    dt.Load(reader);

    GridView1.DataSource = dt;
    GridView1.DataBind();

    myConnection.Close();
    reader.Close();

エラーが発生しています

    MySqlDataReader reader = myCommand.ExecuteReader();

エラー メッセージ:タイムアウトが発生しました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません

クエリを実行するようにasp.netの実行タイムアウトを増やす方法/

[編集]

説明をクリックすると、このように表示されます

id select_type  table   type   possible_keys   key              key_len   ref   rows   Extra
1, SIMPLE,      MLD1,   ALL,   ,               ,                 ,         ,    295,   Using temporary; Using filesort
1, SIMPLE,      MLD2,   ALL,   ,               ,                 ,         ,    295,   Using where; Using join buffer
1, SIMPLE,      C,      index, ,               INDEX_CONNECTION, 94,       ,    30754,   Using where; Using index; Not exists

[/編集]

助けてください

前もって感謝します

4

3 に答える 3

0

クエリはフィルターを使用して選択を実行し、結果セットを並べ替えてから、再度フィルター処理しています。最初にフィルター処理してから、削減された結果セットに並べ替えを適用することをお勧めします。これにより、クエリにかかる時間が短縮されるため、タイムアウトが発生しなくなります。

SELECT MLD1.LOGIN_NAME AS NAME1, MLD2.LOGIN_NAME AS NAME2 
FROM FEDERATED_M_LOGIN_DETAILS MLD1 
JOIN FEDERATED_M_LOGIN_DETAILS MLD2 ON MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
WHERE NOT EXISTS (SELECT USER_NAME1, USER_NAME2 
                FROM CONNECTION C
                WHERE C.USER_NAME1 = MLD1.NAME1 AND C.USER_NAME2 = MLD2.NAME2)
               )
ORDER BY MLD1.LOGIN_NAME, MLD2.LOGIN_NAME

アップデート

他の質問に基づいて、相関サブクエリを削除してサブクエリに置き換えることができます。

SELECT MLD1.LOGIN_NAME AS NAME1, MLD2.LOGIN_NAME AS NAME2 
FROM FEDERATED_M_LOGIN_DETAILS MLD1 
JOIN FEDERATED_M_LOGIN_DETAILS MLD2 ON MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
WHERE (MLD1.LOGIN_NAME + MLD2.LOGIN_NAME) NOT IN 
                     (SELECT USER_NAME1 + USER_NAME2 FROM CONNECTION C )
ORDER BY MLD1.LOGIN_NAME, MLD2.LOGIN_NAME

更新 2

上記は遅かったので、以下を試すこともできます。

SELECT MLD1.LOGIN_NAME AS NAME1, MLD2.LOGIN_NAME AS NAME2 
FROM FEDERATED_M_LOGIN_DETAILS MLD1 
JOIN FEDERATED_M_LOGIN_DETAILS MLD2 ON MLD1.LOGIN_NAME < MLD2.LOGIN_NAME
LEFT OUTER JOIN CONNECTION C ON C.USER_NAME1 = MLD1.NAME1 AND C.USER_NAME2 = MLD2.NAME2
WHERE C.USER_NAME1 is null and C.USER_NAME2 is null
ORDER BY MLD1.LOGIN_NAME, MLD2.LOGIN_NAME

パフォーマンスを向上させるために、FEDERATED_M_LOGIN_DETAILS.LOGIN_NAME、CONNECTION.USER_NAME1、および CONNECTION.USER_NAME2 にインデックスを追加する必要がある場合があります。

于 2013-03-26T10:11:07.523 に答える
0

アプリケーションごとにこれを制御できるように、構成ファイルに追加します。したがって、接続文字列内に追加します

Timeout=60;

例:

「データソース=source;初期カタログ=cata;タイムアウト=60;etc」

次に、コード内でそれを呼び出すことができます。

myCommand .CommandTimeout = ConfigurationManager.AppSettings["CommandTimeOut"]

ただし、SQL スクリプトが効率的かどうかを検討することもお勧めします。他の場所で解決できる場合、これらの設定を変更しても意味がありません。サーバー上でローカルにコマンドを実行し、他の問題を除外するのにそれだけの時間がかかるかどうかを確認します.

Visual Studio でタイムアウトを変更するには、[ツール] -> [オプション] を開き、[データベース ツール] - [クエリおよびビュー デザイナー] を開きます。ここで、タイミングを変更したり、実行時間の長いクエリをキャンセルするオプションを無効にしたりすることもできます。

テーブルおよびデータベース デザイナー セクション内にもタイムアウトがあります (データベース ツールの下にあります)。

于 2013-03-26T09:58:19.117 に答える
0

IIS でも変更できます。

select your website > advanced settings >limits > connection Time out

クエリのパフォーマンスを考慮する必要があります

于 2013-03-26T09:59:54.947 に答える