Лучший подход к данным временных рядов в SQL Server 2008 - PullRequest
1 голос
/ 07 марта 2012

Через stored procedure в SQL Server 2008 я пытаюсь показать количество транзакций за последние 7 дней, а затем сравнить эти цифры с 7-дневным периодом год назад.Кроме того, я хотел бы иметь возможность показывать месяц-месяц по сравнению с месяцем-год назад.Или с этого месяца по последний месяц.И т. Д. По существу, time-series данные.

У меня есть таблица со всеми отдельными транзакциями.Я могу придумать два варианта:

  1. Рассчитать каждый отдельный день или месяц и вернуть набор результатов во время выполнения.

  2. Рассчитайте каждый отдельный день и поместите результат в таблицу.Обновляйте это ежедневно.Создайте еще одну таблицу на несколько недель.Еще один стол на месяцы.Каждый день добавляйте запись или обновляйте существующую запись.Это, безусловно, сделает запрос быстрее, так как данные уже рассчитаны.Однако, если бы мне пришлось вносить обновления в предыдущие дни (с учетом возврата / отмены)

Примечание: это внутреннее приложение, поэтому оно не будет видеть тысячи запросов в минуту,

Каков наилучший способ вернуть данные этого типа?

Другая альтернатива, о которой я подумал, - это использование HBase OpenTSDB через Вариант 2, но, похоже, это тот же процесс.

Ответы [ 3 ]

0 голосов
/ 07 марта 2012

Я в целом согласен с @Justin. Один из способов ускорить это - запрос, основанный на этой идее:

SELECT 
   datepart(yy, TranDate)  Year
  ,datepart(mm, TranDate)  Month
  ,datepart(dd, TranDate)  Day
  ,count(*)
 from TranTable
 where TranDate between @Start and @Stop
 group by
   datepart(yy, TranDate)  --  Year
  ,datepart(mm, TranDate)  --  Month
  ,datepart(dd, TranDate)  --  Day
 order by
   datepart(yy, TranDate)  --  Year
  ,datepart(mm, TranDate)  --  Month
  ,datepart(dd, TranDate)  --  Day

Вам придется изменить это для вашей системы и требований.

Настройка отдельной таблицы, которая обновляется каждый день (или около того), является стандартной тактикой хранения данных. Это может быть полезно, если вы не хотите, чтобы «отчетные» запросы блокировали вашу транзакционную систему, или если вам нужны таблицы, специально предназначенные для поддержки таких запросов (для производительности, обычно). Но если

Это внутреннее приложение, поэтому оно не будет видеть тысячи запросов минуту.

тогда боевой дом звучит как перебор.

0 голосов
/ 09 марта 2012

Я бы пошел с вашим вариантом № 2.

У вас есть OLTP схема базы данных, и вы хотите выполнить OLAP запросов.

Я не думаю, что раздавать их излишне.

0 голосов
/ 07 марта 2012

Возможно, я неправильно понял вопрос или мне нужно увидеть схему вашей таблицы (или что-то подобное), но я вижу это как простой SELECT COUNT(*)...WHERE DATE BETWEEN [2Dates].Если все, что вам нужно сделать, это подсчитать количество транзакций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...