2013-08-06 3 views
0

Я смог найти similar и close-match вопросы относительно моего запроса. Но я хочу знать, есть ли лучшие способы сделать то же самое.Условный счет и группа по данным в реальном времени

У меня есть таблица базы данных, которая заполняется вызовом конечной точки веб-сервиса. Конечная точка вызывается, когда происходит определенное событие, и новая запись вставляется в эту таблицу. События происходят в режиме реального времени, и нет установленной частоты или схемы появления событий.

таблица выглядит следующим образом:

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

Я выборки данных из таблицы как:

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 

подробности о database schema, sample data и select-query для отчета доступна here.

Учитывая, что: данные

  1. подается в таблицу в режиме реального времени
  2. таблица будет хранить большой объем данных, прибл. 10,00,000+ запись
  3. структуры отчета-запрос не изменится
  4. данных будет фильтроваться на категории, дата-от даты и к (все необязательные параметры)
  5. время не имеет значения, только дата часть

будет ли это хорошая идея, чтобы запустить запланированное задание, которое будет работать и периодически обновлять новую таблицу со значениями из MyTbl? Новая таблица будет выглядеть так, как запрос отчета:

Date | Category | Sent | Received | Blocked | Opened 

и эта таблица будет запрошена применением категорий и даты фильтров.

Негативы такого подхода:

  1. Мы по-прежнему должны поддерживать данные на ежедневной основе
  2. Мы все еще должны применить GROUP BY и SUM
  3. Там может быть больше операций с базами данных, необходимых, чем исходный подход
  4. Мы не получим все данные, которые поступают в режиме реального времени.

Положительных этого подхода:

  1. Может ускорить записи выборки из базы данных, которая может ускорить процесс отображения, сортировки и пейджинговой

Является ли это жизнеспособным подходом? Есть ли другие способы ускорить процесс? Пожалуйста помоги!

+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 раз! Мне было трудно поверить, но теперь я знаю, что это потрясающе. Еще раз спасибо! –

Смежные вопросы