我有一個視圖名稱「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