저장 프로시 저는 언제 사용해야합니까?


19

나는 내가 이동 좋을 것 (있는 경우) 어떤 상황에서 코드와 엔티티 프레임 워크의 메이크업 사용에 내 모든 비즈니스 로직을 가지고있는 경우 일부 저장 프로 시저에 비즈니스 로직을 대신 코드에서 모든 유지?

분명히 말하면, 현재 설정 (코드의 비즈니스 로직)과 함께가 아니라 의미합니다. 저장 프로 시저에서 모든 비즈니스 로직을 갖는 장단점을 묻는 여러 가지 유사한 질문을 보았지만 나머지 비즈니스 로직을 유지하면서 엣지 케이스 로직에 대해 저장 프로 시저를 드물게 사용하는 것과 관련하여 많은 것을 찾지 못했습니다. 코드에서.

차이가 있다면 MSSQL과 Entity Framework를 사용하고 있습니다.


다음은 저장 프로 시저를 사용한 적이있는 상황입니다.

  • 실행하는 데 몇 분이 걸리는 복잡한 보고서 (웹 응용 프로그램의 페이지) LINQ가 제공하는 것보다 훨씬 효율적인 SQL을 작성할 수 있다는 것을 알았습니다.
  • 웹 응용 프로그램은 응용 프로그램과 관련이없는 다른 중요한 정보가 많이 포함 된 별도의 데이터베이스에서 몇 개의 테이블을 읽고 쓸 필요가있었습니다. 모든 것에 액세스하는 대신 필요한 것만 수행하고 제한된 정보 만 반환하는 저장 프로 시저를 사용했습니다. 그런 다음 웹 응용 프로그램은 테이블 등에 액세스하지 않고도이 저장 프로 시저에만 액세스 할 수 있습니다.

이 질문을하기 전에 살펴본 다른 게시물 :


4
두 가지 상황 모두 저장 프로 시저를 작성해야하는 합법적 인 이유입니다. 그들이 합법적 인지 묻고 있습니까?
Robert Harvey

@RobertHarvey 나는 그들이 합법적인지 확인하고 예외를 만들고 코드에 보관하지 않고 저장 프로 시저를 작성하는 다른 시나리오 또는 이유를 찾고있었습니다.
Amy Barrett

사용 가능한 다른 기술보다 문제를 더 잘 해결한다고 판단되면 예외를 저장하고 저장 프로 시저를 작성할 수 있습니다.
Robert Harvey

답변:


10

이미 완벽하게 좋은 몇 가지 시나리오가 있습니다.

다른 이유도 많이 있습니다. EF는 CRUD와 매우 간단한보고에 능숙합니다. 그러나 때로는 EF가 완벽한 도구가 아닙니다. Entity Framework와 함께 저장 프로 시저를 사용하는 것을 고려해야하는 다른 이유 (시나리오)는 다음과 같습니다.

  • EF의 기능을 사용하여 트랜잭션에 쉽게 랩핑 할 수없는 복잡한 작업 단위 (아마도 많은 테이블 포함)가 있습니다.
  • 데이터베이스는 선언적 참조 무결성 (외부 키 제약 조건)을 활용하지 못하므로 EF에서 제대로 작동하지 않습니다. 이것은 일반적으로 자신을 찾기에 나쁜 시나리오이지만 ETL 프로세스에 사용되는 데이터베이스와 같은 적절한 시나리오가 있습니다.
  • 연결된 서버와 서버 경계를 넘는 데이터로 작업해야합니다.
  • 적절한 성능을 보장하기 위해 "베어 메탈"SQL이 필요한 매우 복잡한 데이터 검색 시나리오가 있습니다. 예를 들어 특정 상황에서 잘 작동하려면 쿼리 힌트가 필요한 복잡한 조인이 있습니다.
  • 응용 프로그램에는 테이블에 대한 전체 CRUD 권한이 없지만 서버가 신뢰하는 보안 컨텍스트 (예 : 사용자 ID가 아닌 응용 프로그램 ID)에서 응용 프로그램을 실행할 수 있습니다. 이는 DBA가 누가 누가 무엇을 할 수 있는지에 대한보다 세밀한 제어를 제공하기 때문에 저장된 프로 시저에 대한 테이블 액세스를 제한하는 상황에서 발생할 수 있습니다.

