尽快在SQL Server中搜索多个值

时间:2012-12-10 13:19:02

标签: sql sql-server optimization

我有以下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 + "'";
}

我想重写sql语句,使用IN子句或类似方法将所有id插入到单个查询中,以加快执行速度。但是我知道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;
            }

2 个答案:

答案 0 :(得分:0)

  

我想重写sql语句以将所有id插入到单个中   使用IN子句或类似的查询。

你可以这样使用INSERT INTO ... SELECT ...

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

请注意:您必须在INSERT子句中列出列的名称,以匹配SELECT *返回的内容。

答案 1 :(得分:0)

如果您使用的是2008或更高版本,最好的方法是将值传递给表值参数。我总是将人们指向我为此撰写here的博客文章。

但是,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%现货:)