Azure Sql FreeText(全文本)搜索非常慢

时间:2019-07-06 17:05:28

标签: sql-server azure-sql-database freetext

我在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)表中的NameLastName列均为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 sniffingOPTION (RECOMPILE)的一些提示。

到目前为止没有任何工作。我在这里缺少什么吗? OPTION (OPTIMIZE FOR UNKNOWN)是否应该快如闪电(至少180行)?

更新

这是FREETEXT搜索的执行计划,因为可变数据和静态数据的搜索计划完全相同,因此它们都是相同的。

FREETEXT query execution plan FREETEXT query execution details FREETEXT query execution details

此执行计划是FREETEXT查询的

LIKE query execution plan LIKE query execution details

0 个答案:

没有答案