优化SQL 2008全文查询(CONTAINSTABLE)

时间:2009-09-19 20:17:29

标签: sql sql-server tsql sql-server-2008 full-text-search

我有以下查询使用全文索引来搜索匹配查询的TOP 5产品(来自RawProducts表),在给定的Shop中(由@ShopId变量填充)。目前我正在为每个ShopId(有27家商店)一遍又一遍地调用这个程序 - 这有点慢。

我的问题是 - 是否有人可以让我知道如何修改查询以接受@ShopId变量中逗号分隔的ShopId列表,并从每个商店返回TOP 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

2 个答案:

答案 0 :(得分:2)

你绝对可以做你的建议:

  • 将逗号分隔的标识符列表传递给存储过程
  • 将逗号分隔列表转换为临时表(或表变量)
  • 将此查询更改为此过滤器表上的JOIN

在解析以逗号分隔的列表时,请参阅SQL User Defined Function to Parse a Delimited String以获取UDF。


但是既然您使用的是SQL Server 2008,那么我建议您使用XML数据类型:

  • 撰写小XML并将其传递给此存储过程:<Filter><Row ID="1"/><Row ID="2"/></Filter>
  • 将存储过程的参数更改为@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表视图的结果,但它的可读性稍差。

答案 1 :(得分:0)

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