나는 이것 외에 더 많은 것이 있다고 확신합니다. 특정 상황에서 최선의 진로를 결정하는 방법은 상식을 사용하고 기본 목표에 초점을 두는 것입니다.이 목표는 고품질의 쉽게 유지 관리 가능한 코드를 작성하는 것이어야합니다. 각 경우에이 결과를 제공하는 도구를 선택하십시오.


고마워 Joel, 내가 생각하지 않은 몇 가지 다른 시나리오를 언급했습니다.
에이미 바렛

좋은 답변입니다. 그러나 많은 사용자가 데이터베이스에 연결되어 있고 복잡한 쿼리 또는 저장 프로 시저를 실행하고 있는지 궁금하다면 데이터베이스 서버에 많은 부하가 걸리지 않습니까?
Ripal Barot

1
@RipalBarot 워크로드 (더 많은 사용자, 더 복잡한 쿼리)로 진행되는 작업이 많을수록 데이터베이스 서버에 대한 요구가 더 커질 것이라는 데는 의문의 여지가 없습니다. 그러나 기억해야 할 사항은 Entity Framework와 같은 ORM 대신 저장 프로 시저를 사용하면 저장 프로 시저가 미리 컴파일 된 쿼리 계획을 가질 수 있기 때문에 작업 부하를 (비교적으로) 줄일 수 있다는 것입니다. ORM에서 쿼리를 가져 오면 DBMS는 종종 쿼리를 처리하는 방법부터 시작해야합니다. 동등한 저장 프로 시저를 호출 할 때 데이터베이스는이를 효율적으로 수행하는 방법을 이미 알고 있습니다.
Joel Brown

2

아마도 질문을 뒤집어 저장 프로 시저 수행 할 수 있는 사용 사례, 달성하려는 작업을 찾는 것이 합리적 입니다. 아마도 저장 프로 시저가 눈에 띄는 사용 사례가있을 수 있습니다.

차이가 있다면 MSSQL과 Entity Framework를 사용하고 있습니다.

EF에 대한 나의 지식은 제한하지만, 지금까지의 내가 볼 수 있듯이, EF는 (입니다 다른 같은)을 ORM; 그리고 다행히도 사용 가능한 원료를 SQL .

내가 당신의 두 가지 중요한 점을 취한다면 :

실행하는 데 몇 분이 걸리는 복잡한 보고서 (웹 응용 프로그램의 페이지) LINQ가 제공하는 것보다 훨씬 효율적인 SQL을 작성할 수 있다는 것을 알았습니다.

보고서를 작성할 때 LINQ / EF 가 부족해졌습니다. 그리고 알다시피, SQLORM을 사용하는 것보다 훨씬 빠릅니다. 그러나 저장 프로 시저를 선호하거나 모든 것에 ORM 을 사용하는 것에 대해서만 이것을 말 합니까?

SQL로 문제를 분명히 해결할 수 있습니다. 해당 쿼리가 코드베이스에 저장되고 버전이 제어되는 경우 예제에 따라 차이가 없습니다 .

웹 응용 프로그램은 응용 프로그램과 관련이없는 다른 중요한 정보가 많이 포함 된 별도의 데이터베이스에서 몇 개의 테이블을 읽고 쓸 필요가있었습니다. 모든 것에 액세스하는 대신 필요한 것만 수행하고 제한된 정보 만 반환하는 저장 프로 시저를 사용했습니다. 그런 다음 웹 응용 프로그램은 테이블 등에 액세스하지 않고도이 저장 프로 시저에만 액세스 할 수 있습니다.

간단한 연결 문자열UPDATE 및 문제가 완료되었습니다. 이 문제는 해결 될 수 ORM : 단순히 다른 DB의 앞에 웹 서비스를 사용하고 동일한 compartementalization / 분리가 이루어진다.

그래서 여기서 볼 것이 없습니다.

다른 사람들이 한 몇 가지 요점을 살펴보면 다음과 같습니다.

EF의 기능을 사용하여 트랜잭션에 쉽게 랩핑 할 수없는 복잡한 작업 단위 (아마도 많은 테이블 포함)가 있습니다.

