C#/ASP.NET 网站使用 SQL Server CE 数据库慢查询

Posted

技术标签:

【中文标题】C#/ASP.NET 网站使用 SQL Server CE 数据库慢查询【英文标题】:C#/ASP.NET Web Site using SQL Server CE Database Slow Query 【发布时间】:2014-10-02 21:09:43 【问题描述】:

我遇到的主要问题是,从我的 SQL Server CE 数据库中进行简单选择时,第一个查询的典型等待时间为 17 秒,每个后续查询的等待时间约为 5 秒。

让网站闲置几分钟后,17 秒的延迟又回来了。我假设延迟来自建立连接、缓存等,但我觉得在我们的 LAN 上这是一个荒谬的等待,对于外部用户只会变得更糟。

该站点是一个使用 SQL Server Compact 数据库 (v4.0.8876.1) 的 c#/ASP.NET 网站。这被部署到 IIS8 服务器。该网站旨在使用存储在数据库中的不同模型的系数来计算用户输入的值。

在连接/查询期间出现如此大的延迟,我做错了什么?

连接字符串:

<add name="DatabaseConnection" 
     connectionString="Data Source=|DataDirectory|\Database.sdf" 
     providerName="System.Data.SqlServerCe.4.0"/>

查询:

string connstr = ConfigurationManager.ConnectionStrings["DatabaseConnection"].ConnectionString;

using (SqlCeConnection conn = new SqlCeConnection(connstr))

    string queryString = @"Select id, description, imagePath
                           from ConservationModels
                           where model = @modelName";

    SqlCeCommand command = new SqlCeCommand(queryString, conn);
    command.Parameters.AddWithValue("@modelName", modelName);

    try
    
        conn.Open();

        SqlCeDataReader reader = command.ExecuteReader();

        while (reader.Read())
        
            modelID = (int)reader[0];
            description = (string)reader[1];
            imagePath = (string)reader[2];
        

        reader.Close();
     
     catch (Exception ex)
     
        throw;
     
 

对于任何缺失的信息,我深表歉意,我感谢任何建议。如果有更好的方法来实现网站的目标,我会全力以赴。

【问题讨论】:

不要假设,测量。表中有多少条记录?模型字段是否被索引? 74 条记录,不,它没有被索引。我现在意识到这需要发生,因为 ID 是主键。一旦我弄清楚了,我会尽快更新。感谢您的评论。 74 条记录不应该对您的等待时间产生任何影响。也许第一次等待可能是由 ASP.NET 重新编译您的代码引起的,但它应该可以毫无延迟地工作 获取索引并将第一次查询减少到 15.4 秒。还是太多了。这也不在网站的初始负载上。这本身就需要一点时间,但我认为那是我读过的编译。 我们需要一个 Sql Server CE 专家来看看这个问题。我在您的代码中找不到任何可能导致这种延迟的弱点 【参考方案1】:

这可能为时已晚,但我最近发现(很难),如果您在 IIS 上托管的 OWIN 上使用带有 ASP.NET 的 SQL Server CE,IIS 将在 每个 请求。不知道为什么会发生这种情况,但您看到的时间很可能是 ASP.NET 重新构建应用程序。

我的应用程序最初将 SQL Server Express 与 Entity Framework 一起使用,并且一切正常 - 由于 Entity Framework 编译数据库架构,第一个请求的典型响应缓慢,然后闪电般快速。应用程序上的静态变量跨越多个请求。

我从 SQL Server Express 迁移到 SQL Server CE,然后我突然看到 Entity Framework 在每个请求上重新编译架构。这意味着每个请求现在都很慢。

此外,我保留在应用程序中的任何静态变量都会针对每个请求进行重置——与正在构建的新应用程序域一致。

将整个堆栈不变地移动到 OWIN 上的自托管,突然它又变得正常了——第一个请求很慢,随后的请求快如闪电。

这证明了带有 SQL Server CE 的 IIS 上的 OWIN 上的 ASP.NET 正在通过不重用现有线程并不断构建新的应用程序域来做一些奇怪的事情。

【讨论】:

【参考方案2】:

按照 MatteoSp 的建议,我从站点中删除了 SQL Server CE 组件并创建了一个 SQL Server Express 数据库来替换它。尽管由于某种原因,网站上的编译时间似乎有所增加,但这解决了我查询/连接缓慢的问题。

感谢您的帮助。

【讨论】:

以上是关于C#/ASP.NET 网站使用 SQL Server CE 数据库慢查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C#在SQL Server数据库中保存YouTube视频链接

如何使用json从sql server ASP.net中检索数据

使用 ASP.NET 网站中的 File.CreateFile 将文件插入 Sql Server 2012 FileTable 时访问被拒绝

通过ASP.NET MVC框架 + 原生JavaScript + Ajax + SQL SERVER 实现一个简单的有论坛功能的网站(有通过iis发布的例子)

高效的asp.net sql查询

c#visual studio Ultimate 2013 asp.net网站发布部署