2008-10-06 3 views
1

현재 Microsoft SQL 데이터베이스에 고객에 대한 특정 재무 정보를 저장하는 프로젝트를 진행 중입니다. 나중에 사용자는 특정 조건 (예 : 특정 크기보다 큰 클라이언트, 특정 지리적 위치의 클라이언트)을 기준으로 클라이언트의 데이터를 반환하도록 데이터베이스를 쿼리 할 수 ​​있어야하며이를 벤치 마크로 사용할 수 있습니다. 데이터베이스는 스크립트를 사용하여 금융 소프트웨어에 의해 액세스됩니다.계산 용 저장 프로 시저 사용

현재 데이터베이스의 저장 프로 시저를 작성 중입니다. 내가 할 계획은 여러 가지 유형의 기준에 따라 여러 가지 다른 저장 프로 시저를 작성하는 것입니다. 그들은 고객 번호를 반환합니다.

내가 가진 실제 질문은 데이터를 검색하는 방법에 있습니다. 클라이언트 데이터를 사용하여 여러 가지 다른 계산을 수행해야합니다. 클라이언트 수를 기반으로 계산을 수행하고 결과를 반환하는 다른 저장 프로 시저를 사용하는 것이 좋습니까? 아니면 저장 프로 시저가 클라이언트에 대한 모든 정보를 반환하고 스크립트에서 계산을 수행하는 것이 더 낫습니까?

데이터베이스에 많은 클라이언트가 있기 때문에 성능이 문제가 될 수 있으므로이 방법을 비교적 효율적으로 사용하고 싶습니다.

답변

1

정말 작업에 따라 다릅니다.이러한 것들을 데이터베이스에서 계산 된 열로 사용하거나, 뷰 또는 SP에서 미리 계산 (또는 UDF 사용)하거나, 별도로 계산하여 ETL 또는 요약 단계에서 저장하거나 클라이언트가 수행하도록 할 수 있습니다.

계산을 일관되게 제어 할 수 있다는 것을 알지 못하면 클라이언트가 아무 일도하지 않아도되므로 실수하지 않아도됩니다 (모든 작업을 독립적으로 수행하는 보고서 작성자는 재난을 대비하는 방법입니다). 특히 계산 규 "이 변경 될 수 있습니다.

1

저는 많은 데이터가이 데이터와 관련이 있다고 생각합니다. 일반적으로 DB에서 반환하는 크기를 줄이는 계산 (그룹화 및 집계)은 DB에서 훨씬 효율적으로 수행 할 수 있습니다. 다른 계산을 시작하기 때문에 명확하지는 않습니다.

1

대부분의 경우 저장 프로 시저를 사용하는 것이 더 효율적이라고 설명하는 것이 좋지만 그렇지 않은 경우가 있습니다. 가장 좋은 대답은 두 가지 방법을 시도하고 어느 방법이 가장 효율적인지를 결정하기 위해 일부 부하 테스트를 수행하는 것입니다.

3

흥미롭게도 데이터웨어 하우스 사람들은 항상이 작업을 수행합니다. 그들은 종종 가능한 가장 간단한 SQL (SELECT SUM/COUNT ... GROUP BY ...)을 사용하고 외부에서 보고서 작성 도구의 데이터베이스를 사용합니다.

데이터웨어 하우스 툴킷의 사본을 얻어야하며 이것이 더 간단한 방법으로 어떻게 수행되는지보십시오. 더 유연하고 아마 더 확장 가능합니다.

0

SQL Server는 관계형 데이터 저장소입니다. 계산 당 하나의 저장 프로 시저를 제안합니다. 이는 클라이언트에 대해 동일한 계산을 수행합니다. ID를 매개 변수로 전달하면 클라이언트의 특정 결과를 얻을 수 있습니다.

"많은 클라이언트가 있기 때문에 성능이 문제가 될 수 있습니다.".... 이것은 테이블이 정규화되고 인덱싱되는 방법에 따라 다릅니다. 인덱스가 실제로 어떤 것인지 완전히 이해하지 않으면 모든 열을 인덱싱하지 마십시오.

편집 ~ 계산을 살펴보십시오. 일부는 프런트 엔드 클라이언트로 오프로드 할 수 있습니다.

0

가장 효율적인 방법은 SP에서 모든 계산을 수행하고 단일 (?) 결과를 스크립트에 반환하는 것입니다.

스크립트에서 처리하기로 결정한 경우 검색하는 데이터를 필요한 것으로 만 제한하고 가능한 한 데이터베이스 왕복을 거의하지 않도록해야합니다 .

0

