我在SQL Server 2012中看到以下T-SQL查询的某些奇怪行为:
SELECT Id
FROM dbo.Person
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
仅执行此查询即可在不到两秒钟的时间内获得约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
给我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
需要超过1.5分钟才能完成!
有任何想法吗?
慢计划
快速计划
索引IX_PersonSearch ...在哪些列上进行?因为从表中选择*,并且使用的索引不包含所有输出列,所以您正在进行键查找。我认为您应该只选择所需的列,然后将它们包含在非聚集索引中作为包含的列,而不是索引列。
—
Marcel N.
该ID始终包含在每个非聚集索引中。这是SQL Server能够(通过ID)键入查找键的方法。
—
usr
SELECT TOP 10 * .... ORDER BY Name
?