2011-05-10 7 views
0

나는 데이터 레이어의 WHERE 절 전체에 사용자 함수가있는 응용 프로그램에서 작업 중이므로 성능에 문제가 있음을 확신합니다. 예를 들어 함수를 저장 프로 시저로 변환

은의이 항목과 의견을 당겨보고 거기 가정 해 봅시다, 우리를 보여주는

where (dbo.CountComments(entries.id, '5/10/2011') = 0) 

이 ...,의 말을하자 함수, 아니 주석이있는 항목 오늘이있다.

저장 프로 시저로 변환하고 싶지만 저장 프로 시저에서 동일한 동작을 얻는 것이 거의 불가능한 것처럼 보입니다.

SP로 다시 작성해야한다면 어떻게할까요?

답변

2

몇 가지 생각.

먼저 COUNT = 0을 사용하면 무언가가없는 것을 알면 비효율적입니다. 당신은 대신 비 제로 카운트를 반환 그들 모두를 방문 할 필요없이 false를 반환하는 행을 발견하는 즉시 구제 할 수

NOT EXISTS (SELECT...) 

그런 식의 SQL을 사용하는 것이 더 낫다.

두 번째로, 쿼리에서이 함수를 어디에서 사용하고 있습니까? 귀하의 예제에서와 같이 질의 기준으로 출력을 사용하고 싶지 않다면 스토어드 프로 시저를 사용하여이를 수행 할 수 없을 것입니다.

내가하는 일은 흔히 사용되는 쿼리에 대한 함수 또는 뷰를 작성한 다음 반환하는 행을 반환 할 때 저장 프로 시저에서 일부를 래핑하는 것입니다. 결과를 다른 테이블 또는 뷰와 조인해야하는 경우 함수를 그대로 두는 것이 가장 좋습니다.

+0

정확히 - 출력 결과를 쿼리 기준으로 사용하고 싶습니다. 그 문구를 떠올려 주셔서 감사합니다. 보기도 좋은 생각입니다. 감사합니다. – dnord

0

기본 SQL을 사용해보십시오. 아마도 다음과 같은 것일 수 있습니다 :

SELECT * 
FROM  comments c 
WHERE NOT EXISTS(SELECT commentID FROM comments c2 WHERE dateCreated >= getDate() AND c.commentID = c2.commentID) 

이것은 여러 수준에서 기능을 사용하는 것보다 효율적입니다. 그러나 나는 당신이 성취하고자하는 것에 대해 몇 가지 기본적인 가정을하고 있습니다. 그래서 나는 완전히 벗어날 수 있습니다.

+0

아니, 사용 중입니다. "NOT EXISTS"절을 추가하는 것이 함수보다 느린 것처럼 보입니다. 그래도 계속 아이디어를 가지고 놀고 있습니다. – dnord

+0

가입하려는 열의 색인이 생성되었는지 여부를 알고 계십니까? 그것이 아니라면, 그것은 분명히 일들을 늦출 것입니다. –

0

이 저장 프로 시저로 다시 작성하는 경우 WHERE 절에서 사용할 수 없습니다. 기능 만이 당신에게 그 능력을 줄 것입니다.

그러나 함수에서 코드를 가져 와서 저장 프로 시저에 넣은 다음 날짜를 매개 변수로 전달하면 현재와 같은 결과를 얻을 수 있습니다. 저장 프로 시저로 그렇게합니다.

관련 문제