2016-11-01 4 views
1

Я следующий запрос на Azure таблице:Повышение производительности этой Azure строки таблицы подсчета запроса

var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count(); 

Это MessageEntity:

public class MessageEntity : TableEntity 
{ 
    public MessageEntity() { } 

    public string Message { get; set; } 
} 

Этот запрос очень медленно. Требуется около 15 секунд, чтобы подсчитать в общей сложности 85 000 записей на моей машине разработки. Я использую Azure Storage Emulator с номером UseDevelopmentStorage=true в качестве строки подключения. Что я могу сделать, чтобы сделать его более эффективным? Все, что я пытаюсь сделать, это подсчитать количество записей, конечно же, должен быть более быстрый способ?

ответ

2

Как вы уже знаете, Azure Tables имеют ограниченную поддержку LINQ, а Count в настоящее время не поддерживается (List of supported LINQ operators).

var count = table.ExecuteQuery(new TableQuery<MessageEntity>()).Count(); 

Код выше выборки всех объектов из таблицы (до 1000 лиц, в то время), а потому, что у вас есть 20000 объектов в вашей таблице, она делает по крайней мере 20 запросов к Azure Tables. Поскольку каждый запрос является HTTP-запросом API REST API Azure, вот почему вы видите, что он занимает так много времени. Это будет еще хуже, если вы попытаетесь получить счет для сущностей в таблице из реальной учетной записи хранилища.

Одним из способов сокращения времени является сокращение данных, передаваемых по сети (особенно данные ответа). В настоящее время каждое свойство объекта возвращается как часть данных ответа. Поскольку вас интересует только общий счет, вы можете использовать Query Projection и получить только одно свойство (скажем PartitionKey или RowKey) обратно в ответ. Таким образом, ваши данные ответа будут намного меньше, чем у вас в настоящее время, и это должно немного сократить время.

Если значение для ведения учета действительно важно для вас, еще одна вещь, которую вы можете сделать, - рассчитать счет через некоторый фоновый процесс и обновить его в отдельной таблице.

1

В лазурной таблице хранения нет функции подсчета. Что на самом деле происходит в вашем запросе - вы оттягиваете все записи и перечисляете их по одному.

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

Хранилище таблиц - это хранилище ключей значений ключей с кластеризованным ключом, состоящим из ключа раздела и строки строки. Это в значительной степени. Если вам нужны возможности агрегирования, я бы предложил посмотреть на DocumentDB (хотя у них есть только некоторые функции агрегации) или SQL Azure.

0

Вот как вы можете получить количество сущностей для одного раздела в своей лазурной таблице без извлечения сущностей. Для каждого раздела создайте еще один объект, который позволяет вызывать его объект подсчета строк с тем же ключом раздела, но с константным ключом строки (например, «rowcountRK»). Объект подсчета строк будет иметь одно длинное свойство типа ie. «rowCount», который будет содержать количество строк для этого раздела.

Каждый раз, когда вы вставляете объект в этот раздел, вы также увеличиваете свойство rowCount объекта подсчета строк для этого раздела. И вы делаете это в пакетной операции.Операция пакетной таблицы Azure является атомарной внутри одного раздела и поэтому не будет никакой несогласованности. Аналогично, каждый раз, когда вы удаляете и сущность из раздела, вы также уменьшаете свойство rowCount вашего объекта подсчета строк и снова отправляете эти операции в рамках пакетной операции в хранилище таблицы azure для согласованности и атомарности.

Теперь, если вы хотите запросить количество строк в одном разделе, все, что вам нужно сделать, - это запросить объект подсчета строк для этого раздела и не нужно извлекать/сканировать что-либо еще. Если вы хотите получить общее количество строк во всей таблице, предполагая, что в вашей таблице имеется более одного раздела, тогда вам нужно будет запросить все элементы подсчета строк в таблице и суммировать их значения свойств строки на клиенте боковая сторона. Это приведет к сканированию таблицы, но полезная нагрузка будет меньше, она, вероятно, будет быстрее, чем сканирование всей таблицы.