1

我正在使用 Windows azure 表存储。我的问题是从表中访问给定用户的实体需要很长时间。我用来访问表的代码如下:

   public CloudTableQuery<T> GetEntites(string username)  
   {
        try
        {
            CloudTableQuery<T> entries =
                (from e in ServiceContext.CreateQuery<T>(TableName)
                 where e.PartitionKey == username
                 select e).AsTableServiceQuery();

            return entries;
        }
        catch (Exception)
        { return null; }
    }

表中的实体总数目前只有 100 个左右。例如:查询似乎需要 40 秒才能为给定用户返回 25 个实体。请建议代码是否有任何改进空间以提高性能?

4

2 回答 2

1

这里真正的问题是您返回的是查询而不是实体,并且您可能会为每个返回的实体(查询)再次执行查询。使用以下内容定义您的实体:

public class UserEntity
{
    public string UserName { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

然后使用以下内容定义您的表存储实体:

public class StoredUserEntity : TableServiceEntity
{
    public StoredUserEntity (string username)
    {
        this.PartitionKey = username;
        this.RowKey = Guid.NewGuid().ToString();
        this.Timestamp = DateTime.Now;
    }

    public string Email { get; set; }
    public string Name { get; set; }
}

那么您的查询实际上应该返回一个 UserEntities 列表:

    public List<UserEntity> GetUserData(string username)
    {
        var q = _tableContext.CreateQuery<StoredUserEntity>(_tableName);
        return
            q.ToList().Select(x => new UserEntity {UserName = x.PartitionKey, Email = x.Email, Name = x.Name}).Where(x => x.UserName == username).ToList();
    }
于 2013-01-09T01:53:23.653 回答
0

尝试使用 Fiddler 看看发生了什么。可能是您正在经历一些可能会减慢速度的重试。API 不会告诉您这一点,但使用 Fiddler,您可以准确地看到正在发出的请求、任何响应(以及错误)以及正在发出的请求数量。

于 2013-01-09T01:33:04.320 回答