Вычислительная производительность проверки столбца с большим запросом страниц - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть этот запрос для извлечения (см. Ниже, сокращено для простоты) поиска данных о вакансиях. Мы имеем дело с около миллиона записей.

Select ID
from
(
    Select ID,createDate
    ,SearchKeyMatchRank
    ,Row_Number() over(Order By createDate) As rowNumber
    from Jobs J
    OUTER APPLY
    (
        Select SearchKeyMatchRank=
        CASE WHEN @searchKey='""' THEN 0
        ELSE
        (Select IsNull([RANK],0) from FREETEXTTABLE(Jobs,title,@searchKey) Where [Key]=J.ID)*4
        +(Select IsNull([RANK],0) from FREETEXTTABLE(Jobs,description,@searchKey) Where [Key]=J.ID)*4
        +(
        select SUM(ISNULL(JS2.[Rank],0))
        from FREETEXTTABLE(JobSkills,skill,@searchKey) JS2
        Where JS2.[Key] in (Select ID from JobSkills Where jobId=J.Id)
        )*2
        END
    ) SMR
    Where
    SearchKeyMatchRank>0 --simplified here
) T2
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

ПРИМЕЧАНИЯ:

Я не могу использовать обычное объединение, так как мне нужно было бы найти взвешенные ранги, передавая jobId в REETEXTTABLE.

ПРОБЛЕМА:

Очень медленно.

Очевидно, проблема заключается в сравнении вычисляемого столбца.

SearchKeyMatchRank>0

Если я сниму Где SearchKeyMatchRank> 0 это займет меньше секунды.

Кто-нибудь понял, как мы могли бы улучшить это?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2013

Если в столбце используется недетерминированная функция, мы выбрали подходящий столбец в таблице и добавили триггер вставки / обновления, чтобы обновить значение. Таким образом, будет небольшое попадание при изменении зависимого поля или добавлении новой записи, но это не повлияет на производительность запроса, поскольку столбец является стандартным столбцом SQL. Он также может быть легко проиндексирован.

0 голосов
/ 03 сентября 2011

Кто-нибудь понял, как мы могли бы улучшить это?

Изменить столбец из вычисляемого столбца в «обычный» столбец. Попробуйте сделать это в своей тестовой среде и посмотрите, не улучшится ли производительность.

...