Entity framework 从 Azure sql 获取数据大约需要 10 分钟
Entity framework takes about 10 minutes to get data from Azure sql
我有一个 Azure sql 数据库,我在其中记录了稍后分析的聊天记录。查询一开始没问题,但目前它有大约 1100 万个条目,我花了 586 秒来获取数据。
我的模型
public class Messages
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Index]
public DateTime Timestamp { get; set; }
public string Message { get; set; }
public string Username { get; set; }
public int ChannelId { get; set; }
[ForeignKey("ChannelId")]
public virtual Channel Channel { get; set; }
}
数据库调用
IEnumerable<Messages> messages = context.Messages.AsNoTracking()
.Where(x => x.Channel.ChannelName == Channelname &&
x.Timestamp > StartTime &&
x.Timestamp < EndTime).ToArray();
数据一旦插入就只能读取。我尝试索引时间戳列,但似乎没有帮助。数据也按日期时间排序,所以我不明白为什么要花那么长时间。
更新:
我做了一些基准测试
我的方式Channel.ChannelName ==频道名称:4:35
我的方式Channel.ChannelId == Id: 16sec
建议答案:4:30
建议 ID:16 秒
示例是 40k 个结果。
我该如何解决这个问题?我可以优化更多吗?
您的频道 table 是否有正确的键和索引?也可以先尝试过滤非外部 table 的属性(例如:Channel)。
var messages = context.Messages.AsNoTracking()
.Where(m => (m.Timestamp > StartTime) && (m.Timestamp < EndTime))
.Where(x => x.Channel.ChannelName == Channelname)
.ToArray();
我有一个 Azure sql 数据库,我在其中记录了稍后分析的聊天记录。查询一开始没问题,但目前它有大约 1100 万个条目,我花了 586 秒来获取数据。
我的模型
public class Messages
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Index]
public DateTime Timestamp { get; set; }
public string Message { get; set; }
public string Username { get; set; }
public int ChannelId { get; set; }
[ForeignKey("ChannelId")]
public virtual Channel Channel { get; set; }
}
数据库调用
IEnumerable<Messages> messages = context.Messages.AsNoTracking()
.Where(x => x.Channel.ChannelName == Channelname &&
x.Timestamp > StartTime &&
x.Timestamp < EndTime).ToArray();
数据一旦插入就只能读取。我尝试索引时间戳列,但似乎没有帮助。数据也按日期时间排序,所以我不明白为什么要花那么长时间。
更新:
我做了一些基准测试
我的方式Channel.ChannelName ==频道名称:4:35
我的方式Channel.ChannelId == Id: 16sec
建议答案:4:30
建议 ID:16 秒
示例是 40k 个结果。
我该如何解决这个问题?我可以优化更多吗?
您的频道 table 是否有正确的键和索引?也可以先尝试过滤非外部 table 的属性(例如:Channel)。
var messages = context.Messages.AsNoTracking()
.Where(m => (m.Timestamp > StartTime) && (m.Timestamp < EndTime))
.Where(x => x.Channel.ChannelName == Channelname)
.ToArray();