c# - ServiceStack执行存储过程需要很长时间

标签 c# sql servicestack ormlite-servicestack sql-server-2014

我已经实现了 ServiceStack (v4.0.36),并通过 ORMLite 连接到我的 SQL Server 2014 数据库。我的网站上有一个搜索表单,它将任何填充的字段作为查询字符串参数传递到“/search”路由。我的请求 DTO 如下所示:

[Route("/search", "GET")]
public class SearchRequest
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    ...
}

(总共有 8 个参数)然后我有一个服务调用 SQL 中的存储过程,传递所有参数,例如:

public class MyServices : Service
{
    public object Get(SearchRequest request)
    {
        using (var db = AppHostBase.Instance.Container.TryResolve<OrmLiteConnectionFactory>().OpenDbConnection())
        {
            List<SearchResponse> searchResults = db.SqlList<SearchResponse>("EXEC sp_web_ResultListByNameOrAddress @firstName, @lastName, ...",
                new
                {
                    firstName = request.FirstName,
                    lastName = request.LastName,
                    ...
                });

            return searchResults;
        }
    }
}

问题是,如果我通过网站进行搜索,最多需要 30 秒才能返回结果(或者超时并断开连接)。如果我在 SQL 中执行相同的存储过程,我会立即获得结果(搜索字段和组合已建立索引)。

更改 web.config 后我发现性能有所提升

<compilation targetFramework="4.5" debug="false"/>

...但我仍然对瓶颈发生在哪里感到困惑。任何帮助将不胜感激!

呐呐呐呐呐呐… bat 侠! ?

更新:仅供引用,我通过独立的 AngularJS Web 应用程序连接到此服务,但在通过 Postman 等 REST 客户端测试服务时也会遇到缓慢或超时问题。谢谢。

更新 2:我启用了 Mini Profiler...延迟发生在“执行服务”步骤中。下面是一个示例搜索查询:

Mini Profiler Screenshot

我将在 ORMLite 连接上打开 SQL 分析,然后发布任何更新。

更新3:不是很有帮助(我认为)...SQL Profiler 只是显示执行的存储过程:

SQL Profiler Mini Profiler with SQL added

更新4:有趣。因此,我在打开 Mini Profiler 的情况下让 SSMS 的 SQL Server Profiler 与我的请求一起运行,并且还在运行存储过程的行上的服务实现中设置了一个断点。

当我加载页面时,立即命中断点。当我继续时,我在 SQL Server Profiler 中看到一条“审核登录”消息。然后几分钟内什么也没有,然后是一条“RPC:Completed”消息,其中包含存储的过程和传递的参数。

因此查询直到最后才命中 SQL,几乎立即返回(正如预期的那样)。为什么 ServiceStack 提交请求和在 SQL Server 上实际执行之间存在重大延迟?一切都是本地的,所以我不认为网络问题是罪魁祸首。有人吗?

最佳答案

找到此链接并解决了我的问题:What is happening in debug compilation that is causing the query to take longer to execute?

存储过程返回 bigint 数据类型,该存储过程映射到服务响应 POCO 中的字符串数据类型。我向存储过程添加了 CONVERT(varchar...) 语句,现在运行速度更快了。谢谢!

重新开放!抱歉在这件事上如此草率。我的单一表单将所有参数提交给存储过程。我刚刚将 ORMLiteConfig 超时增加到 500 秒,并注意到某些搜索大约需要 4 分钟才能完成。同样,在 SSMS 中执行相同的操作会立即返回结果。这是怎么回事?

关于c# - ServiceStack执行存储过程需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28148898/

相关文章:

SQL:COUNT() 项目在一对多关系中多次出现? GROUP BY 的替代方案?

.net - .net ServiceStack.Redis 客户端的 twemproxy(胡桃夹子)性能下降

将 tiff 转换为 pdf 期间另一个进程使用的 c# 文件

c# - asp.net mvc - 包含元关键字和描述等 SEO 信息的策略

mysql - 选择边界框内的所有地理空间点

sql-server - ServiceStack Ormlite 服务之间的事务

c# - ServiceStack:POST 正文内容作为 NameValueCollection

c# - 无法使用 IDataReader 读取值

c# - 将多个对象作为值添加到字典中的键

mysql - 如何检索存储在多行中的 "dynamic"属性作为正常记录?