我有一个视图名称“vw_AllJobsWithRecruiter”。查询优化SQL Server 2008
ALTER VIEW dbo.vw_AllJobsWithRecruiter
AS
SELECT TOP(SELECT COUNT(iJobID_PK) FROM dbo.tbUS_Jobs)
iJobId_PK AS JobId,
dbo.ufn_JobStatus(iJobId_PK) AS JobStatus,
dbo.ufn_RecruiterCompanyName(iJobId_PK) AS CompanyName,
sOther AS OtherCompanyName
FROM dbo.tbUS_Jobs
WHERE bDraft = 0
ORDER BY dtPostedDate DESC
此视图只包含3278行数。
如果我执行下面的查询:
SELECT * FROM vw_AllJobsWithRecruiter
WHERE OtherCompanyName LIKE '%Microsoft INC%'
它正在采取比第二执行较少。现在
我的问题是:
如果我使用下面的查询查询:
SELECT * FROM vw_AllJobsWithRecruiter
WHERE CompanyName LIKE '%Microsoft INC%'
OR OtherCompanyName LIKE '%Microsoft INC%'
它采取30秒执行,并从前端则抛出超时错误。 功能是在这里:
CREATE Function [dbo].[ufn_RecruiterCompanyName] (@JobId bigint)
RETURNS nvarchar(200)
AS
BEGIN
DECLARE @ResultVar nvarchar(200)
DECLARE @RecruiterId bigint
select @RecruiterId = iRecruiterId_FK from dbo.tbUS_Jobs with (Nolock)
where iJobId_PK = @JobId;
Select @ResultVar = sCompanyName from dbo.tbUS_RecruiterCompanyInfo with (Nolock)
where iRecruiterId_FK = dbo.ufn_GetParentRecruiterID(@RecruiterId)
return isnull(@ResultVar,'')
END
其他功能
CREATE Function [dbo].[ufn_GetParentRecruiterID](@RecruiterId bigint)
returns bigint
as
begin
declare @ParentRecruiterId bigint
SELECT @ParentRecruiterId = iParentId FROM dbo.tbUS_Recruiter with (Nolock)
WHERE iRecruiterId_PK = @RecruiterId
IF(@ParentRecruiterId = 0)
SET @ParentRecruiterId = @RecruiterId
RETURN @ParentRecruiterId
end
我的问题是
- 为什么它走了这么多的时间来执行?
- 我该如何缩短执行时间?
非常感谢您的关注。
子句TOP的用途是什么(SELECT COUNT(iJobID_PK)FROM dbo.tbUS_Jobs)?这很奇怪,可能无用。如果你需要有iJobID_PK不为空的行,那么WHERE子句更合适。 – Skrol29 2011-04-06 11:53:10
与出使用子句TOP(SELECT COUNT(iJobID_PK)FROM dbo.tbUS_Jobs),我不能使用视图中的顺序。 – 2011-04-06 11:54:41
@ Skrol29 TOP(..)构造等于'SELECT TOP 100%'并指示SQL Server遵循'ORDER BY'。没有TOP会忽略订单。 – 2011-04-06 11:55:25