2013-07-10 2 views
0

У меня есть таблица Azure, которая служит журналом событий. Мне нужен самый эффективный способ прочитать нижнюю часть таблицы, чтобы получить последние записи.Самый эффективный способ чтения снизу базы данных Azure Table

Каков наиболее эффективный способ сделать это?

+0

Как бы вы определили PartitionKey и значения RowKey в этой таблице? –

+0

@GauravMantri, да, действительно, у меня есть. – Sam

+0

Извините, в моем вопросе не было ясно. Я хотел спросить о логике, которую вы использовали для определения ключей. Например, если вы посмотрите на данные диагностики, собранные облачными службами, они используют DateTime.Ticks (в формате UTC) с точностью до минут для PartitionKey. –

ответ

2

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

Тогда, если вы хотите получить, скажем, 100 последних журналов, которые вы просто вызываете (скажем, что запрос - это IQueryable что-то от вашего любимого клиента - мы используем Lucifure Stash): query.Take (100);

Если вы хотите получить объекты за определенный период, вы пишете: query.Where (x => x.PartitionKey < = value); или что-то подобное.

Переменная «value» должна быть построена на основе того, как вы создаете значения для ключа раздела.

+0

Отличное предложение и сделал именно то, что я хотел сделать. – Sam

0

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

DateTime toDateTime = DateTime.UtcNow; 
    DateTime fromDateTime = toDateTime.AddMinutes(-15); 

    string myPartitionKeyFrom = fromDateTime.ToString("yy-MM"); 
    string myPartitionKeyTo = toDateTime.ToString("yy-MM"); 

    string query = ""; 
    if (myPartitionKeyFrom.Equals(myPartitionKeyTo))//In case both time periods fall in same month, then we can directly hit that partition. 
    { 
     query += "(PartitionKey eq '" + myPartitionKeyFrom + "') "; 
    } 
    else // Otherwise we would need to do a greater than and lesser than stuff. 
    { 
     query += "(PartitionKey ge '" + myPartitionKeyFrom + "' and PartitionKey le '" + myPartitionKeyTo + "') "; 
    } 
    query += "and (RowKey ge '" + fromDateTime.ToString() + "' and RowKey le '" + toDateTime.ToString() + "')"; 
0

Если вы хотите получить последнее количество записей «n», вам нужно слегка изменить значение PartitionKey и RowKey, чтобы последние записи были перенесены в верхнюю часть таблицы.

Для этого вам необходимо вычислить обе клавиши, используя DateTime.MaxValue.Subtract(DateTime.UtcNow).Ticks; вместо DateTime.UtcNow.

0

Корпорация Майкрософт предоставляет инфраструктуру SemanticLogging, которая имеет конкретную раковину до log to Azure Table.

Если вы посмотрите на исходный код библиотеки, он генерирует ключ раздела (в обратном порядке), основанный на DATETIME:

static string GeneratePartitionKeyReversed(DateTime dateTime) 
{ 
    dateTime = dateTime.AddMinutes(-1.0); 
    return GetTicksReversed(
     new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, 0)); 
} 

static string GetTicksReversed(DateTime dateTime) 
{ 
    return (DateTime.MaxValue - dateTime.ToUniversalTime()) 
     .Ticks.ToString("d19", (IFormatProvider)CultureInfo.InvariantCulture); 
} 

Таким образом, вы можете реализовать ту же логику в вашем приложении, чтобы построить свой PartitionKey.

Если вы хотите, чтобы получить журналы для определенного диапазона дат, вы можете написать запрос, который выглядит так:

var minDate = GeneratePartitionKeyReversed(DateTime.UtcNow.AddHours(-2)); 
var maxDate = GeneratePartitionKeyReversed(DateTime.UtcNow.AddHours(-1)); 

// Get the cloud table 
var cloudTable = GetCloudTable(); 

// Build the query 
IQueryable<DynamicTableEntity> query = cloudTable.CreateQuery<DynamicTableEntity>(); 

// condition for max date 
query = query.Where(a => string.Compare(a.PartitionKey, maxDate, 
          StringComparison.Ordinal) >= 0); 

// condition for min date 
query = query.Where(a => string.Compare(a.PartitionKey, minDate, 
          StringComparison.Ordinal) <= 0);3 
Смежные вопросы