2012-03-07 1 views
1

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

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

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

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

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

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

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

+0

Сколько данных мы говорим? –

+0

Общий размер стола в 10 миллионов. В день - 10 тысяч. – mikebmassey

ответ

0

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

0

Как правило, я согласен с @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 

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

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

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

then warhousing звучит как overkill.

+0

Если вы собираетесь группировать по дням, почему бы не просто «GROUP BY CONVERT (DATE, TranDate)»? –

+0

Поскольку я написал этот шаблон запроса в SQL 2000:) [Полная форма включает в себя неделю, час, минута и т. Д., Что позволяет мне выбирать, какой «временной диапазон» я собираю. Но да, если вы только когда-либо имеете дело с календарными днями, преобразование в тип данных DATE будет проще.] –

0

Я бы с опцией номер 2.

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

Я не думаю, что это слишком много, чтобы разделить их.