SQL 性能问题 ASP.Net 应用程序

Posted

技术标签:

【中文标题】SQL 性能问题 ASP.Net 应用程序【英文标题】:SQL Performance Issue ASP.Net App 【发布时间】:2015-11-13 13:52:48 【问题描述】:

我们在基于 ASP.NET 的 Web 应用程序中存在性能问题,并且仅在早上登录时可见一次。根据日志看起来像下面的查询需要超过 1 分 20 秒。下次用户登录应用程序并尝试访问同一页面时不会发现任何问题。你能告诉我如何优化这个查询吗?有什么想法可以解决这个问题吗?

日志 -

"11/13/15","08:38:27","ExecuteSql - ---3---- ","8",""
"11/13/15","08:38:27","ExecuteSql - ---4---- : SQL : SELECT TOP 1 CONVERT(varchar(15), Period_End_Date, 107) as PDate FROM PBHISTORY..STATEMENT_OF_CHANGE 
                                               ORDER BY Period_End_Date DESC","8",""
"11/13/15","08:39:48","ExecuteSql - ---5---- ","8",""

SQL:

SELECT TOP 1 
    CONVERT(varchar(15), Period_End_Date, 107) as PDate 
FROM  
   PBHISTORY..STATEMENT_OF_CHANGE
ORDER BY 
   Period_End_Date DESC

C# ASP.NET -

public string GetDateRangeReportingDate(int reportId)

    var report = GetReportInfoById(reportId);
    string sql = string.Format(@"SELECT TOP 1 CONVERT(varchar(15), Period_End_Date, 107) as PDate FROM 0..1 ORDER BY Period_End_Date DESC", _historyDatabase, report.SourceTableName);

    var data = ExecuteSql(sql);

    while (data.Read())
    
        return data["PDate"].ToString();
    

    return null;


private SqlDataReader ExecuteSql(string sql)

     SqlDataReader reader;
     SqlConnection conn;

     var commandTimeOut = ConfigurationManager.AppSettings["PBReportCommandTimeout"].ToString();
     string connString = ConfigurationManager.ConnectionStrings["PBReportCS"].ConnectionString;

     conn = new SqlConnection(connString);
     conn.Open();

     SqlCommand cmd = new SqlCommand(sql, conn);
     cmd.CommandTimeout = int.Parse(commandTimeOut);

     reader = cmd.ExecuteReader();
     return reader;

【问题讨论】:

你要获取多少条记录? 避免内联 SQL,实现 IDisposable 接口的任何类也应该包含在 using 语句中……这些都是性能问题——我只能想象系统中还有哪些其他缺陷。跨度> 该列是否有索引? Eldho - 只有一个记录。当我在 SQL Server Studio 中运行查询时,执行时间不会超过 3 秒。 应用池是否设置为每天自动回收?我会关闭它,看看是否可以解决它。听起来它会在一夜之间回收,初始请求需要一段时间,这在 asp.net 中很常见 【参考方案1】:

我找到了上面提到的性能问题的解决方案。问题是表中的索引错误,我通过更改我们在生产中获取记录的表的索引来解决此问题。

另外,我通过使用 SQL 数据适配器和 using 语句修复了框架级别的实体类。应用程序在生产中运行速度超快。谢谢你的帮助。

私有字符串 ExecuteSqlNew(string sql) 字符串 connectionString = ConfigurationManager.ConnectionStrings["PBReportCS"].ConnectionString; 字符串 commandTimeOut = ConfigurationManager.AppSettings["PBReportCommandTimeout"].ToString(); 数据集结果 = 新数据集(); 字符串 pDate = "";

        try
        
            using (SqlConnection conn = new SqlConnection(connectionString))
            
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                
                    conn.Open();
                    cmd.CommandTimeout = int.Parse(commandTimeOut);
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = cmd;
                    adapter.Fill(result);
                    adapter.Dispose();
                    conn.Close();
                    pDate = result.Tables[0].Rows[0]["PDate"].ToString();
                
            
        
        catch(Exception ex)
        
            throw ex;
        
        return pDate;

【讨论】:

以上是关于SQL 性能问题 ASP.Net 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net (C#) & SQL Server - 或者 - PHP & MySQL 的性能? [关闭]

C# Linq To SQL 插入单个大行性能问题

有啥方法可以分析 ASP.NET MVC 中视图的性能?

提高 ASP.NET Web 应用性能

如何检索当前 asp.net 应用程序的性能计数器

(转载)提高ASP.NET Web应用性能的技巧