您好,感谢您的关注。
首先对这个问题的一些背景:
我有被普遍使用在整个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))