문제

SQL Server 2005/2008, 저장 절차 또는보기에서 더 빠른 것은 무엇입니까?

편집하다: 많은 분들이 지적했듯이, 나는 너무 모호하고 있습니다. 좀 더 구체적으로 시도하겠습니다.
저장 프로 시저 내에서 정확히 동일한 쿼리와 비교하여 특정 쿼리의 성능 차이를 알고 싶었습니다. (나는 여전히 다른 기능을 지적하는 모든 답변에 감사합니다)

도움이 되었습니까?

해결책

저장된 절차 (SPS) 및 SQL보기는이 게시물에 여러 번 명시된 바와 같이 "짐승"이 다릅니다.

쿼리 계획의 캐싱과 관련된 일부 [프린지 사례를 제외하고는 일반적으로 미성년자] 성능 고려 사항, 저장된 절차에 대한 바인딩 등의 시간을 제외하는 경우. 두 가지 접근 방식은 전체적으로 성능이 뛰어납니다. 하지만...

견해는 단일 선택 문으로 표현할 수있는 모든 것으로 제한됩니다 (아마도 CTE 및 기타 몇 가지 트릭이있을 수 있음). 보기는 선언적 형태의 쿼리와 관련이 있습니다. 다른쪽에 저장된 절차는 다양한 것을 사용할 수 있습니다 절차 유형 구성 (선언적 인 것뿐만 아니라), 결과적으로 SPS를 사용하면 더 효율적 일 수있는 주어진 쿼리를 해결하는 방법. SQL-Server의 쿼리 옵티마이저가 수행 한 것보다 (단일 선언 쿼리에 기초하여). 이 경우 SPS가 훨씬 빠를 수 있습니다 (그러나주의하십시오 ... 최적화는 매우 똑똑하며 SP를 동등한 견해보다 훨씬 느리게 만드는 데 많은 시간이 걸리지 않습니다.)

이러한 성능 고려 사항 외에도 SPS는 다재다능하며보기보다 광범위한 문의 및 조치를 허용합니다.

다른 팁

불행히도, 그들은 같은 유형의 짐승이 아닙니다.

저장된 절차는 일련의 T-SQL 문으로 데이터를 반환 할 수 있습니다. 모든 종류의 논리를 수행 할 수 있으며 결과 세트에서 데이터를 반드시 반환 할 필요는 없습니다.

보기는 데이터 표현입니다. 주로 기본 결합이있는 하나 이상의 테이블의 추상화로 사용됩니다. 항상 0, 하나 또는 많은 행의 결과 집합입니다.

나는 당신의 질문이 다음과 같은 선을 따라 있다고 생각합니다.

더 빠릅니다 : SELECT뷰에서 또는 이와 동등한 SELECT 클로스가 동일한 곳에서 조인을 수행하는 것과 동일한베이스 테이블이 주어지면 저장된 절차에서 진술?

이것은 모든 경우에 답이 적용될 것이라는 점에서 실제로 대답 할 수있는 질문은 아닙니다. 그러나 SQL Server 특정 구현에 대한 일반적인 답변으로 ...

일반적으로 저장된 프로 시저는 저장 프로 시저가 저장되고 처음 실행될 때 서버가 모든 종류의 최적화를 수행하기 때문에 직접 SQL 문보다 빠를 가능성이 높습니다.

보기는 본질적으로 저장된 SQL 문입니다.

따라서 일반적으로 저장된 절차는 각각의 SQL 문이 동일하고 SQL 문이 최적화의 혜택을받을 수있는 경우보기보다 빠를 수 있다고 말합니다. 그렇지 않으면 일반적으로 성능이 비슷합니다.

내 답변을 지원하는이 링크 문서를 참조하십시오.

http://www.sql-server-performance.com/tips/stored_procedures_p1.aspx

http://msdn.microsoft.com/en-us/library/ms998577.aspx

또한 SQL Server에서 성능을 최적화하는 모든 방법을 찾고 있다면 위의 두 번째 링크는 시작하기에 좋은 장소입니다.

데이터를 더 많이 제어 할 수 있도록 저장된 절차를 선호합니다. 양호하고 안전한 모듈 식 시스템을 구축하려면 저장된 절차를 사용하고 여러 SQL 명령을 실행하고 흐름 제어 문을 가지고 있으며 매개 변수를 수락 할 수 있습니다. 저장된 절차에서 할 수있는 견해로 할 수있는 모든 것. 그러나 저장된 절차에서는 훨씬 더 많은 유연성으로 할 수 있습니다.

