C# SQL Server 2008-使用1个以上条件进行搜索时视图花费的时间太长

C# SQL Server 2008-使用1个以上条件进行搜索时视图花费的时间太长,c#,sql-server-2008,view,C#,Sql Server 2008,View,我在SQLServer2008中编写了一个视图,它被一个aspx网页调用 当我使用一个标准运行它时,例如Area=Townville,它运行得很好,但是使用两个标准,例如Area=Townville和County=Townshire,它需要很长时间,尽管发现Townville位于Townshire内的结果完全相同 由于我们的一个客户施加的限制,它必须在一个地区和一个县都这样工作,即使县并不总是必要的 我不认为视图本身有任何问题,因为我已经将其重写为一个更有效的视图,并且仍然需要花费很多时间 编辑

我在SQLServer2008中编写了一个视图,它被一个aspx网页调用

当我使用一个标准运行它时,例如Area=Townville,它运行得很好,但是使用两个标准,例如Area=Townville和County=Townshire,它需要很长时间,尽管发现Townville位于Townshire内的结果完全相同

由于我们的一个客户施加的限制,它必须在一个地区和一个县都这样工作,即使县并不总是必要的

我不认为视图本身有任何问题,因为我已经将其重写为一个更有效的视图,并且仍然需要花费很多时间

编辑-当我使用相关标准在服务器上尝试时,它实际上不是我认为的SQL。我想一定是那个叫它的网页。这就是它的名字,用c-

        string MySQLString;
        MySQLString = "SELECT [L1_Name], [L2_Name], [L3_Name], [Spare1], [Spare2], [Spare3], [Spare4], [Spare5], [Operation_Name], [Team_Name], [LatestDate], [Issues], [Next], [Postcode], [Latitude], [Longitude], [OperationOrder], [FKID_Contract], [FKID_GeoType], [Geometry] FROM [vw_Report_Latest_v3_1] WHERE [FKID_Contract]=@Contract";
        if ((string)Session["TSAreaString"] != "") { MySQLString = MySQLString + " AND [L1_Name]=@PA1"; }
        if ((string)Session["TSSiteString"] != "") { MySQLString = MySQLString + " AND [L2_Name]=@PA2"; }
        if ((string)Session["TSFeatureString"] != "") { MySQLString = MySQLString + " AND [L3_Name]=@PA3"; }
        if ((string)Session["TSS1"] != "") { MySQLString = MySQLString + " AND [Spare1]=@S1"; }
        if ((string)Session["TSS2"] != "") { MySQLString = MySQLString + " AND [Spare2]=@S2"; }
        if ((string)Session["TSS3"] != "") { MySQLString = MySQLString + " AND [Spare3]=@S3"; }
        if ((string)Session["TSS4"] != "") { MySQLString = MySQLString + " AND [Spare4]=@S4"; }
        if ((string)Session["TSS5"] != "") { MySQLString = MySQLString + " AND [Spare5]=@S5"; }
        if ((string)Session["TSTaskString"] != "") { MySQLString = MySQLString + " AND [Operation_Name]=@PA4"; }
        if ((string)Session["TSTeamString"] != "") { MySQLString = MySQLString + " AND [Team_Name]=@Team"; }
        //finish
        MySQLString = MySQLString + " ORDER BY [OperationOrder], [L1_Name], [L2_Name], [L3_Name], [Operation_Name], [Team_Name]";
        try
        {
            Conn.Open();
            SqlCommand Cmd = new SqlCommand(MySQLString, Conn);
            Cmd.Parameters.AddWithValue("@Contract", Convert.ToInt32(invCID.Text));
            if (lblPA1.Text != "All") { Cmd.Parameters.AddWithValue("@PA1", (string)Session["TSAreaString"]); }
            if (lblPA2.Text != "All") { Cmd.Parameters.AddWithValue("@PA2", (string)Session["TSSiteString"]); }
            if (lblPA3.Text != "All") { Cmd.Parameters.AddWithValue("@PA3", (string)Session["TSFeatureString"]); }
            if (lblS1V.Text != "All") { Cmd.Parameters.AddWithValue("@S1", (string)Session["TSS1"]); }
            if (lblS2V.Text != "All") { Cmd.Parameters.AddWithValue("@S2", (string)Session["TSS2"]); }
            if (lblS3V.Text != "All") { Cmd.Parameters.AddWithValue("@S3", (string)Session["TSS3"]); }
            if (lblS4V.Text != "All") { Cmd.Parameters.AddWithValue("@S4", (string)Session["TSS4"]); }
            if (lblS5V.Text != "All") { Cmd.Parameters.AddWithValue("@S5", (string)Session["TSS5"]); }
            if (lblPA4.Text != "All") { Cmd.Parameters.AddWithValue("@PA4", (string)Session["TSTaskString"]); }
            if (lblTeam.Text != "All") { Cmd.Parameters.AddWithValue("@Team", (string)Session["TSTeamString"]); }
            SqlDataAdapter MyAdapter = new SqlDataAdapter(Cmd);
            Cmd.CommandTimeout = 300;
            DataTable dt = new DataTable();
            MyAdapter.Fill(dt);
            GridView1.DataSourceID = "";
            Session["MyTable"] = dt;
            GridView1.DataSource = Session["MyTable"];
            GridView1.DataBind();
        }
        finally
        {
            if (Conn != null) { Conn.Close(); }
        }
因此,我们创建了MySQLString,它解决了vw_Report_Latest_v3_1视图。根据我们的需要添加标准

在我的具体示例中,会话[TSAreaString]被设置为一个特定的城镇,这个城镇很好,大约2秒钟就可以加载,这是一个大城镇。这与L1_名称有关

然而,会话[TSS3],在我们的演示案例中是我们的县,是导致该进程慢下来的原因。这与Spare3有关


同样,在SQLServer2008中的视图本身中,这似乎不是问题。但在执行该计划的页面上似乎确实存在问题。

您是否在SSMS中查看了执行计划?这可能会给你一个线索,说明为什么第二个标准会让一切变慢。以前千万不要碰到这个问题。我来看看。你有没有从SSMS执行过选择视图?还有慢吗?我在原来的问题上犯了一个错误。它在SQL中似乎工作得很好,但在网页上运行时就不行了。它由上面的c代码调用。