그러나 그렇게 SQL할 수 있습니다. 여기에 마법이 없습니다 .

데이터베이스가 EF에서 잘 작동하지 않습니다

다시 : 적절한 경우 EF를 사용하십시오 .

연결된 서버와 서버 경계를 넘는 데이터로 작업해야합니다.

저장 프로 시저가 어떻게 도움이되는지 모르겠습니다. 따라서 저장 프로 시저의 이점을 수 없습니다 . 그러나 누군가는 그것에 대해 약간의 빛을 비출 것입니다.

적절한 성능을 보장하기 위해 "베어 메탈"SQL이 필요한 매우 복잡한 데이터 검색 시나리오가 있습니다.

" EF의 경계 ".

응용 프로그램에 테이블에 대한 전체 CRUD 권한이 없지만 서버가 신뢰하는 보안 컨텍스트에서 응용 프로그램을 실행할 수 있습니다.

괜찮아. 나는 아마 함께 간다 .

지금까지 저장 프로 시저에 찬성 하여 절반 만 만들었습니다.


아마도 저장 프로 시저를 선호하는 성능 고려 사항이있을 수 있습니다.

1) 쿼리를 저장 하면 저장 프로 시저를 간단하게 호출하여 복잡성을 캡슐화 할 수 있다는 이점 이 있습니다. 쿼리 플래너는 쿼리를 알고 있으므로 최적화하기가 "쉽습니다". 그러나 현재 정교한 쿼리 플래너 _minimal을 사용하면 비용을 절감 할 수 있습니다.

또한 임시 쿼리를 사용하는 데 약간의 비용이 들더 라도 데이터가 잘 구성되고 신중하게 색인이 생성 된 경우 데이터베이스 는 응용 프로그램 의 병목 현상 일뿐 입니다. 따라서 델타가 작더라도 다른 요인을 고려하면 무시할 수 있습니다.

2) 그럼에도 불구하고 복잡한 쿼리를 DB 에 저장한다고 주장했습니다 . 고려해야 할 두 가지가 있습니다.

a) 복잡한 쿼리는 DB 인프라를 많이 사용하므로 다른 모든 쿼리의 시간이 늘어납니다. 많은 비용이 드는 쿼리를 병렬로 실행할 수 없습니다 . 이것은 프로 스토어드 또는 콘트라스트 스토어드 프로 시저가 아니라 복잡한 쿼리 에 대해 말합니다 .

b) 쿼리에 시간이 걸리면 저장 프로 시저에서 작은 속도로 승리하는 이유가 무엇입니까?

tl; dr

저장 프로 시저 대해 직접적으로 말하는 것은 없습니다 . 따라서 저장 프로 시저를 사용하는 것이 좋습니다.

그러나 다른 한편으로는 : 나는 명백하게 찬성 하는 적절한 유스 케이스 를 상상할 수 없었다 .

저장 프로시 저는 언제 사용해야합니까?

정답은 다음 과 같습니다 . 그러나 다른 옵션이 있습니다.


0

특정한 경우 엔터티 프레임 워크를 사용하고 있기 때문에 엔터티 프레임 워크가 요구 사항이나 문제를 충족시키지 못하면 저장 프로 시저 사용을 고려해야합니다.

엔터티 프레임 워크는 적절한 작업을 수행하며 저장 프로 시저를 사용하는 것과 성능이 비슷하거나 비슷합니다. SQL에 관심을 갖지 않기 위해 엔티티 프레임 워크를 선택했으며 프레임 워크에서 SQL을 생성 할 수 있습니다.

그러나 엔터티 프레임 워크가 부족하여 사용자의 요구를 충족시킬 수없는 경우가있을 수 있습니다. 이 경우 저장 프로 시저 또는 매개 변수화 된 쿼리를 사용하여 SQL을 직접 작성한 다음 엔터티 프레임 워크를 사용하여 해당 저장 프로 시저 / SQL 문을 직접 호출합니다.

따라서 사용중인 프레임 워크가 요구 사항을 충족시킬 수 없다면 저장 프로 시저로 아무것도 옮기지 않을 것입니다.

