【问题标题】:Computed Column Check Performance With Large Table Paging Query大表分页查询的计算列检查性能
【发布时间】:2011-11-08 18:13:31
【问题描述】:

我有这个查询来检索(见下文,为简单起见)搜索工作数据。我们正在处理大约一百万条记录。

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 不到一秒钟。

有人知道我们可以如何改进吗?

【问题讨论】:

    标签: sql performance tsql sql-server-2008 database-performance


    【解决方案1】:

    有人知道我们可以如何改进吗?

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

    【讨论】:

    • 我们无法将其更改为常规列,因为我们必须根据搜索关键字即时计算加权排名。
    【解决方案2】:

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

    【讨论】:

    • 当您拥有可以应用静态计算的列时,您的想法很棒。不幸的是,在这种情况下,我们无法做同样的事情,因为在用户输入之前我们不会提前知道搜索键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多