Производительность подзапроса - Неуникальный столбец в предложении Where - PullRequest
0 голосов
/ 24 августа 2011

У меня есть две таблицы

Задания таблицы

[ID] [int] IDENTITY(1,1) NOT NULL,
    [title] [varchar](150) NULL,
    [description] [text] NULL

Table JobSkills
[id] [int] IDENTITY(1,1) NOT NULL,
    [jobId] [int] NULL,
    [skill] [varchar](150) NULL

Показанный выше частичный список столбцов.

Для таблицы JobSkills я проиндексировал jobIdстолбец, столбец навык полнотекстового индексирования.

У меня есть хранимая процедура, чтобы получить список заданий.вроде как.

Select totalItems
,Id,title
from
(
    Select Row_Number() over(Order By 
    CASE WHEN @sortBy Is Not Null AND @sortBy='relevance' 
    THEN 
        SkillMatchRank 
    END DESC
    ,CASE WHEN @sortBy Is Not Null AND @sortBy='date' THEN CreateDate END DESC
    ) As rowNumber
    ,COUNT(*) OVER() as totalItems
    ,ID,createDate,title
    from Jobs J
    OUTER APPLY dbo.GetJobSkillMatchRank(J.ID,@searchKey) As SkillMatchRank
    Where
    --where conditions here
) tempData
where 
rowNumber>=CASE WHEN @startIndex>0 AND @endIndex>0 THEN @startIndex ELSE rowNumber END
AND rowNumber<=CASE WHEN @startIndex>0 AND @endIndex>0 THEN @endIndex ELSE rowNumber END

Я создал встроенную табличную функцию для получения ранга соответствия навыка.

CREATE FUNCTION [dbo].[GetJobSkillMatchRank] 
(   
@jobId int,
@searchKey varchar(150)
)
RETURNS TABLE 
AS
RETURN 
(

select SUM(ISNULL(JS2.[Rank],0)) as rank 
from FREETEXTTABLE(JobSkills,skill,@searchKey) JS2
Where JS2.[Key] in (Select ID from JobSkills Where jobId=@jobId)

)

GO

Задача

Запрос выполняется очень медленно,больше минуты.

Мое наблюдение

Для табличной функции, если я установлю jobId = 1 (у меня есть задание с id = 1), то она будет работать очень быстро, как нужно.Я понимаю, что jobId не является уникальным столбцом в таблице JobSkills.

В этом случае, как я могу улучшить производительность ???

1 Ответ

1 голос
/ 25 августа 2011

Пользовательские функции хороши в некоторых случаях, но планы выполнения не кэшируются, как это делают sprocs.Если вы попытаетесь использовать другую производную таблицу вместо функции, запрос может работать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...