0

保存されたビューからデータを取得する次の SQL ステートメントがあります。

foreach (var id in insert_idlist[0])
{
    mssql_con.Open();
    //top 1 for duplicate removal
    //slowdown?
    var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU = '" + id + "'";
}

IN 句などを使用してすべての ID を 1 つのクエリに挿入し、実行を高速化するように SQL ステートメントを書き直したいと考えています。ただし、IN は比較的遅い操作であることを認識しているため、データを取得する最速の方法について専門家のアドバイスを得たいと考えていました。

この質問で私の唯一の関心事は速度です。

このアプリケーションは、Web に直接アクセスせずに内部データベースからすべての変数を取得しているため、セキュリティは問題にならないことに注意してください。

更新されたコード:

    try
    {

        //foreach (var id in insert_idlist[0])
        //{
            mssql_con.Open();
            //top 1 for duplicate removal
            //slowdown?
            //var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU = '" + id + "'";
            var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU IN (" + insert_idlist .Select(x => "'" + x + "'") .Aggregate((x, y) => x + "," + y) + ")";
            //var mssql_select = "SELECT * FROM dbo.Book5 WHERE SKU = '"+id+"'";
            SqlCommand cmd = new SqlCommand(mssql_select, mssql_con);
            cmd.CommandTimeout = 0;
            lbl_dev.Text += "teest";

            //Create a data reader and Execute the command
            try
            {
                SqlDataReader dataReader = cmd.ExecuteReader();

                  //Read the data and store them in the list
                 while (dataReader.Read())
                {
                    insert_idlist[1].Add(dataReader["supplier name"] + " " + dataReader["range description"] + " " + dataReader["item description"]);
                    insert_idlist[3].Add(dataReader["Sale Price"] + "");
                    insert_idlist[2].Add(dataReader["WebDesc"] + "");
                    //insert_idlist[3].Add(dataReader["id"] + "");removed
                    insert_idlist[4].Add(dataReader["WebDimensions"] + "");
                    insert_idlist[5].Add(dataReader["RRP"] + "");
                    insert_idlist[6].Add(dataReader["Normal Price"] + "");
                    insert_idlist[7].Add("482"); //add me
                    insert_idlist[8].Add(dataReader["ID"] + "");

                    lbl_dev.Text += dataReader["supplier name"] + " " + dataReader["range description"] + " " + dataReader["item description"];
                    lbl_dev.Text += mssql_select;
                     about_to_insert = about_to_insert + 1;

                }
                lbl_dyn_status.Text = "Record 0 of " + about_to_insert + "updated.";

                dataReader.Close();
                mssql_con.Close();

            }

            catch (Exception e)
            {
                lbl_dev.Text = "" + e.Message;
            }

   // }


            }
            catch (Exception e)
            {
                lbl_dev.Text = "" + e.Message;
            }
4

2 に答える 2

0

IN句または類似のものを使用してすべてのIDを単一のクエリに挿入するようにSQLステートメントを書き直したいと思います。

あなたはINSERT INTO ... SELECT ...そのように使うことができます:

INSERT INTO ATable(...)
SELECT * FROM dbo.export_to_web WHERE SKU = someid;

注:INSERTによって返されるものと一致するように、句に列の名前をリストする必要がありますSELECT *

于 2012-12-10T13:21:05.497 に答える
0

2008以降を使用している場合、最善の方法は、値をテーブル値パラメーターに渡すことです。私はいつも、そのためにここに書いたブログ投稿を人々に示しています。

ただし、検索しているフィールドに適切なインデックスが付けられている限り、INは必ずしも低速な操作ではありません。また、「アイテムごとの接続」アプローチよりもほぼ確実に高速です。

その場合、SQLは次のようになります。

var mssql_select = "SELECT * FROM dbo.export_to_web WHERE SKU IN (" + insert_idlist
                   .Select(x => "'" + x + "'")
                   .Aggregate((x, y) => x + "," + y) + ")";

免責事項-LINQは100%スポットではない可能性があります:)

于 2012-12-10T13:22:11.337 に答える