У меня есть запрос для функции поиска.Улучшение поискового запроса
В основном функция поиска позволила пользователю определить, что у них есть "и" хотеть ". Затем этот запрос отфильтрует весь возможный результат, созданный другим пользователем.
Например, у меня есть яблоко (хорошего качества), и я хочу оранжевый (с низким качеством). Таким образом, результат отобразит всех пользователей, которые имеют оранжевый цвет (с низким качеством) и хотят яблоко (с хорошим качеством).
Поисковый запрос немного долго, и я стараюсь, чтобы упростить, как показано ниже:
Эта хранимая процедура будет принимать определенные пользователем таблицы (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.
Есть ли способ улучшить этот запрос?
Этот вопрос трудно ответить, не зная структуры таблиц или данных образца. Пожалуйста, рассмотрите возможность совместного использования SQLFiddle (http://www.sqlfiddle.com) с вашими таблицами, некоторые репрезентативные данные и ваш запрос для оптимизации. –