我有一个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 == Channelname: 4:35
我的方式Channel.ChannelId == Id: 16秒
建议答覆: 4:30
建议使用id: 16秒
样品为40k。
我该怎么解决这个问题?我能优化更多吗?
发布于 2015-09-22 18:04:01
您的频道表有正确的键和索引吗?另外,首先尝试筛选不是外部表的属性(例如: Channel)。
var messages = context.Messages.AsNoTracking()
.Where(m => (m.Timestamp > StartTime) && (m.Timestamp < EndTime))
.Where(x => x.Channel.ChannelName == Channelname)
.ToArray();https://stackoverflow.com/questions/32723570
复制相似问题