2009-03-25 3 views
4

У меня есть следующий запрос в SQL Server 2005:хеширования Отображение на полный текст запроса - SQL Server 2005

SELECT 
    PRODUCT_ID 
FROM 
    PRODUCTS P 
WHERE 
    SUPPLIER_ORGANIZATION_ID = 13225 
    AND ACTIVE_FLAG = 'Y' 
    AND CONTAINS(*, 'FORMSOF(Inflectional, "%clip%") ') 

Что интересно, что с помощью этого генерирует Hash Match, тогда как, если я использую другую SUPPLIER_ORGANIZATION_ID (более старый поставщик), он использует Merge Join. Очевидно, что Hash намного медленнее, чем Merge Join. То, что я не получаю, - это то, почему есть разница и что нужно, чтобы заставить его работать быстрее?

FYI, в таблице ПРОДУКТОВ содержится около 5 миллионов записей. Когда выбран идентификатор организации поставщика (13225), для этого поставщика имеется около 25000 продуктов.

Заранее спасибо.

+0

SQL Server - какая версия? Пожалуйста, добавьте эту информацию (как тег, и, возможно, в сам вопрос). – Tomalak

+0

SQL Server 2005. Модификации выпуска. – 2009-03-25 19:19:41

+0

Спасибо. +1 для вопроса. Я не могу ответить на это точно, но вы пробовали DBCC DBREINDEX и СТАТИСТИКУ ОБНОВЛЕНИЯ на столе? – Tomalak

ответ

1

Я бы попытался использовать OPTIMIZE FOR Query Hint, чтобы заставить его так или иначе.

SELECT 
    PRODUCT_ID 
FROM 
    PRODUCTS P 
WHERE 
    SUPPLIER_ORGANIZATION_ID = @Supplier_Organisation_Id 
    AND ACTIVE_FLAG = 'Y' 
    AND CONTAINS(*, 'FORMSOF(Inflectional, @Keywords) ') 
OPTION (OPTIMIZE FOR (@Supplier_Organisation_Id = 1000)) 

одна вещь ваша статистика может устаревает, переломный для автоматического обновления часто недостаточно низкий смысл, что план запроса выбран не может быть идеальным для ваших данных. Я предлагаю попробовать обновить СТАТИСТИКУ в вашей таблице продуктов, возможно, создав работу, чтобы делать это на регулярной основе, если это часть проблемы.

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