分页时 SQL Server 查询速度变慢

vrs*_*vrs 16 sql-server sql-server-2012

我在 SQL Server 2012 中看到以下 T-SQL 查询的一些奇怪行为:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
Run Code Online (Sandbox Code Playgroud)

单独执行这个查询在不到两秒的时间内给了我大约 1,300 个结果(有一个全文索引Name

但是,当我将查询更改为:

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
OFFSET 0 rows
FETCH NEXT 10 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

给我10个结果需要20多秒。

下面的查询更糟糕:

SELECT Id 
FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY Name) AS RowNum, Id 
    FROM dbo.Person
    WHERE CONTAINS(Name, '"John" AND "Smith"') ) AS RowConstrainedResult 
WHERE RowNum >= 0 AND RowNum < 11 
ORDER BY RowNum
Run Code Online (Sandbox Code Playgroud)

完成需要1.5多分钟!

有任何想法吗?

慢计划

减缓

快速计划

快速地

Mar*_*ith 7

由于您只想TOP 10要按名称排序,它认为name按顺序处理索引并查看每行是否与CONTAINS(Name, '"John" AND "Smith"') )谓词匹配会更快。

大概需要更多的行才能找到所需的 10 个匹配项,而这个基数问题因键查找的数量而变得更加复杂。

使用此计划阻止它的快速技巧是将 to 更改ORDER BYORDER BY Name + ''尽管CONTAINSTABLE与 with 结合使用FORCE ORDER也应该有效。


vrs*_*vrs 3

我设法解决了这个问题:

\n\n

正如我在问题中所说,所有列都有索引+每列的统计数据。(由于遗留的 LIKE 查询)\n我删除了所有索引和统计信息,添加了全文搜索和 voil\xc3\xa0,查询变得非常快。

\n\n

看来这些指标导致了不同的执行计划。

\n\n

非常感谢大家的帮助!

\n