(ASP.NET) 데이터베이스 변경을 추적하는 실시간 카운터를 만드는 방법은 무엇입니까?

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

문제

여기에 문제가 있습니다.

내가 최근에 가져온 사이트에서 당신은 하루에 당신이 달린 "마일"을 추적합니다. 따라서 사용자는 사이트에 로그인하여 5 마일을 달렸다 고 덧붙일 수 있습니다. 그런 다음 데이터베이스에 추가됩니다.

하루가 끝나면 오전 1 시경, 모든 마일을 계산하는 서비스가 실행되며, 모든 사용자는 낮에 달렸고 텍스트 파일을 APP_DATA에 출력합니다. 그런 다음 해당 텍스트 파일이 홈페이지에 플래시로 표시됩니다.

나는 이것이 일종의 말도 안된다고 생각합니다. 나는 그들이 큰 성능 문제로 인해 이것을해야한다고 들었습니다. 그들은 이전에 어떻게했는지 또는 주요 성능 문제가 무엇인지 정확히 말하지 않을 것입니다.

그래서 당신은 어떤 접근 방식을 취 하시겠습니까? 내 마음에 튀어 나온 첫 번째 것은 Ajax 호출을 통해 데이터를 얻는 웹 서비스였습니다. 아마도 새로운 "마일"항목이 추가 될 때마다 트리거가 발사되어 "GlobalMiles"테이블을 업데이트합니다.

이에 대한 정보 나 팁에 감사드립니다.

정말 고마워!

도움이 되었습니까?

해결책

이 질문에 대답하는 것은 모든 요구 사항을 알지 못하고 이전에는 효과가 없었기 때문에 약간 어렵습니다. 여기에 몇 가지 다른 아이디어가 있습니다.

먼저 가정을 다시 방문하십시오. 하루에 한 번 정적 보고서를 생성하는 것은 일일 보고서 만 있으면 완벽하게 유효한 솔루션입니다. 필요한 모든 것이 스냅 샷이라면 하루에 데이터베이스를 여러 번 누르는 이유 (예를 들어, 블로그를 게시 할 때 HTML 파일을 작성하는 데 사용되는 많은 블로그 소프트웨어가 매번 데이터베이스에서 입력하는 대신 블로그를 작성하는 데 사용됩니다. 최적화로). "실시간"기능이 추가하는 기능입니까?

나는 즉시 Ajax로 점프하지 않을 것입니다. 동일한 입력 방법을 사용하고 보고서를 정적에서 동적으로 이동하십시오. 한 번에 너무 많은 일을하는 것은 자신을 묻히는 좋은 방법입니다. 기존 코드를 변경할 때는 나머지 응용 프로그램에 가장 적은 영향을 미치지 않고 분리하여 변경할 수있는 영역을 찾으려고합니다. 그런 다음 동적 보고서가 있으면 Ajax를 추가 할 수 있습니다 (그리고 사용하십시오. 진보적 인 향상).

동적 보고서 자체는 몇 가지 옵션이 있습니다.

물론 Sum () 만 선택할 수는 있지만 각 사용자가 많은 항목이 있으면 성능 문제가 발생하는 것처럼 들립니다.

귀하의 데이터베이스가 지원하면 인덱싱 된보기 (때로는 구체화 된 견해라고도합니다). 지원해야합니다. 실시간 합계 데이터에 대한 빠른 업데이트가 가능합니다.

CREATE VIEW vw_Miles WITH SCHEMABINDING AS 
SELECT SUM([Count]) AS TotalMiles, 
COUNT_BIG(*) AS [EntryCount],
UserId
FROM Miles
GROUP BY UserID
GO
CREATE UNIQUE CLUSTERED INDEX ix_Miles ON vw_Miles(UserId)

그것의 오버 헤드가 너무 많으면 @jn29098의 솔루션은 한 번 좋은 일입니다. 예정된 작업을 사용하여 롤업하십시오. 각 사용자에 대해 많은 항목이있는 경우 작업이 마지막으로 실행 된 경우 델타 만 추가 할 수 있습니다.

UPDATE GlobalMiles SET [TotalMiles] = [TotalMiles] + 
  (SELECT SUM([Count]) 
    FROM Miles 
    WHERE UserId = @id 
      AND EntryDate > @lastTaskRun
    GROUP BY UserId)
WHERE UserId = @id

개별 항목을 저장하는 것이 신경 쓰지 않고 총액 만 즉시 카운트를 업데이트 할 수 있다면 다음과 같습니다.

UPDATE Miles SET [Count] = [Count] + @newCount WHERE UserId = @id

항목을 추가하고 두 세계를 갖는 스프로크와 함께이 방법을 사용할 수 있습니다.

마지막으로 트리거 방법도 작동합니다. SQL의 테이블 Instad에서 자동으로 업데이트를 수행하는 인덱스 뷰의 대안입니다. 또한 전역 업데이트를 SPROC에서 트리거로 이동하는 이전 옵션과 유사합니다.

마지막 세 가지 옵션은 항목을 제거 할 때 상황을 처리하기가 더 어려워 지지만 응용 프로그램의 기능이 아닌 경우 걱정할 필요가 없습니다.

이제 구체화되었으므로 데이터베이스의 실시간 데이터가 이제 보고서를 동적으로 생성 할 수 있습니다. 그런 다음 Ajax로 공상을 추가 할 수 있습니다.

다른 팁

데이터베이스의 많은 히트로 인해 성능 문제가 발생하는 경우 모든 입력을 가져 와서 메시지 큐 (MSMQ)에 넣는 것이 좋습니다. 그런 다음 다른 쪽 끝에 메시지를 선택하고 데이터를 대량 삽입하는 서비스를 제공 할 수 있습니다. 이렇게하면 DB 히트가 적습니다. 그런 다음 업데이트에서 텍스트 파일을 출력 할 수도 있습니다.

총 마일 런을 계산하는 한 번 또는 밤에 한 번 또는 밤에 롤업 한 요약 테이블을 만들 것입니다. 개별 요청의 경우 야간 요약 테이블과 마지막 롤업 계산 사이의 기간 동안 그리고 사용자가 해당 사용자의 총계를 얻기 위해 페이지를보고시기에 추가 로그인 한 마일을 가져올 수 있습니다.

얼마나 많은 사용자에 대해 이야기하고 있으며 하루에 얼마나 많은 로그 레코드가 있습니까?

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