【发布时间】:2021-10-31 20:41:24
【问题描述】:
我在 .NET 中有这个简单的视图类:
public partial class vw_ViewFromMSSQL : BaseSQL
{
public long ID { get; set; }
public long databaseid { get; set; }
public long prop2 { get; set; }
public long prop3 { get; set; }
BaseSQL 在哪里:
public abstract class BaseSQL
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long ID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid UUID { get; set; }
}
现在我有了这个简单的 LINQ,它应该返回给定 databaseid 的数据:
var data = await _context.vw_ViewFromMSSQL
.Where(x => x.databaseid == databaseid )
.Select(x=> new DTOClass()
{
ID = fks.ID,
databaseid = x.databaseid,
prop2 = x.prop2,
prop3 = x.prop3
}).ToListAsync();
现在这个 data 在大约 10 秒内获取数据,即使它应该只返回 150 行。但是,如果我在 SQL Server 中运行查询,我会在 1 秒内得到结果。我有大量与其他视图相关的此类调用,但它们返回结果的速度比这快得多。这个视图有索引,它有类中描述的每一列。另一件需要注意的是,所有的电话都经过Task,所以它们是async 电话。
这更像是一个讨论而不是一个问题,但是这种缓慢的获取可能是什么原因,有没有办法加快速度?
【问题讨论】:
-
您需要运行 SQL Server Profiler 并查看实际发送到 SQL Server 的查询,然后您可以对其进行调整。
-
对于“获取速度慢的原因可能是什么”的答案是 LINQ to SQL 是愚蠢的。我并不是说你试图使用它是愚蠢的。我的意思是微软愚蠢地相信他们可以保护使用 SQL 数据库的开发人员不必学习任何 SQL。编写高性能 SQL 既是科学又是艺术,认为它可以从完全不同的语言自动生成是错误的。
-
嗯,我明白了。感谢大家的回答,这东西是迟钝的,当我通过其他道具过滤时,即使它获得 x3 倍的行数,它也会更快地获得结果
-
为了获得更好的性能帮助,我们需要查看查询计划(您可以通过brentozar.com/pastetheplan 分享)以及表和索引定义。除非这是一个索引视图,它没有索引,我们需要查看基表
标签: c# .net sql-server sqlperformance