나는 일어날 수있는 최악의 일은 엔티티 프레임 워크를 사용하기로 선택한 다음 모든 저장 프로 시저를 작성하는 것입니다. 이제 값을 추가하지 않는 추가 레이어가 있습니다.


100 %가 마지막 단락에 동의
Ewan

0

기술적 요구가있는 것이 가장 좋은 선택은 아닙니다. 프로그래머는 도구를 선호하며 일반적으로 도구 문제를 해결하는 데 더 적응합니다. sproc에 로직을 넣는 것은 예외입니다. 예외적으로 작업하기 위해 시간이 걸리는 기술 부채와 미래의 개발자를 고려해야합니다. 특정 RDBMS의 성능 향상은 sproc 또는 인덱싱 된 뷰와 같은 다른 db 객체에서 구현하기가 더 쉬울 수 있습니다.

데이터베이스의 데이터가 필요할 때 응용 프로그램 코드에서 데이터를 가져올 수없는 경우가 있습니다. 많은 대기업 / 기업 상황에서 비즈니스 요구는 IT 부서의 이해를 뛰어 넘을 수 있습니다. 회사는 사고 팔리고 응용 프로그램이 함께 제공됩니다. 규제 기관 및 은행은 확장 성이 높고 아름답게 코딩 된 앱을 만들 수없는 경우 신경 쓰지 않습니다. 그들은 비즈니스를 위해 인생을 어렵게 만들 수 있습니다. 그래서 당신은 그것을 끝내야합니다.

타사 응용 프로그램 또는 보고서 작성 도구로 코드를 작성할 수없는 상황에 처했습니다. 오픈 소스 코드, API, 웹 인터페이스 및 서비스가 없습니다. 이들이 가지고있는 유일한 것은 데이터베이스 개체 (테이블, 뷰, sprocs, 사용자 정의 함수 등)에서만 작동하는 고유 한 특수 보고서 작성 도구입니다.

저장 프로 시저를 작성하는 데 매우 유용한 DBA가있는 경우 일부 상황에서 해당 재능을 활용할 수 있습니다. 데이터를 크게 변경하기 때문에 앱에서 백업을 트리거 할 수 있습니다. dba가 사용하는 것을 사용하지 않는 이유는 무엇입니까?

일부 Ad Hoc 요청은 앱에서 모든 기능을 사용할 수있을 때까지 프로세스를 작성하는 것이 더 쉽습니다. 우리는 그것을 싫어한다. 우리는 뒤로 밀지 만 쇼는 계속되어야합니다.


0

비즈니스 로직을 저장 프로 시저 에 배치하지 말 것을 강력히 권합니다 . 그러나 데이터 액세스 논리 를 배치하는 것이 바람직한 경우가 있습니다 (두 개의 훌륭한 예를 나열한 경우) .

일반적으로 SP를 사용하고 싶은 마음이 든다면 이는 데이터 모델이 필요에 적합하지 않다는 것을 암시하는 신호 (코드 냄새)입니다.

편집 : 개발자가 비즈니스 / 데이터 액세스 논리에 대해 질문 할 때 비즈니스 논리는 데이터의 동작 및 상호 작용 방식에 관한 것이고 데이터 액세스 논리는 데이터 저장 및 검색 방식에 관한 것입니다.

예를 들어 : 도메인 모델에는 "개인"에서 파생 된 "학생"및 "교사"엔터티가있을 수 있습니다. (이것은 예가 아니라 선호하는 것은 아닙니다). 이것은 관계형 데이터베이스에 하나, 둘 또는 세 개의 테이블로 저장 될 수 있습니다. 선택은 공유하는 속성 수와 읽기 / 쓰기 성능 요구 사항에 따라 다릅니다.

비즈니스 로직에서 이러한 엔티티가 어떻게 저장되는지는 중요하지 않습니다. (또는 그들이 RDB에 상주하더라도). 데이터 액세스 로직은 물리적으로 저장되는 방식에 관한 것입니다.

