2011-09-01 56 views
0

我有这个查询来检索作业的搜索数据(请参阅下文,简称为简单)。我们正在处理大约一百万条记录。使用大型表寻呼查询计算列检查性能

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 它需要较少的再进行第二次。

有人知道我们如何才能改善这一点吗?

回答

0

有人知道我们该如何改善这一点吗?

将列从计算列更改为“常规”列。在您的测试环境中尝试一下,看看性能改进是否相同。

+0

我们不能将其更改为常规列,因为我们必须根据搜索关键字来动态计算加权排名。 – manik

0

如果该列使用非确定性函数,我们采用的方法是在表上定义一个普通列并添加插入/更新触发器以更新该值。通过这种方式,当依赖字段发生更改或添加新记录时会有轻微打击,但由于列是标准SQL列,因此不会影响查询性能。它也可以很容易地索引。

+0

当你有可以应用静态计算的列时,你的想法很棒。不幸的是,在这种情况下,我们将无法做到这一点,因为我们不会提前知道搜索关键字,直到用户输入它。 – manik