PL/SQL로 대규모 일괄 처리 프로그램을 작성하는 것이 어리석은 일입니까?

StackOverflow https://stackoverflow.com/questions/78626

  •  09-06-2019
  •  | 
  •  

문제

나는 데이터베이스 테이블에 대한 일괄 계산으로 가장 자연스럽게 설명되는 프로그램 작업을 시작하고 있으며 한 달에 한 번 실행됩니다.모든 입력은 Oracle 데이터베이스 테이블에 있고 모든 출력은 Oracle 데이터베이스 테이블에 있습니다.프로그램은 앞으로 수년 동안 유지 관리가 가능해야 합니다.

예를 들어 일부 비즈니스 규칙에 따라 부서 간에 비용을 분배하는 등 각각 합리적인 변환을 수행하는 일련의 저장 프로시저로 이를 구현하는 것은 간단해 보입니다.그런 다음 각 변환의 출력이 예상한 대로인지 확인하기 위해 단위 테스트를 작성할 수 있습니다.

이 모든 작업을 PL/SQL에서 수행하는 것은 나쁜 생각입니까?C#과 같은 일반적인 객체 지향 프로그래밍 언어로 무거운 일괄 계산을 수행하시겠습니까?PL/SQL과 같은 데이터베이스 중심 프로그래밍 언어를 사용하는 것이 더 표현력이 뛰어나지 않나요?

도움이 되었습니까?

해결책

일반적으로 나는 PL/SQL을 가능한 한 적게 넣으라고 말합니다. 일반적으로 유지 관리가 훨씬 어렵습니다. 마지막 작업 중 하나에서 작업하기가 얼마나 지저분하고 어려운지 실제로 보았습니다.

그러나 일괄 처리이고 입력과 출력이 모두 DB이기 때문에 "이동하는 부분"을 최소화하기 위해 논리를 PL/SQL에 넣는 것이 좋습니다.그러나 그것이 비즈니스 로직이거나 시스템의 다른 부분에서 사용되는 구성요소라면 그렇게 하지 말라고 말하고 싶습니다.

다른 팁

다음 요구 사항을 설명합니다.

a) 배치 처리를 구현할 수 있어야합니다. b) 결과를 유지해야합니다.

나의 응답:

  1. PL/SQL은 귀하가 설명하는 바를 달성하도록 설계되었습니다.PL/SQL에는 다른 도구에서는 사용할 수 없는 효율성이 있다는 점을 기억하는 것도 중요합니다.저장 프로시저 언어는 데이터 옆에 처리를 배치합니다. 이는 일괄 처리가 수행되어야 하는 위치입니다.
  2. 어떤 언어로든 유지관리가 어려운 코드를 작성하는 것은 충분히 쉽습니다.

위와 같이 구현은 사용 가능한 기술, 적절한 설계 및 우수한 품질 프로세스 준수에 따라 달라집니다.

효율적으로 구현하려면 데이터를 일괄 처리해야 합니다(일괄 선택 및 일괄 삽입/업데이트).OO 접근 방식의 위험은 데이터를 행 단위로 처리하는 설계로 이끌리기 쉽다는 것입니다.이러한 유형의 접근 방식에는 불필요한 오버헤드가 포함되어 있으며 행 배치로 데이터를 처리하는 디자인보다 효율성이 훨씬 낮습니다.

두 가지 접근 방식을 모두 성공적으로 사용하는 것이 가능합니다.

매튜 버틀러

다른 논평자들이 주목할 점 - 문제는 SQL이 아니라 PL/SQL에 관한 것입니다.답변 중 일부는 분명히 PL/SQL이 아닌 SQL에 관한 것이었습니다.PL/SQL은 완전한 기능을 갖춘 데이터베이스 언어이며 성숙도도 높습니다.부족한 부분도 있지만 포스터가 하고 싶은 형태로는 아주 좋습니다.

아니요, 반드시 나쁜 생각은 아닙니다.솔루션이 간단해 보이고 각 프로세스를 테스트하고 확인할 수 있다면 좋은 아이디어인 것 같습니다.객체 생성 및 오버헤드로 인해 성능이 저하될 수 있으므로 OO 플랫폼은 대규모 데이터 세트에 적합하지 않을 수 있습니다(꼭 그럴 필요는 없음).

Oracle은 귀하와 같은 문제를 염두에 두고 PL/SQL을 설계했습니다. 데이터베이스 및 PL/SQL에 대한 기업 지식이 충분하다면 이것이 합리적인 솔루션처럼 보입니다.PL/SQL에서 실제 SQL 엔진으로의 각 호출은 컨텍스트 전환이므로 대규모 배치 세트를 염두에 두십시오. 따라서 성능을 향상하려면 가능한 경우 단일 레코드 프로세스를 함께 배치해야 합니다.

작동하는 동안 무슨 일이 일어나고 있는지 어떻게든 기록하도록 하세요.그렇지 않으면 블랙박스가 생겨서 몇 시간 동안 어딘가에 붙어 있으면 중지할지 아니면 '조금 더' 작동하도록 놔둘지 고민하게 될 것입니다.

PL/SQL은 SQL과 잘 통합되는 성숙한 언어입니다.Oracle의 각 버전에서는 점점 더 강력해지고 있습니다.또한 Oracle 11부터 PL/SQL은 기본적으로 기계어 코드로 컴파일됩니다.

나는 PL/SQL과 Pro 모두에서 엄청난 양의 일괄 처리 및 보고서 생성 프로그램을 작성했습니다.하나의 프로젝트에 대해서는 C입니다.그들은 일반적으로 내가 PL/SQL로 작성하는 것을 선호했는데, 미래에 유지 관리할 자신의 개발자가 Pro보다 이해하기 쉽다는 것을 알았기 때문입니다.C 코드.

