在Row_number()值行上添加where子句时,Sql Query慢20倍

时间:2015-12-17 10:51:46

标签: sql sql-server full-text-search

这是对全文查询的简单搜索

WITH xx AS
( 
    SELECT   
        kh.* ,
        ROW_NUMBER() OVER ( ORDER BY kh.Id ) AS RowNo
    FROM     
        KhachHang kh
    WHERE    
        CONTAINS (kh.Ten, 'hoang and van and ngan')
        AND kh.TrangThai = 1
)
SELECT xx.* 
FROM xx

只有在添加Where子句时才会出现问题

WITH xx AS
( 
    SELECT   
        kh.* ,
        ROW_NUMBER() OVER ( ORDER BY kh.Id ) AS RowNo
    FROM     
        KhachHang kh
    WHERE    
        CONTAINS (kh.Ten, 'hoang and van and ngan')
        AND kh.TrangThai = 1
)
SELECT xx.* 
FROM xx
--- This is key that create the difference       
WHERE xx.RowNo > 0 AND xx.RowNo <= 100

这种差异使后一个查询的运行速度慢了大约20倍。

我检查了执行计划,并注意到Index Seek和Scan之间的区别。但即使我用WITH FORCESEEK改变了后者,结果也差不多。

我的生产数据库中的记录数量为8百万。

Attached execution plan

非常感谢任何帮助和建议。

1 个答案:

答案 0 :(得分:0)

尝试使用临时表而不是CTE。所以把整个表或几个字段放在临时表中,然后在临时表上进行行号搜索。

如果表有一个pk,那么只需将pk和rowno放入临时表中,就可以识别出你需要的rowno范围,然后再加入父级来获取详细信息。

如果发现性能仍然不好,你可以在rowno列上的临时表上添加一个非聚集索引(填写之后)。