계산 된 결과를 판별하는 비즈니스 규칙이 변경되기 쉬운 경우 저장 프로시 듀어와 같은 코드를 작성하지 마십시오. 이러한 작업을 수행하는 더 좋은 장소는 컨트롤러 (MVC의 C)입니다. 규칙은 변경되지 않고 쉽게 변경할 수 있습니다.

또한 확장 성 측면에서 볼 때 app-servers를 복제하는 것은 데이터베이스 서버를 복제하는 것만 큼 비싸지 않습니다.

그렇다고해서 저장 프로 시저를 사용할 수 없다는 의미는 아닙니다. 보고서 생성은 저장 프로 시저를 사용하여 완료된 컴퓨팅에 적합한 하나의 후보가됩니다.

0

데이터웨어 하우스가 필요한 경우를 고려하십시오. 보고를 위해 최적화 된 데이터베이스는 데이터 입력을 위해 최적화 된 데이터베이스와 매우 다릅니다.

0

당신이 말한 모든 것은 당신이 당신의 데이터를 보관하는 것을 고려해야한다고 생각하게 만듭니다. OLTP 시스템에 대해 복잡한 조인을 작성하고 추가 계산이 필요한 경우 (그리고 사용자가 생각하는 것처럼) 데이터를 비정규 화하고 사전 계산 된 집계를웨어 하우스에 저장하면 훨씬 간단 해집니다. 모두가 문제 공간을 분리하고 소스 데이터가 잘 관리되어있는 경우, 당신을 던져 할 것 같다 책과 제품의 엄청난 양에도 불구하고

이 작업은 종종 간단하다.

-1

저장 프로 시저 및 반환 데이터에서 모든 계산을 수행 할 수 있습니다. 저장 프로 시저와 같은이자 계산에는 많은 계산이 필요합니다.

다른 방법으로 데이터를 계산해야합니다. 우리는 SP에서 할 수있는

SUM,

Declare @SUMAmount decimal(12,3) 

은 - 또한, @B 등이 조건을 제공 할 수 있습니다 귀하의 요구 사항에 따라

Select @SUMAmount= SUM(ISNULL(@A,0)+ISNULL(@B,0)+ISNULL(@C,0)+ISNULL(@D,0)) 

Select @SUMAmount= SUM((ISNULL(@A,0)+ISNULL(@B,0))*(ISNULL(@C,0)-ISNULL(@D,0))) 

@A을 선언합니다. 데이터가 NULL인지

ISNULL는 널 (NULL) 값이 0으로 계산 돌아가 검사에 사용하는 것은 매우 잘 ISNULL 조건을 줄 수 없다.

Select A,B,SUM(C),D From TableName 
Where SUM(C)>0 
Group By A,B,D 

여기서 집계 함수와 집계 함수는 모두 있으므로 그룹화 기준을 사용해야합니다. 조건에 따라 값을 얻을 수 있습니다 (예 : "SUM (C)> 0"). 그룹화 후에도 여기에서 사용할 수 있습니다.

Declare @TotalNoofDays int 
@TotalNoofDays = DATEDIFF(d, fromdate, todate) 

이 기능을 사용하는 일 수를 찾으려면을 (를) 사용하십시오. 당신은 같은 조건을 사용할 수 있습니다

, 당신은 저장 프로 시저에서 할 수있는 계산처럼

if @DueAmount >=0 
BEGIN 
IF @DiscountFlag = 1 
BEGIN 
SET @DueIntAmount = 0 
END 
ELSE 
    BEGIN 
    SET @DueIntAmount = ((@DueAmount*(@IntRateOnDue/100))/365)*@NoofDays 
    END 
    SET @ExcessInterestAmount = 0 
END 
ELSE 
BEGIN 
SET @DueIntAmount = 0 
SET @ExcessInterestAmount = ((@DueAmount*(@IntRateOnDeposit/100))/365)*@NoofDays 
END 

.당신이 레코드 수와 계산을 수행 할 경우 저장 프로 시저와 무엇이든 할 수처럼

Create Proc NewLearningProcedure 
(
    @Name Varchar(50), 
    @Date DateTime 
) 
AS 
Begin 

Declare @Temp Table 
(
    ID int Identity(1,1), 
    Name Varchar(50), 
    Date DateTime 
) 

Insert Into @Temp 
Select @Name,@Date 

Declare @i int 
set @i=10 

While @i>0 
Begin 
    Insert Into @Temp 
    Select @Name+CAST(@i as varchar(50)),@Date 

    Set @[email protected] 
End 


Select * from @Temp 


End 

.. 루프 동안

하나 하나는 당신은 임시 테이블을 사용할 수 있습니다.