Простые данные - мне просто нужен простой способ анализа - PullRequest
0 голосов
/ 26 апреля 2009

Резюме

После нескольких советов о том, как проще всего анализировать простые данные с помощью сервера SQL и .net

Подробнее

Действительно простые данные - просто нужен действительно простой способ анализа (с моим простым умом)

У меня есть таблица SQL Server:

  • PKID (Int)
  • ApplicationName (VarChar)
  • MethodName (VarChar)
  • TimeInMs (целое число)
  • AdditionalInfo (VarChar)
  • DateTime (ДатаВремя)

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

Данные - Средняя продолжительность времени для вызова метода - Десять самых медленных вызовов методов - Десять самых быстрых вызовов методов

на периоды: - последняя минута, час, день, неделя, месяц - каждый день в течение последних 7 дней, каждую неделю в течение последних 10 недель

Для приложений: - Все - каждый индивидуально

Ответы [ 2 ]

1 голос
/ 26 апреля 2009

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

select count(*) from table_name where ApplicationName = "BAR.EXE";

select sum(TimeInMs) from table_name group by ApplicationName;

Кроме написания кода для деления этих чисел, вы не можете сделать очень много.

Обновление : с помощью отметки времени вы можете отрегулировать условие where вышеупомянутых примеров, чтобы выбрать интересующие вас диапазоны. Учитывая неточный характер вашего вопроса, я мог бы предложить импортировать данные в Excel не установлен Excel) и массива данных различными способами, а не напрямую возиться с SQL.

0 голосов
/ 26 апреля 2009

Я думаю, что ojblass ссылался на поле DataTime, которое вы пропустили в своем вопросе.

Фактический тип данных временной метки в MS SQL Server вводит в заблуждение по имени. Это не имеет ничего общего с датами и временем. Это двоичный «номер версии». Он используется в основном для решения проблем параллелизма при обновлении строки в таблице, но будет бесполезен для любых задач анализа.

Я бы предложил немного улучшить имена столбцов. Вызов столбца «DateTime» сбивает с толку и может вызвать проблемы при написании запросов, если вы не будете осторожны.

В любом случае ... запросы, которые вы ищете, варьируются от простых до довольно сложных, если они написаны непосредственно на TSQL.

Вот несколько примеров (я не проверял их синтаксис, поэтому они в лучшем случае "приблизительны"):

Среднее время для конкретного метода

select avg(TimeInMs) as AvgTime from Table 
where ApplicaitonName = @ApplicationName

Среднее время для конкретного метода в течение последней 1 минуты

select avg(TimeInMs) as AvgTime from Table 
where ApplicaitonName = @ApplicationName and 
    [DateTime] >= DATEADD(minute, -1, getdate())

В итоге вы захотите написать хранимые процедуры для большинства из них. Некоторые запросы, о которых вы говорите, потребуют некоторой группировки и тому подобного ... Я рекомендую вам получить книгу по TSQL, если вы пойдете по этому пути.

Если вы делаете это с помощью LINQ к SQL в вашем applicaiton, это не сильно отличается, но в целом LINQ проще написать (спорно, конечно).

Вот те же два запроса, использующие LINQ to SQL в C # (опять же, я не проверял их, поэтому я мог быть с незначительными синтаксическими ошибками).

var ctx = new MyDataContext();
var q = (from item in ctx.Table
        where item.ApplicationName == "MyApplication"
        select item.TimeInMs).Average();


var ctx = new MyDataContext();
var q = (from item in ctx.Table
        where item.ApplicationName == "MyApplication" &&
              item.DateTime <= DateTime.Now.AddMinutes(-1)
        select new item.TimeInMs).Average();

То, как вы будете проводить анализ, зависит от того, какие технологии вы используете и что вы делаете с результатами.

Обновление: В ответ на дополнительный вопрос из комментариев:

Я не могу придумать хороший способ справиться с этим, сохранив нужные временные интервалы в другой таблице, которая не становится слишком сложной (курсоры и динамически создаваемый TSQL с помощью команды Execture).

Более простой запрос, который дает желаемые результаты, может выглядеть в TSQL следующим образом (я не сторонник того, чтобы это был "лучший" способ, но он работает и работает довольно быстро).

select avg(TimeInMs) as AvgTime, 'Last 1 minute' as TimePeriod from Table 
where ApplicaitonName = @ApplicationName and 
    [DateTime] >= DATEADD(minute, -1, getdate())
union
select avg(TimeInMs) as AvgTime, 'Last 2 minutes' as TimePeriod from Table 
where ApplicaitonName = @ApplicationName and 
    [DateTime] >= DATEADD(minute, -2, getdate())
-- //repeat union as many times as needed for each time period
...