2013-08-06 4 views
0

검색어에 대해 similarclose-match 개의 질문을 찾을 수있었습니다. 그러나 같은 일을하는 더 좋은 방법이 있는지 알고 싶습니다.조건부 개수 및 그룹화 기준 (실시간 데이터 포함)

웹 서비스 끝점에 대한 호출로 채워지는 데이터베이스 테이블이 있습니다. 끝점은 특정 이벤트가 발생하고이 테이블에 새 레코드가 삽입 될 때 호출됩니다. 이벤트는 실시간으로 발생하며 설정된 빈도 또는 이벤트 발생 패턴이 없습니다. 내가 같은 테이블에서 데이터를 가져 오는하고

CREATE TABLE MyTbl(id int, type nvarchar(10), timestamp datetime, category nvarchar(50)); 

: 보고서에 대한 database schema, sample dataselect-query에 대해

SELECT category, 
COUNT(CASE WHEN type = 'sent' THEN 1 END) sent, 
COUNT(CASE WHEN type = 'received' THEN 1 END) received, 
COUNT(CASE WHEN type = 'blocked' THEN 1 END) blocked, 
COUNT(CASE WHEN type = 'opened' THEN 1 END) opened 
FROM MyTbl 
WHERE timestamp >= '2013-01-01 00:00:00' AND timestamp < '2013-02-01 00:00:00' 
GROUP BY category 

세부 사항을 here 수 있습니다처럼

표 보인다.

  1. 데이터
  2. 테이블이 약 데이터의 거대한 볼륨을 저장합니다 실시간으로 테이블에 공급된다 다음이 있음을

    을 감안할 때. 보고서 쿼리의
  3. 구조는
  4. 데이터를 변경하지 않습니다 10,00,000+ 기록이 범주를 필터링 할 것, 날짜로부터
  5. 시간 (모든 선택적 매개 변수입니다) 날짜에 만 날짜 관련이 없습니다 일부는

MyTbl에서 값을 갖는 새 테이블을 정기적으로 실행하고 업데이트 할 예약 된 작업을 실행하는 것이 좋습니다 될 것이다? 새 테이블은 보고서 쿼리와 비슷하게 보입니다.

Date | Category | Sent | Received | Blocked | Opened 

이 테이블은 범주 및 날짜 필터를 적용하여 쿼리됩니다. 이 방법

부정적 우리는 여전히 매일 데이터를 관리해야

  1. 우리는 여전히 GROUP BY와 SUM을 적용해야
  2. 댄 필요 이상의 데이터베이스 작업이있을 수 있습니다 원래 접근 방식
  3. 우리는 실시간으로 제공되는 모든 데이터를 얻지 못할 것입니다. 이 방법

긍정적 :

정렬, 속도 업 수있는 디스플레이의 과정을 데이터베이스에서 가져 오는 레코드를-속도 및 페이징 수 있습니다

이것이 가능한 방법입니까? 프로세스 속도를 높이는 다른 방법이 있습니까? 도와주세요!

+0

LINQ to SQL –

+0

을 사용하면 저장 프로 시저를 시도 할 수도 있습니다. 그들은 SQL 쿼리 –

+1

@sourabhdevpura를 훨씬 빠르게 실행합니다. 이것은 저장 프로 시저만을 사용하여 실행됩니다. SQL 쿼리를 사용하여 간단하게 만들었습니다. –

답변

2

예. 가능한 방법입니다.

또한 쿼리를 PIVOT으로 다시 구성하는 것이 좋습니다.

select * 
from 
    (select [date],category, [type] 
     from yourtable 
     where timestamp between '2013-01-01' and '2013-02-01') d 
pivot 
(count (type) for [type] in (sent,blocked,received,opened)) p 
+0

나는 그렇게하는 법을 모른다. 어떻게 보여줄 수 있습니까? –

+0

고마워요! 이 쿼리는 ~ 37 번까지 원래 쿼리보다 빠르게 실행됩니다! 믿기가 힘들었지 만 지금은 정말 대단하다. 다시 한 번 감사드립니다! –