Я пытаюсь ускорить некоторые системные функции. Есть много обращений к базе данных, и я сокращаю и удаляю лишние. (Я использую 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)
большое спасибо