优化SQL 2008全文查询(CONTAINSTABLE)

优化SQL 2008全文查询(CONTAINSTABLE),sql,sql-server,tsql,sql-server-2008,full-text-search,Sql,Sql Server,Tsql,Sql Server 2008,Full Text Search,我得到了以下查询,它使用全文索引在给定商店(由@ShopId变量填充)中搜索与查询匹配的前5个产品(来自RawProducts表)。目前,我正在为每个ShopId(共有27家店铺)反复调用此过程,这有点慢 我的问题是-有人能告诉我如何修改查询以接受@ShopId变量中以逗号分隔的ShopId列表,并返回每个店铺的前5个匹配项吗 以下是到目前为止的问题: DECLARE @ShopId uniqueidentifier SET @ShopId = '49506541-4ce2-40ac-812a-

我得到了以下查询,它使用全文索引在给定商店(由@ShopId变量填充)中搜索与查询匹配的前5个产品(来自RawProducts表)。目前,我正在为每个ShopId(共有27家店铺)反复调用此过程,这有点慢

我的问题是-有人能告诉我如何修改查询以接受@ShopId变量中以逗号分隔的ShopId列表,并返回每个店铺的前5个匹配项吗

以下是到目前为止的问题:

DECLARE @ShopId uniqueidentifier
SET @ShopId = '49506541-4ce2-40ac-812a-7ab262e6f0b0'

   SELECT TOP 5
          ftt.RANK,
          rp.*
    FROM  RawProducts rp
    JOIN CONTAINSTABLE(RawProducts, 
                       RawProductName, 
                      'ISABOUT("*radox*","*shower*")') AS ftt ON ftt.key = rp.RawProductId 
   WHERE rp.ShopId = @ShopId
ORDER BY ftt.RANK DESC

您可以在调用proc之前创建一个临时表,并用shopID填充它。您必须通过与该临时表进行联接来修改查询

您完全可以按照您的建议执行:

  • 将以逗号分隔的标识符列表传递给存储过程
  • 将逗号分隔的列表转换为临时表(或表变量)
  • 将查询更改为此筛选器表上的联接
有关解析逗号分隔列表的UDF,请参见


但由于您使用的是SQL Server 2008,因此我建议您使用XML数据类型:

  • 编写小XML并将其传递到此存储过程:
  • 将存储过程的参数更改为
    @FilterXML NVARCHAR(MAX)
  • 将输入参数强制转换为XML,然后将其插入表变量(如下所示)
  • 如前所述,加入对此表变量的查询
样本:

CREATE PROCEDURE getMyData(@FilterXML NVARCHAR(MAX))
AS BEGIN
    DECLARE @x XML
    SELECT @x = CONVERT(XML, @FilterXML)
    DECLARE @Filter TABLE (ShopID INT)

    -- insert into temporary table
    INSERT INTO @Filter (ShopID)
    -- @important: XML iS CaSe-SenSiTiv
    SELECT      x.value('@ID', 'INTEGER')
    FROM        @x.nodes('/Filters/Row') AS R(x)
    ...

您甚至可以避免使用这个表变量@Filter并直接在XML表视图的结果上进行连接,但它的可读性稍差。

UDF通常更快,而XML替代方法可以在SQL Server 2005上使用。