我在Azure Sql(20个DTU)上默认安装了全文本。
我有一个搜索SP,在其中搜索了很多表,并对我用FreeText查询的所有列都建立了索引。
此SP具有44个参数,其中大多数为BIT
类型。我决定是否根据提供的参数在特定表中搜索。因此,我搜索了1到20个表。
此SP的运行速度非常慢,实际上当.net客户端调用它(仅超时)时,我实际上从未得到响应,这是在大约10个表被查询(搜索)的时候。
我在SSMS上执行SP,发现它花费了太多时间(超过30秒),并且在本地计算机上的工作时间不到预期的1秒。
我将整个SP提取到一个新的查询窗口中并作为查询(而不是SP)运行,我只在Users表中搜索,而所有其他代码都保留但不执行(这是通过设置相关的{{1 }}变量BIT
,因此不会搜索其他表)。但是,我也尝试提取唯一的Users表搜索查询部分。
我将搜索文本手动插入查询中,并且可以按预期快速运行(0毫秒),而使用变量则需要2-4秒。
请注意,Users表中只有180行(是,一百八十)。
我将搜索文本变量定义为0 (false - BIT)
。 DECLARE @SearchText NCHAR(50)
表中的Name
和LastName
列均为Users
。
这是慢(2-4秒)查询:
NCHAR(50)
这是快速(0毫秒)查询:
SELECT
U.Id AS UserId
, @SearchType AS MatchType
FROM
Users U WITH (NOLOCK)
WHERE
(
FREETEXT(U.[Name], @SearchText)
OR
FREETEXT(U.[LastName], @SearchText)
)
有趣的是,这也快(0毫秒):
SELECT
U.Id AS UserId
, @SearchType AS MatchType
FROM
Users U WITH (NOLOCK)
WHERE
(
FREETEXT(U.[Name], 'John')
OR
FREETEXT(U.[LastName], 'John')
)
我首先怀疑SELECT
U.Id AS UserId
, @SearchType AS MatchType
FROM
Users U WITH (NOLOCK)
WHERE
(
U.[Name] LIKE '%' + @SearchText + '%'
OR
U.[LastName] LIKE '%' + @SearchText + '%'
)
,但由于我提取了整个SP,因此不再需要担心。
我尝试分别使用parameter sniffing
,OPTION (RECOMPILE)
的一些提示。
到目前为止没有任何工作。我在这里缺少什么吗? OPTION (OPTIMIZE FOR UNKNOWN)
是否应该快如闪电(至少180行)?
更新
这是FREETEXT
搜索的执行计划,因为可变数据和静态数据的搜索计划完全相同,因此它们都是相同的。
此执行计划是FREETEXT
查询的