From f06eda826be3a538a77ac2096234ea8feec5caed Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Thu, 26 Dec 2024 16:53:52 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Database/BenchmarkDbContext.cs | 12 ------- DD.Persistence.Benchmark/Results.md | 28 ++++++++++++++++ .../Tests/WitsDataBenchmark.cs | 33 ++++++++++--------- .../Migrations/20241225122815_Init.cs | 3 ++ 4 files changed, 49 insertions(+), 27 deletions(-) delete mode 100644 DD.Persistence.Benchmark/Database/BenchmarkDbContext.cs create mode 100644 DD.Persistence.Benchmark/Results.md diff --git a/DD.Persistence.Benchmark/Database/BenchmarkDbContext.cs b/DD.Persistence.Benchmark/Database/BenchmarkDbContext.cs deleted file mode 100644 index 7a0e054..0000000 --- a/DD.Persistence.Benchmark/Database/BenchmarkDbContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using DD.Persistence.Database; -using DD.Persistence.Database.Entity; - -namespace Persistence.Benchmark.Database; -public class BenchmarkDbContext : PersistenceDbContext -{ - public DbSet ParameterData => Set(); - public BenchmarkDbContext(DbContextOptions options) : base(options) - { - } -} diff --git a/DD.Persistence.Benchmark/Results.md b/DD.Persistence.Benchmark/Results.md new file mode 100644 index 0000000..01a131f --- /dev/null +++ b/DD.Persistence.Benchmark/Results.md @@ -0,0 +1,28 @@ +# Тестирование скорости работы с данными Wits + +Данный проект предназначен для замеров времени сохранения / получения данных с параметром и отметкой времени. Осуществляется сравнение скорости работы стандартных таблиц и гипертаблиц (timescale), а также сохранения параметра в формате string и jsonb, составного ключа и int ключа. + +## Партиционирование (timescale) | Формат параметра - Jsonb | Составной ПК +|Кол-во|Сохранение|Вычитка| +|-|--------|---| +|1.000.000|55 сек.|6.83 сек.| +|2.000.000|1 мин. 57 сек.|11 сек.| +|5.000.000|4 мин. 11 сек.|35 сек.| +|10.000.000|8 мин. 20 сек.|58 сек.| +|80.000.000|>100 мин.|20 мин. 3 сек.| + +## Без партиционирования | Формат параметра - String | Составной ПК +|Кол-во|Сохранение|Вычитка| +|-|--------|---| +|1.000.000|40 сек.|26 сек.| +|2.000.000|1 мин. 26 сек.|48 сек.| +|5.000.000|3 мин. 5 сек.|2 мин. 28 сек.| +|10.000.000|8 мин. 42 сек.|4 мин. 49 сек.| + +## Без партиционирования | Формат параметра - String | Int ПК +|Кол-во|Сохранение|Вычитка| +|-|--------|---| +|1.000.000|42 сек.|21 сек.| +|2.000.000|1 мин. 22 сек.|51 сек.| +|5.000.000|3 мин. 19 сек.|2 мин. 23 сек.| +|10.000.000|8 мин. 31 сек.|4 мин. 55 сек.| diff --git a/DD.Persistence.Benchmark/Tests/WitsDataBenchmark.cs b/DD.Persistence.Benchmark/Tests/WitsDataBenchmark.cs index f69685a..d281099 100644 --- a/DD.Persistence.Benchmark/Tests/WitsDataBenchmark.cs +++ b/DD.Persistence.Benchmark/Tests/WitsDataBenchmark.cs @@ -22,25 +22,25 @@ public static class WitsDataBenchmark var client = persistenceClientFactory.GetWitsDataClient(); var source = new CancellationTokenSource(TimeSpan.FromSeconds(6000)); - //var data = GenerateData(count); + var data = GenerateData(count); var sw = new Stopwatch(); - //var saved = 0; - //foreach (var item in data) - //{ - // var time = sw.Elapsed; + var saved = 0; + foreach (var item in data) + { + var time = sw.Elapsed; - // sw.Start(); - // var response = await client.AddRange(item, source.Token); - // sw.Stop(); - // saved = saved + response; - // Console.WriteLine($"Сохранено: {saved.ToString()}"); - //} + sw.Start(); + var response = await client.AddRange(item, source.Token); + sw.Stop(); + saved = saved + response; + Console.WriteLine($"Сохранено: {saved.ToString()}"); + } - //Console.WriteLine($"Затрачено времени на сохранение: {sw.Elapsed}"); + Console.WriteLine($"Затрачено времени на сохранение: {sw.Elapsed}"); var discriminator = Guid.Parse(discriminatorId); - var date = DateTime.Now.AddDays(-31); + var date = DateTime.Now.AddDays(-365); Console.WriteLine($"\nВычитка..."); @@ -49,7 +49,7 @@ public static class WitsDataBenchmark var get = await client.GetPart(discriminator, date, count, source.Token); sw.Stop(); - Console.WriteLine($"Затрачено времени на вычитку: {sw.Elapsed}"); + Console.WriteLine($"Затрачено времени на вычитку {get.SelectMany(e => e.Values).Count()} записей: {sw.Elapsed}"); } catch (Exception ex) { @@ -61,6 +61,8 @@ public static class WitsDataBenchmark { var result = new List>(); + var time = DateTimeOffset.UtcNow; + var seconds = -1; int enumerableCount = countToCreate / chunkSize + (countToCreate % chunkSize == 0 ? 0 : 1); for (var k = 0; k < enumerableCount; k++) { @@ -71,7 +73,8 @@ public static class WitsDataBenchmark { var random = new Random(); - var timestamped = DateTimeOffset.UtcNow.AddSeconds(random.Next(1, 60 * 60 * 24 * 30) * -1); + var timestamped = time.AddSeconds(seconds); + seconds = seconds - 1; dtos.Add(new WitsDataDto() { diff --git a/DD.Persistence.Database.Postgres/Migrations/20241225122815_Init.cs b/DD.Persistence.Database.Postgres/Migrations/20241225122815_Init.cs index 11fb14d..9718b24 100644 --- a/DD.Persistence.Database.Postgres/Migrations/20241225122815_Init.cs +++ b/DD.Persistence.Database.Postgres/Migrations/20241225122815_Init.cs @@ -142,6 +142,9 @@ namespace DD.Persistence.Database.Postgres.Migrations name: "IX_tech_message_SystemId", table: "tech_message", column: "SystemId"); + + migrationBuilder.Sql + ("SELECT create_hypertable('parameter_data','Timestamp','ParameterId',2,chunk_time_interval => INTERVAL '5 day');"); } ///