Azure SQL对参数化查询的性能降低NVARCHAR(4000)

时间:2017-11-29 09:02:40

标签: sql-server entity-framework azure-sql-database

在使用Azure SQL数据库时,使用EntityFramework生成的参数化查询时,我发现了性能差异。

我有一个带有varchar(30)主键的表,当我尝试使用主键从该表中获取值时,EntityFramework使用NVARCHAR(4000)作为数据类型创建参数化查询。

right: "write"

这会在Azure SQL数据库上生成一个非常奇怪的执行计划。

Azure SQL execution plan 1

由于它使用了遍历整个表的索引扫描,所以效率很低。

如果我使用具有正确数据类型的参数,则执行计划使用主键索引。

DECLARE @p__linq__0 nvarchar(4000)
SET @p__linq__0 ='ehenurqp0kpql76kjsw3'

select * from mediacontentreferences where mediacontentreferenceid=@p__linq__0

Azure SQL execution plan 2

如果我在本地SQL服务器上使用第一个查询,则执行计划会将NVARCHAR(4000)转换为VARCHAR(30)并使用主键索引。 SQL Server execution plan 1

这看起来像是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?

1 个答案:

答案 0 :(得分:2)

您必须为列指定正确的数据类型,而不是EF,而生成查询时将使用正确的数据类型声明参数。只需将其添加到您的DbContext:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<mediacontentreferences >().Property(e => e.mediacontentreferenceid).HasColumnType("varchar");
    }