2014-01-19 5 views
0

У меня есть запрос для функции поиска.Улучшение поискового запроса

В основном функция поиска позволила пользователю определить, что у них есть "и" хотеть ". Затем этот запрос отфильтрует весь возможный результат, созданный другим пользователем.

Например, у меня есть яблоко (хорошего качества), и я хочу оранжевый (с низким качеством). Таким образом, результат отобразит всех пользователей, которые имеют оранжевый цвет (с низким качеством) и хотят яблоко (с хорошим качеством).

Поисковый запрос немного долго, и я стараюсь, чтобы упростить, как показано ниже:

Эта хранимая процедура будет принимать определенные пользователем таблицы (Itemid & качества) в качестве параметров

@WantUdt AS HaveItemUdt READONLY, 
@HaveUdt AS HaveItemUdt READONLY 

Поисковый запрос (пользователь может задать более чем один товар и качество, поэтому я использую IN):

SELECT * from tbl_Trade WHERE TradeID IN 

(SELECT TradeID from tbl_Want w INNER JOIN 

    (SELECT TradeID FROM tbl_Have 
    WHERE HaveID IN (SELECT ItemID FROM @HaveUdt) AND 
    Quality IN (SELECT QualityID FROM @HaveUdt)) as h --to filter [have], 

ON w.TradeID = h.TradeID 

    WHERE WantID IN (SELECT ItemID FROM @WantUdt) AND 
    Quality =IN (SELECT QualityID FROM @WantUdt) --to filter [want] 
) 

Выше работы запроса, как ожидалось. Однако у меня проблема с производительностью. Я пытаюсь выполнить стресс-тест, выполнив эту хранимую процедуру несколько раз в течение определенного времени (несколько секунд), и мой db (SQL Server 2008 Express), похоже, не может усиливать и генерировать ошибку тайм-аута

Истекло время ожидания ожидания. Период ожидания истекает до завершения операции или сервер не отвечает.

Я предполагаю, что это связано с тем, что в запросе выше используется слишком много В CLAUSE.

Есть ли способ улучшить этот запрос?

+0

Этот вопрос трудно ответить, не зная структуры таблиц или данных образца. Пожалуйста, рассмотрите возможность совместного использования SQLFiddle (http://www.sqlfiddle.com) с вашими таблицами, некоторые репрезентативные данные и ваш запрос для оптимизации. –

ответ

0
Try this. I hope it will help. 

SELECT * -- select only those columns which are required 
FROM tbl_Trade AS tt (NOLOCK) 
INNER JOIN tbl_Want w(NOLOCK) ON tt.TradeId = w.TradeID 
INNER JOIN tbl_Have h (NOLOCK) ON h.TradeID = w.TradeID 
INNER JOIN @HaveUdt hu(NOLOCK) ON hu.itemId = h.HaveID AND hu.QualityId = h.Quality 
INNER JOIN @WantUdt wu (NOLOCK) ON wu.ItemId = w.WantID AND wu.QualityId = w.Quality 

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