결국 Pro*C로 작성된 정말 펑키한 처리나 보고서에 불과했습니다.

다른 사람들이 언급한 것처럼 이를 저장 프로시저로 작성할 필요는 없으며 쉘 스크립트와 같이 필요에 따라 실행되는 스크립트 파일일 수 있습니다.소스 코드 개정 제어와 테스트 시스템과 프로덕션 시스템 간의 마이그레이션도 훨씬 쉬워집니다.

수행해야 하는 계산이 PL/SQL에서 적절하고 읽기 쉽게 캡처될 수 있다면 PL/SQL만 사용하는 것이 가장 합리적입니다.

진짜 문제는 유지 관리 가능성입니다. 간단한 SQL DML에서 벗어나면 모든 RDBMS가 서로 다른 구문과 서로 다른 기능 세트를 가지며 형식 지정에 대한 실제 표준이 없기 때문에 유지 관리할 수 없는 SQL을 작성하는 것은 매우 쉽습니다.댓글 달기 등등

저는 C#과 SQL을 사용하여 배치 프로그램을 만들었습니다.

C#의 장점:

.NET의 전체 라이브러리와 OO 언어의 모든 기능을 갖추고 있습니다.

C#의 단점:

*배치 프로그램과 DB 분리 - 즉, 배치 프로그램을 데이터베이스와 별도로 관리해야 함을 의미합니다.

*당 SQL 코드를 모두 이스케이프해야 합니다.

SQL의 장점:

*DBMS와 잘 통합됩니다.이 작업이 데이터베이스만 조작하는 경우 데이터베이스에 포함시키는 것이 합리적입니다.결국 하나의 패키지에 단일 DB와 해당 구성 요소가 모두 포함됩니다.

*SQL 코드를 이스케이프할 필요가 없습니다.

*진짜로 유지 - 문제 영역에서 프로그래밍하고 있습니다.

SQL의 단점:

SQL이고 저는 개인적으로 SQL만큼 잘 모릅니다.

일반적으로 저는 위에 설명된 장점 때문에 SQL을 계속 사용하겠습니다.

이것은로드 된 질문입니다 :) 알아야 할 몇 가지 데이터베이스 프로그래밍 아키텍처 설계와 비용/이점이 무엇인지 있습니다.2 Tier는 일반적으로 클라이언트가 DB에 연결되어 직접 SQL 호출을 실행함을 의미합니다.3 Tier는 일반적으로 DB에 직접 SQL 호출을 실행하는 "애플리케이션 서버"가 있지만 클라이언트가 앱 서버와 통신하고 있음을 의미합니다.일반적으로 이는 "확장"을 가능하게 합니다.마지막으로 2계층 형식을 사용하는 2 1/2 계층 앱이 있으며 작업만 저장 프로시저 내에서 분류됩니다.

귀하의 프로세스는 일종의 "백 오피스"처럼 들리며 클라이언트/프로세스에는 한 달에 한 번 집계되고 캐시되는 결과만 필요합니다.즉, 연결하고, 자주 연결하고, "이 계산을 해라"라고 말하는 에이전트가 없습니다.대신 가끔씩 발생하는 프로세스를 언급하고 비실시간으로 벗어날 수 있습니다.

따라서 이러한 요구 사항을 고려할 때 일반적으로 데이터에 더 가까워지고 SQL Server가 모든 계산을 수행하도록 하는 것이 더 빠르다고 말하고 싶습니다.나는 당신이 데이터에 근접하면 당신에게 도움이 될 것이라고 생각합니다.

그러나 이러한 계산을 수행할 때 일부 계산이 SQL Server에서 적용되지 않을 수도 있습니다.예를 들어 채권이나 고정 수입 상품의 발생 이자를 계산해 보겠습니다.SQL에서는 별로 좋지 않으며, 풍부한 프로그래밍 언어에 훨씬 더 적합합니다.그러나 단순한 평균과 비교적 정상적인 집계가 있는 경우에는 SQL 측에서 저장 프로시저를 사용하겠습니다.

다시 말하지만, 계산의 성격이나 지원을 위해 개발자의 SQL 기능 측면에서 귀하의 집에서 요구하는 사항 또는 상사가 말하는 내용에 대한 정보가 충분하지 않습니다. 하지만 저는 SQL을 다루는 방식을 알고 있고 데이터에 가까이 다가가려면 이와 같은 작업을 위해 순수한 SQL/저장 프로시저를 사용하겠습니다.

YMMV :)

대부분의 저장 프로시저 언어는 설계상 형편없기 때문에 일반적으로 표현력이 더 뛰어나지는 않습니다.하지만 아마도 외부 앱보다 더 빠르게 실행될 것입니다.

그것은 PL/SQL에 얼마나 친숙한지, 이 글을 작성하는 데 얼마나 많은 시간이 필요한지, 성능이 얼마나 중요한지, 그리고 유지관리자가 PL/SQL에 충분히 익숙하여 작성된 대규모 프로그램을 유지 관리할 것으로 합리적으로 기대할 수 있는지에 달려 있다고 생각합니다. 그것.

속도가 중요하지 않고 유지관리자가 PL/SQL에 능숙하지 않은 경우 '전통적인' 언어를 사용하는 것이 더 나을 수 있습니다.

PL/SQL을 사용하여 중간 데이터(예: 테이블 조인 및 합계 등)를 생성하고 별도의 애플리케이션을 사용하여 흐름을 제어하고 값과 오류를 확인하는 하이브리드 접근 방식을 사용할 수도 있습니다.

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