Оптимизация полнотекстового запроса SQL 2008 (CONTAINSTABLE) - PullRequest
0 голосов
/ 20 сентября 2009

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

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

2 голосов
/ 20 сентября 2009

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

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

См. Пользовательская функция SQL для анализа строки с разделителями для 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, но она несколько менее читабельна.

0 голосов
/ 20 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...