2014-04-07 2 views
1

요약효율적인 방법

(SQL 서버 2005) 동적 SQL의 많은 수를 실행하기위한 효율적인 방법이 있나요? 시스템에 새로운 경기가 매일 그들에게 이메일로 전송 -

세부

우리의 시스템은 사용자가 "이메일 알림"구독을 만들 수 있습니다.

구독은 검색 키워드 사용을 포함하여 여러 옵션을 허용합니다. 나 자신이 작성한 구문 분석기는 and, or 및 대괄호 ()을 고려하여 적절한 SQL 코드를 출력합니다. 파서는 SQL 인젝션에 사용할 수있는 어떤 것도 허용하지 않습니다. 각각 때문에,

SELECT * 
FROM [VW_EMAIL_ALERT] 
WHERE ([SEARCH] LIKE '%this%' AND ([SEARCH] LIKE '%that%' OR [SEARCH] LIKE '%other%')) 

각각의 밤, 모든 구독을 개별적으로 처리됩니다 ...

예를 들어이 키워드는 this (that or other)로 사용자가 입력 할 수 있으며 그 결과 쿼리는 약으로 끝날 것 잠재적으로 고유합니다. 결과적으로 일괄 처리는 모든 구독에 대해 커서를 실행하고 sp_executesql을 통해 SQL을 실행해야합니다.

분명히 이것은 매우 비효율적이며 심각한 과부하를 유발할 수 있습니다. 어떤 경우에는 시간 초과가 발생할 수 있습니다. 이 처리를 실행하는 저장 프로 시저는 구독을 블록으로 분할하여 코딩되므로 모두 한꺼번에 호출되는 것은 아닙니다.

더 효율적이고 효과적인 방법이 있습니까?

참고 : 우리의 고객 중 일부는 아직도 그 기술

+0

바보 같은 질문을하지만 당신은 정적 SQL을 사용하여 변경할 수 없습니다 검색보다 키워드에 와일드 카드 스피

select id from keywords where keyword = 'this' intersect select id from keywords where keyword in ('that','other') 

? (예, 스키마를 변경하기 위해 많은 노력을 기울일 수 있습니다.) Btw "순수한"동적 또는 파라 메트릭 다이나믹을 사용하고 있습니까? – jean

+1

%는 a =가있는 와일드 카드가 아닙니다. 쓰여진대로 어디에서 결코 사실이 될 수 없습니다. – Paparazzi

+0

이것은 약간의 도움이 될 수 있습니다. http://stackoverflow.com/questions/13259850/dynamic-sql-and-stored-procedure-optimization –

답변

1

당신은 당신이
같은 A '% 아무것도 인덱스

를 사용하여 인덱스에 대한 전체 텍스트 검색을 단어를 사용하지 않고 할 수있는 가장 효율적인 방법은 키워드를 찾고 있다면

또는 고유 한 단어를 색인화하기 위해 파서를 작성하십시오
키워드 표를 작성하십시오
색인을 생성하고
색인을 생성하십시오 이것은 매우 효율적인 que입니다 심지어 여전히 훨씬 더 효율적으로 전체 텍스트

어쩌면
+0

감사합니다. Blam, 귀하가 옳다고 생각합니다. FullText 검색은 이러한 상황에 이상적입니다. 불행히도 Google은 모든 클라이언트 서버에서 FullText를 사용할 수 없습니다. – freefaller

+0

그럼 직접 작성하십시오. 텍스트를 키워드 테이블로 구문 분석하면됩니다. – Paparazzi

+0

그건 나쁜 생각이 아니에요 @ 브람, 정말 좋아해요 .--) 고마워요! (편집 : 아,하지만 불행히도'및','또는'대괄호 '로 대처할 수 없습니다. 젠장) – freefaller

0

을 사용 불행하게도 우리가 현재 나는이 도움이되기를 바랍니다, SQL 서버 2005의 최소 지원 붙어있다. 필자의 작업에서는 커서를 이러한 종류의 구현으로 대체했습니다.

DECLARE 
    @strSQL NVARCHAR(MAX) = '' 

CREATE TABLE #tmp 
(
    Result_Query VARCHAR(MAX) 
) 

INSERT INTO 
    #tmp 
SELECT 
    'SELECT * FROM [VW_EMAIL_ALERT] WHERE ([SEARCH] = ''%this%'' AND ([SEARCH] = ''%that%'' OR [SEARCH] = ''%other%''))' 

UNION 

SELECT 
    'SELECT * FROM [VW_EMAIL_ALERT] WHERE ([SEARCH] = ''%this1%'' AND ([SEARCH] = ''%that1%'' OR [SEARCH] = ''%other1%''))' 

SELECT 
    @strSQL = @strSQL + Result_Query + ';' 
FROM 
    #tmp 

SET 
    @strSQL = LEFT(@strSQL, LEN(@strSQL) - 1) 

PRINT @strSQL 
EXEC(@strSQL) 
+0

의견을 보내 주셔서 감사합니다.하지만 솔직히 이것이 조금 더 효율적 일 수 있는지를 알 수 없습니다. – freefaller