2014-01-19 3 views
0

검색 기능에 대한 쿼리가 있습니다.검색 쿼리 개선

기본적으로 검색 기능을 통해 사용자는 "갖고있는"것과 "원하는"것을 정의 할 수 있습니다. 그런 다음이 쿼리는 다른 사용자가 만든 가능한 모든 결과를 필터링합니다.

예를 들어 사과 (양질)가 있으며 오렌지색 (품질이 좋지 않음)을 원합니다. 결과는 주황색 (품질이 좋지 않음)이고 사과가 좋은 품질의 모든 사용자를 표시합니다.

검색 쿼리 조금 길고 나는 다음과 같이 단순화하려고 :

이 저장 프로 시저 사용자 정의 테이블

@WantUdt AS HaveItemUdt READONLY, 
@HaveUdt AS HaveItemUdt READONLY 

검색 쿼리 (사용자가 정의 할 수 있습니다 매개 변수로 (항목 ID & 품질)를 받게됩니다 하나 개 이상의 항목과 품질, 그래서 내가) 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)가 시간 초과 오류를 생성 할 수없는 것처럼 보입니다.

제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다.

위의 쿼리가 너무 많은 것을 사용하기 때문입니다.

이 쿼리를 향상시킬 수있는 방법이 있습니까?

+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