在ASP.net应用TSQL IVF造成超时(TSQL IVF causing timeout in

2019-09-17 14:52发布

您好,感谢您的关注。

首先对这个问题的一些背景:

我有被普遍使用在整个ASP.net应用程序,我已经开发了,在IIS7运行的内联表函数。 这是30个或多个存储过程的基础上,所有的同时,通常会在最大的200ms的过程(比快更足够了)。 该应用程序始终对所有的数据库连接相同的连接字符串。 该函数本身在最大10毫秒〜运行。

偶尔到调用存储过程中的功能是用来将导致15秒后超时页面的电话。 此超时适用于网页上的所有用户,但其中也有存储它使用此功能程序的其他页面仍然执行正常,而这是发生,这表明它是有问题的特定存储过程。 然而,这已经发生在多个页面,这表明它要么是多个存储过程或函数本身。

运行中从不同的用户凭据的管理工作室会话页面上的存储过程的任何(或全部)<200毫秒,即使超时发生在Web应用程序。

在功能上运行sp_recompile会一直“清除”超时,任何登录凭据。

由于这是应用程序的一个关键部分,sp_recompile是尽快运行,并且几乎没有时间可用于调试。 另外,我从来没有能够随意重新超时。

我试着做了很多的内联表函数的研究,并没有遇到任何提示,这是他们共同的问题,因此他们应该被避免。

问题:

难道这些超时被使用的功能造成的,或者是他们保证是其依赖于它的存储过程的问题? 为了把它的另一种方式,是有可能在重构的存储过程使用一个视图或通过封装适当的逻辑直列什么好处?

我的猜测是,它是唯一的存储过程,我很可能会通过增加优化未知,选择重新编译解决这个酌情或本地化的参数,但在所有诚实我更愿意找到它适用于潜在的解决方案功能,这样我可以在一个位置应用修订。

功能:

CREATE FUNCTION [dbo].[fn_ObjectIDs] (
    @DateFrom       AS DATETIME = NULL
    ,@DateTo        AS DATETIME = NULL
    ,@Region        AS INT = NULL
    ,@FamilyID      AS INT = NULL
    ,@ParentID      AS INT = NULL
    ,@ChildID       AS INT = NULL
) RETURNS TABLE AS
RETURN
    SELECT DISTINCT
        obj.ID       AS IDs
    FROM tblObjects obj WITH (NOLOCK)
    INNER JOIN tblFamily fam WITH (NOLOCK)
            ON obj.famID = fam.famID
        LEFT JOIN tblCountry cntry WITH (NOLOCK)
            ON (@Region IS NOT NULL) AND (fam.countryId = cntry.countryId)
        LEFT JOIN tblParent parent WITH (NOLOCK)
            ON (@ParentID IS NOT NULL) AND (obj.ID = parent.objectID)
        LEFT JOIN tblChild child WITH (NOLOCK)
            ON (@ChildID IS NOT NULL) AND (obj.ID = child.objectID)
    WHERE
        obj.Visible = 1
        AND obj.statusID IN (3,4,6,8)
        AND ((@DateFrom IS NULL) OR (obj.CreatedDate >= @DateFrom))
        AND ((@DateTo IS NULL) OR (obj.CreatedDate <= @DateTo))
        AND ((@Region IS NULL) OR (cntry.regionID = @Region))
        AND ((@FamilyID IS NULL) OR (obj.famID = @FamilyID))
        AND ((@ParentID IS NULL) OR (parent.parentID = @ParentID))
        AND ((@ChildID IS NULL) OR (child.childID = @ChildID))

Answer 1:

暂时添加一些日志记录,以确认什么是真正导致超时问题。 你可以在你的应用程序做到这一点,它的存储过程本身。 有程序写入当前时间戳和使用时,它的执行调用存储过程的记录表中​​的参数。 同时添加记录到您的应用程序。 然后,当如果有导致此问题的某些参数,或者如果问题出在程序在所有特定超时发生,你就可以识别。

在一般用户定义的函数是不是一个好主意,但我的理解是,一个表内联函数比一些其他的更好。 它增加了大量的开销和优化不能与UDF的正常工作。



文章来源: TSQL IVF causing timeout in ASP.net application