这是对全文查询的简单搜索
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百万。
非常感谢任何帮助和建议。
答案 0 :(得分:0)
尝试使用临时表而不是CTE。所以把整个表或几个字段放在临时表中,然后在临时表上进行行号搜索。
如果表有一个pk,那么只需将pk和rowno放入临时表中,就可以识别出你需要的rowno范围,然后再加入父级来获取详细信息。
如果发现性能仍然不好,你可以在rowno列上的临时表上添加一个非聚集索引(填写之后)。