따라서 원래의 질문과 관련하여 : 저장 프로 시저로 인해 데이터를 저장하고 검색하는 것이 더 효율적이거나 더 강력한 경우에는 문제가 있습니다. 저장 프로 시저가 데이터 저장 방법에 관계없이 유효한 규칙을 부과하기위한 것일 경우이를 피하십시오. 코드가 데이터베이스에 더 밀접하게 연결됩니다.


2
비즈니스 로직데이터 액세스 로직을 어떻게 정의 하시겠습니까?
Amy Barrett


@RobertHarvey 링크 감사합니다. 데이터 액세스 계층은 데이터 액세스 논리와 동일합니까? 데이터 액세스 계층과 관련된 실제 논리가 많지 않은 것처럼 보입니다. 단순한 CRUD 작업입니다.
Amy Barrett

@AmyBarrett : 글쎄, 때로는 데이터 액세스 레이어에 커스텀 메소드를 작성하기 때문에 항상 CRUD가 아닙니다.
Robert Harvey

@RobertHarvey 이러한 사용자 정의 메소드는 비즈니스 로직 계층에 속하지 않습니까?
Amy Barrett

-4

여기에 세 가지 문제가 있다고 생각합니다.

  1. SQL의 비즈니스 로직이 잘못되었습니다. 개별적으로 더 빠르게 실행 되더라도 확장되지 않습니다.

  2. 전통적으로 SPROC는 추상화 계층으로 모든 데이터 액세스에 항상 사용되어야합니다. DBA를 사용하여 소비 애플리케이션에 영향을주지 않고 성능 또는 기타 데이터 계층 변경을 도입 할 수 있습니다.

  3. EF는 sprocs와 잘 어울리지 않습니다. Linq의 동적 쿼리 생성에서 전환하여 많은 '좋은'기능과 생산성 이점을 잃게됩니다.

그래서 전반적인 조언은

  • 모든 SQL 쿼리에 SPROC를 사용하십시오.

  • 비즈니스 로직이나 루프를 넣지 마십시오.

  • EF를 사용하지 마십시오.


모든 SQL이 db 서버에서 실행되므로 추가 계산 상자가 아닌 추가 db로만 확장 할 수 있습니다.
Ewan

1
내가 참조. 그러나 첫 번째 요점은 순전히 두 성능 문제 사이의 균형에 관한 것입니다. 그러나 SQL 솔루션이 성능 측면에서 명백한 승리를 거두는 경우가 있기 때문에,이를 기준으로 범주 적으로 "나쁜"것으로 간주 될 수있는 방법을 모르겠습니다.

1
계산을 수행하는 웹 서비스가 있다고 가정 해보십시오. 코드 또는 SQL에서 할 수 있습니다. 단일 계산의 일대일 테스트에서 SQL이 더 빠르다고 말합니다. 그러나 서비스가 CPU를 최대한 활용하면 매우 저렴하고 2, 3, 4를 추가하기가 쉽습니다. 웹 서비스를 실행하지만 복제 된 데이터베이스를 추가하는 것은 어렵고 비용이 많이 듭니다
Ewan

1
이는 확장 성으로 인해 SQL 잘못된 디자인 수있는 특정 시나리오의 한 예입니다 . 그러나 예상조차도 확실하지 않습니다. 예상되는 사용자 수, 데이터베이스와 비교하여 데이터베이스에서 계산을 수행하는 상대 비용 등에 따라 다릅니다. 물론 어떤 경우에는 당신이 맞습니다. 나는 그것이 보편적 인 규칙이라고 생각하지 않습니다.

3
이것은 전반적으로 나쁜 조언입니다. 저장 프로 시저 수작업 코딩보다 장점이 있고 성능도 우수한 데이터 액세스 옵션이 많이 있습니다. EF에서 직접 sprocs를 실행할 수 있습니다. 실제로 EF에서 직접 모든 SQL 쿼리를 실행할 수 있습니다 . 일부 비즈니스 로직은 데이터베이스 서버에서 더 잘 실행되므로 금지되어 있다고 범주 적으로 지정할 수 없습니다. 객체 관계형 매퍼는 80 % 도구입니다. 데이터 액세스 프로세스를 완전히 대체하기위한 것이 아닙니다. ORM이 제대로 수행하지 못하는 20 %의 용도로 저장 프로 시저를 사용하십시오.
Robert Harvey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.