2009-09-19 5 views
0

У меня есть следующий запрос, который использует полнотекстовый индекс для поиска ТОП-5 продуктов (из таблицы RawProducts), соответствующих запросу, в данном Магазине (заполненном переменная @ShopId). В настоящий момент я повторяю эту процедуру снова и снова для каждого ShopId (есть 27 магазинов) - это немного медленнее.Оптимизация полного текстового запроса SQL 2008 (CONTAINSTABLE)

Мой вопрос: может ли кто-нибудь сообщить мне, как изменить запрос, чтобы принять, скажем, список разделенных запятой ShopIds в переменной @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 

ответ

2

Вы определенно можете делать то, что вы предлагаете:

  • пасс разделенный запятыми список идентификаторов хранимой процедуры
  • преобразовать разделенных запятыми список в временную таблицу (или таблицы переменной)
  • изменить ваш запрос JOIN на эту таблицу фильтров

См SQL User Defined Function to Parse a Delimited String для ОДС на разборе комлинк а-разделенный список.


Но так как вы используете 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 таблицы ракурса, но несколько менее читаемым.

+0

UDFs обычно быстрее, и альтернатива XML будет работать на SQL Server 2005. –

0

вы можете создать временную таблицу перед вызовом процедурный, заполнить его Жека shopIds. Вы должны изменить запрос, выполнив объединения с этим темп таблицы

Смежные вопросы