문제

나는 검색을 저장하는 절차에 대한 우리의 기존합니다.

내가 쓴 다음과 같은 코드를 사용하는 표준 SQL 전체 텍스트 인덱스,그러나 나는 확실히 더 좋은 방법이 그와 같은 점에서 오른쪽 방향입니다.

일부를 제공한 정보는 방법에 필요한 작업을 페이지 1 검색 텍스트 상자를 클릭하면 검색 스레드 제목,실 설명과 포스트의 텍스트와 반환해야 합니다 결과를 제목으로 경기,먼저 설명한 다음 게시물이다.

아래는 내가 무엇을 썼다 지금까지 작동하지만 우아하는 한 빨리 나는 것입니다.예를 들어 주고의 성능으로 20K 스레드 및 80K 글로 약 12 초 검색에 대한 5 개의 임의의 단어입니다.

ALTER PROCEDURE [dbo].[SearchForums]
(
    --Input Params
    @SearchText VARCHAR(200),
    @GroupId INT = -1,
    @ClientId INT,
    --Paging Params
    @CurrentPage INT,
    @PageSize INT,           
    @OutTotalRecCount INT OUTPUT
)
AS

--Create Temp Table to Store Query Data
CREATE TABLE #SearchResults
(
    Relevance INT IDENTITY,
    ThreadID INT,
    PostID INT,
    [Description] VARCHAR(2000),
    Author BIGINT
)

--Create and populate table of all GroupID's This search will return from
CREATE TABLE #GroupsToSearch
(
GroupId INT
)
IF @GroupId = -1
    BEGIN
        INSERT INTO #GroupsToSearch
        SELECT GroupID FROM SNetwork_Groups WHERE ClientId = @ClientId
    END
ELSE
    BEGIN
        INSERT INTO #GroupsToSearch
        VALUES(@GroupId)
    END

--Get Thread Titles
INSERT INTO #SearchResults
    SELECT 
        SNetwork_Threads.[ThreadId],
        (SELECT NULL) AS PostId,
        SNetwork_Threads.[Description],
        SNetwork_Threads.[OwnerUserId]
    FROM 
        SNetwork_Threads
        INNER JOIN SNetwork_Groups ON SNetwork_Groups.GroupId = SNetwork_Threads.GroupId        
    WHERE 
        FREETEXT(SNetwork_Threads.[Description], @SearchText) AND
        Snetwork_Threads.GroupID IN (SELECT GroupID FROM #GroupsToSearch) AND
        SNetwork_Groups.ClientId = @ClientId


--Get Thread Descriptions
INSERT INTO #SearchResults
    SELECT 
        SNetwork_Threads.[ThreadId],
        (SELECT NULL) AS PostId,
        SNetwork_Threads.[Description],
        SNetwork_Threads.[OwnerUserId]
    FROM 
        SNetwork_Threads
        INNER JOIN SNetwork_Groups ON SNetwork_Groups.GroupId = SNetwork_Threads.GroupId        
    WHERE 
        FREETEXT(SNetwork_Threads.[Name], @SearchText) AND
        Snetwork_Threads.GroupID IN (SELECT GroupID FROM #GroupsToSearch) AND
        SNetwork_Groups.ClientId = @ClientId


--Get Posts
INSERT INTO #SearchResults
    SELECT 
        SNetwork_Threads.ThreadId,
        SNetwork_Posts.PostId,
        SNetwork_Posts.PostText,
        SNetwork_Posts.[OwnerUserId]
    FROM 
        SNetwork_Posts 
        INNER JOIN SNetwork_Threads ON SNetwork_Threads.ThreadId = SNetwork_Posts.ThreadId
        INNER JOIN SNetwork_Groups ON SNetwork_Groups.GroupId = SNetwork_Threads.GroupId        
    WHERE 
        FREETEXT(SNetwork_Posts.PostText, @SearchText) AND
        Snetwork_Threads.GroupID IN (SELECT GroupID FROM #GroupsToSearch) AND
        SNetwork_Groups.ClientId = @ClientId


--Return Paged Result Sets
SELECT @OutTotalRecCount =  COUNT(*) FROM #SearchResults
SELECT  
    #SearchResults.[ThreadID],
    #SearchResults.[PostID],
    #SearchResults.[Description],
    #SearchResults.[Author]
FROM  
    #SearchResults          
WHERE  
    #SearchResults.[Relevance] >= (@CurrentPage - 1) * @PageSize + 1 AND 
    #SearchResults.[Relevance] <= @CurrentPage*@PageSize
ORDER BY Relevance ASC


--Clean Up
DROP TABLE #SearchResults
DROP TABLE #GroupsToSearch

내가 알고있는 그것의 비트는 긴 호흡이지만 그냥 올바른 방향으로 찔러는 것입니다.

Incase 그것의 80%를 쿼리 시간입니다 촬영하면 검색 게시물과에 따르면 teh 쿼리 계획에 소요되는"인덱스캔"게시물에 대한 테이블.시 어쨌든습니다.

감사

Gavin

도움이 되었습니까?

해결책

나는 진짜로 있을 설명한 계획을 알고 있는 느린되었으로 나는 아무것도 표시되지 않은 특히 불쾌한 코드.첫 번째 것은 확인 모두 당신의 색인은 좋은 모양은 그들이 사용되고 있는지,통계는 날짜까지,등등.

다른 하나의 아이디어는 것을 검색 스레드에서 첫 번째 제목,다음 사용하여 결과에서는 정 검색에 스레드를 설명하고 게시 텍스트입니다.마찬가지로 사용하여 결과에서 스레드 검색 설명하는 자두의 게시물 텍스트 검색합니다.

여기에서 기본 아이디어 있는 경우 키워드에 스레드 제목,왜 귀찮게 찾을 설명하고 게시물?내가 이것을 실현에 따라 작동하지 않을 수도 있습 방법을 제시하고 검색 결과 사용자,그리고 그것을 만들 수 없습니다 큰 차이가 있지만,그것은 무언가를 생각합니다.

다른 팁

80k 기록하지 않는다.내가 권하고 싶지 않을 삽입하는 결과 데이터를 임시 테이블,그리고 대만에 삽입하 Id,다음에 합류하는 테이블 나중에 있습니다.이에 저장됩니다 쓰 temp 테이블,로 저장할 수는 있습니다 10000 정수,대신 10000 전체 게시물을(당신은 모두 삭제 한 페이지의).이를 줄일 수 있는 시간을 보냈 검색 게시물,뿐만 아니라.

당신처럼 보이는 것이요 두 temp 테이블,하나의 스레드 및 게시물이 있습니다.당신이 동맹이 그들에 최종 선택합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top