在使用Azure SQL数据库时,使用EntityFramework生成的参数化查询时,我发现了性能差异。
我有一个带有varchar(30)主键的表,当我尝试使用主键从该表中获取值时,EntityFramework使用NVARCHAR(4000)作为数据类型创建参数化查询。
right: "write"
这会在Azure SQL数据库上生成一个非常奇怪的执行计划。
由于它使用了遍历整个表的索引扫描,所以效率很低。
如果我使用具有正确数据类型的参数,则执行计划使用主键索引。
DECLARE @p__linq__0 nvarchar(4000)
SET @p__linq__0 ='ehenurqp0kpql76kjsw3'
select * from mediacontentreferences where mediacontentreferenceid=@p__linq__0
如果我在本地SQL服务器上使用第一个查询,则执行计划会将NVARCHAR(4000)转换为VARCHAR(30)并使用主键索引。
这看起来像是Azure SQL服务器上执行计划计算中的一个缺陷。
是否有可能根据创建查询的方式更改Entity Framework的行为?
我已经阅读了几篇关于此的文章,但没有在那里找到解决方案。
Why does code first/EF use 'nvarchar(4000)' for strings in the raw SQL command?
Why does Entity Framework generate large parameters? How can they be reduced?
答案 0 :(得分:2)
您必须为列指定正确的数据类型,而不是EF,而生成查询时将使用正确的数据类型声明参数。只需将其添加到您的DbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<mediacontentreferences >().Property(e => e.mediacontentreferenceid).HasColumnType("varchar");
}