ServiceStack需要很长时间才能执行存储过程

时间:2015-01-26 11:03:46

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

我已经实现了ServiceStack(v4.0.36)与我的SQL Server 2014数据库的ORMLite连接。我的网站上有一个搜索表单,可以将任何填充的字段传递给" / search" route作为查询字符串参数。我的请求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"/>

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

na na na na na na na na ...蝙蝠侠! ?

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

更新2:我启用了Mini Profiler ...延迟在&#34;执行服务&#34;步。这是一个示例搜索查询:

Mini Profiler Screenshot

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

更新3:没有超级帮助(我认为)...... SQL Profiler只显示已执行的存储过程:

SQL Profiler Mini Profiler with SQL added

更新4:有趣。所以我在启用Mini Profiler的情况下运行了SSMS的SQL Server Profiler,并在运行存储过程的行上的服务实现中设置了一个断点。

当我加载页面时,会立即触发断点。当我继续时,我会看到一个&#34;审核登录&#34; SQL Server Profiler中的消息。然后没有几分钟,然后是一个&#34; RPC:已完成&#34;带有存储过程和传递参数的消息。

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

2 个答案:

答案 0 :(得分:2)

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

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

<强>重新打开!很抱歉这样翻转。我的单个表单将所有参数提交给存储过程。我刚刚将ORMLiteConfig超时增加到500秒,并注意到某些搜索需要大约4分钟才能完成。同样,在SSMS中执行相同的操作会立即返回结果。发生了什么事?

答案 1 :(得分:1)

添加额外答案,因为确实有两个问题。真正的根似乎与存储过程有关。我不知道为什么它不会一直导致问题,但我使用动态SQL重建它,只包括存在的参数的WHERE过滤器。最初,我有这样的事情:

CREATE [sp_name]
    @Name varchar(60) NULL,
    @Address varchar(150) NULL
    ...
AS
BEGIN
    SELECT *
    FROM tbl_A a
    WHERE (@Name IS NULL OR a.Name = @Name)
        AND (@Address IS NULL OR a.Address = @Address)

我的想法是&#34; OR&#34;操作员将首先评估前半部分,如果第一部分是假的,则不会尝试评估后半部分。也许这不是它的工作方式?无论如何,我最终将其重写为:

CREATE [sp_name]
    @Name varchar(60) NULL,
    @Address varchar(150) NULL
    ...
AS
BEGIN
    DECLARE @SQL NVARCHAR(4000);
    DECLARE @ParamDef NVARCHAR(4000);

    SELECT @ParamDef = ' 
        @NameParam varchar(60), 
        @AddressParam varchar(150),
    ';

    SELECT @SQL = N'
        SELECT *
        FROM tbl_A a
        WHERE 1=1';

    IF @Name IS NOT NULL
        SELECT @SQL = @SQL + N'
            AND a.Name = @NameParam ';

    IF @Address IS NOT NULL
        SELECT @SQL = @SQL + N'
            AND a.Address = @Address ';

    EXEC sp_executeSQL
        @SQL,
        @ParamDef,
        @NameParam = @Name,
        @AddressParam = @Address;
END

现在效果更好。谢谢!

相关问题