요컨대, 일부 복잡한 쿼리에서의 경험을 바탕으로 저장 프로 시저는 기능보다 성능이 향상됩니다.

그러나 선택 또는 조인 쿼리에서 저장된 절차 결과를 사용할 수 없습니다.

다른 쿼리에서 결과 세트를 사용하지 않으려면 sp를 사용하는 것이 좋습니다.

그리고 나머지 세부 사항과 차이점은이 포럼의 사람들과 다른 곳에서 언급됩니다.

저장된 절차와 견해는 다르며 목적이 다릅니다. 나는 뷰를 통조림 쿼리로 본다. 저장된 절차를 코드 모듈로 살펴 봅니다.

예를 들어 tblEmployees 이 두 열이 있습니다 (다른 열). DateOfBirth 그리고 MaleFemale.

뷰라고합니다 viewEmployeesMale 남성 직원 만 필터링하는 것은 매우 유용 할 수 있습니다. 뷰라고합니다 viewEmployeesFemale 또한 매우 유용합니다. 이 두 가지 견해는 모두 자기 설명하고 매우 직관적입니다.

이제 25 세에서 30 세 사이의 모든 남성 직원 목록을 작성해야한다고 가정 해 봅시다. 나는이 결과를 생성하기 위해 저장된 절차를 만드는 경향이 있습니다. 그것은 가장 확실히 견해로 구축 될 수 있지만, 제 생각에는 저장된 절차가 이것을 다루는 데 더 적합합니다. 날짜 조작 특히 널이 인자 인 경우 매우 까다로울 수 있습니다.

나는 또 다른 사고 방식이 저장 절차를 사용하여 견해를 선택하는 것이라고 생각합니다. 이렇게하면 아키텍처가 느슨하게 결합 된 시스템이됩니다. 앞으로 스키마를 변경하기로 결정했다면 프론트 엔드를 깨뜨릴 정도로 걱정할 필요가 없습니다.

내가 말하는 것은 SP 대보기 대신 SP와보기를 생각하는 것 같아요 :)

다른 몇 가지 고려 사항 : SP와보기 사이의 성능은 본질적으로 동일하지만 (정확히 동일한 선택을 수행하고 있음) SP는 동일한 쿼리에 대해 더 많은 유연성을 제공합니다.

  • SP는 결과 세트 주문을 지원합니다. 즉, 진술서별 명령을 포함하여. 관점에서는 그렇게 할 수 없습니다.
  • SP는 완전히 컴파일되었으며 실행이 호출되도록 필요합니다. 보기에는 여전히 a가 필요합니다 SELECT * FROM view 그것을 호출하려면; 즉, 뷰에서 컴파일 된 선택에 대한 선택.

나는 이것을 "토론"으로 바꾸지 않아야한다는 것을 알고 있지만, 나는 이것에 매우 관심이 있고, 특정 상황에 대한 경험적 관찰을 공유 할 것이라고 생각했다. 저장된 절차 내에서 실행 된 동등한 선택 문은 뷰가 크게 동일한 성능을 가져야합니다.

데이터베이스 "A"는 별도의 데이터베이스 (DB "B")에서 5 테이블을 결합하는 데이터베이스에 뷰가 있습니다. SSMS에 DB "A"를 부착하고보기에서 *를 선택하면 250000 행을 반환하는 데> 3 분이 걸립니다. 보기의 디자인 페이지에서 SELECT 문을 가져 와서 SSMS에서 직접 실행하면 25 초가 소요됩니다. 저장된 절차에 동일한 SELECT 문을두면 해당 프로 시저를 실행할 때 동일한 성능을 제공합니다.

절대 성능에 대한 관찰없이 (DB "B"는 우리가 만질 수없는 도끼 데이터베이스입니다!), 나는이 경우 SP를 사용하는이 경우 견해를 사용하는 것보다 훨씬 빠른 순서라고 여전히 확신합니다. 동일한 데이터를 검색하면이 특정 경우에 다른 많은 유사한 견해에 적용됩니다.

나는 아니에요 생각한다 보기를 사용하면 다른 SSMS 창에서 2 개의 선택을 반복적으로 전환하고 각 쿼리의 성능을 전환 할 수 있기 때문에 선택을 사용하지 않는 한 다른 DB에 대한 연결을 만드는 것과 관련이 있습니다. 일관성이 유지됩니다. 또한 DB "B"에 직접 연결하고 dbname.dbo없이 SELECT를 실행하면 동시에 시간이 걸립니다.

누군가 생각이 있습니까?

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