Есть ли способ ускорить UpdateFromQuery в EntityFramework.Extensions.EFCore - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь ускорить некоторые системные функции. Есть много обращений к базе данных, и я сокращаю и удаляю лишние. (Я использую EFCore 3.1 с SQL Server)

В одном случае вместо обновления одной (> 10M) записи по одной (используя простой метод EFCore SaveChanges) я использую метод UpdateFromQuery из Z.EntityFramework. Extensions.EFCore nuget library. это изменение, увеличить мою производительность очень хорошо! но все же он очень медленный!

Я смотрю на запрос в SQL профилировщик и да. эта функция генерирует только один запрос к базе данных. но этот запрос не оптимизировать. в запросе есть странное «соединение», которое замедляет его.

моя таблица:

public class Post
{
    public int Id { get; set; }
    public int BlogId { get; set; }
    public virtual Blog Blog { get; set; }
    public string Name { get; set; }
    public string Content { get; set; }
    public int Type { get; set; }
}

dbcontext:

public class SampleDbContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer("Data Source=.;Initial Catalog=Demo;Integrated Security=True");
    }
}

как я использую UpdateFromQuery:

static void Main(string[] args)
{
    using var dbcontext = new SampleDbContext();
    dbcontext.Posts.Where(x => x.Type == 4).UpdateFromQuery(x => new Post { Type = 8 });
}

сгенерированный запрос (в SQL profiler)

exec sp_executesql N'
UPDATE A 
SET A.[Type] = @zzz_BatchUpdate_0
FROM [Posts] AS A
INNER JOIN ( SELECT [p].[Id], [p].[BlogId], [p].[Content], [p].[Name], [p].[Type]
FROM [Posts] AS [p]
WHERE [p].[Type] = 4
       ) AS B ON A.[Id] = B.[Id]
',N'@zzz_BatchUpdate_0 int',@zzz_BatchUpdate_0=8

вот мои вопросы:

1 - как мне избавиться от этого JOIN ?? !!

2 - есть ли библиотека с функцией массового обновления, которая генерирует сценарии без глупых объединений?

(я уже знаю, что могу использовать прямые SQL команды или SP)

большое спасибо

...