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多分钟!
有任何想法吗?
由于您只想TOP 10
要按名称排序,它认为name
按顺序处理索引并查看每行是否与CONTAINS(Name, '"John" AND "Smith"') )
谓词匹配会更快。
大概需要更多的行才能找到所需的 10 个匹配项,而这个基数问题因键查找的数量而变得更加复杂。
使用此计划阻止它的快速技巧是将 to 更改ORDER BY
为ORDER BY Name + ''
尽管CONTAINSTABLE
与 with 结合使用FORCE ORDER
也应该有效。
我设法解决了这个问题:
\n\n正如我在问题中所说,所有列都有索引+每列的统计数据。(由于遗留的 LIKE 查询)\n我删除了所有索引和统计信息,添加了全文搜索和 voil\xc3\xa0,查询变得非常快。
\n\n看来这些指标导致了不同的执行计划。
\n\n非常感谢大家的帮助!
\n 归档时间: |
|
查看次数: |
5646 次 |
最近记录: |