【问题标题】:Search for multiple values in SQL Server as quickly as possible尽快在 SQL Server 中搜索多个值
【发布时间】:2012-12-21 12:21:27
【问题描述】:

我有以下 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 是一个相对较慢的操作,所以我希望获得一些专家建议,以最快的方式检索我的数据。

速度是我在这个问题上唯一关心的问题。

请注意,安全不是问题,因为此应用程序从内部数据库中提取所有变量,无法直接访问网络。

更新代码:

    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;
            }

【问题讨论】:

    标签: sql sql-server optimization


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这适用吗?我正在以不同的 sql 变体将数据插入到另一台服务器上的数据库中。
    • @tracertong 是的,我觉得还可以,试试看。
    【解决方案2】:

    如果您使用的是 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% 正确 :)

    【讨论】:

    • 嘿,马特。你介意告诉我为什么 lbl_dev.text 在更新代码中执行后是空的吗?干杯!
    • 抱歉以上评论不准确。 lbl_dev.text 包含“测试”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多