50 lines
1.9 KiB
C#
50 lines
1.9 KiB
C#
using DD.Persistence.Database.Entity;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using System.ComponentModel.DataAnnotations.Schema;
|
|
using System.Reflection;
|
|
|
|
namespace DD.Persistence.Database.Postgres.Extensions;
|
|
public static class EFExtensionsPartitioning
|
|
{
|
|
public static void AddPartitioning(this DatabaseFacade db)
|
|
{
|
|
db.CreateTimescaledbExtension();
|
|
db.AddParameterDataPartitioning();
|
|
}
|
|
|
|
private static void CreateTimescaledbExtension(this DatabaseFacade db)
|
|
{
|
|
var sqlString = $"CREATE EXTENSION IF NOT EXISTS timescaledb;";
|
|
db.ExecuteSqlRaw(sqlString);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Добавить партиционирование таблицы ParameterData (Wits - данные)
|
|
/// </summary>
|
|
/// <param name="db"></param>
|
|
private static void AddParameterDataPartitioning(this DatabaseFacade db)
|
|
{
|
|
var dayCount = 1;
|
|
var sectionCount = 128;
|
|
var type = typeof(ParameterData);
|
|
var tableAttribute = type.GetCustomAttribute<TableAttribute>();
|
|
if (tableAttribute is null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var sqlCreateHypertableString = $"SELECT create_hypertable('{tableAttribute.Name}'," +
|
|
$"by_range('{nameof(ParameterData.Timestamp)}', INTERVAL '{dayCount} day'), if_not_exists => {true});";
|
|
db.ExecuteSqlRaw(sqlCreateHypertableString);
|
|
|
|
var sqlCreateDimensionParameterId = $"SELECT add_dimension('{tableAttribute.Name}'," +
|
|
$"by_hash('{nameof(ParameterData.ParameterId)}', {sectionCount}), if_not_exists => {true});";
|
|
db.ExecuteSqlRaw(sqlCreateDimensionParameterId);
|
|
|
|
var sqlCreateDimensionDiscriminatorId = $"SELECT add_dimension('{tableAttribute.Name}'," +
|
|
$"by_hash('{nameof(ParameterData.DiscriminatorId)}', {sectionCount}), if_not_exists => {true});";
|
|
db.ExecuteSqlRaw(sqlCreateDimensionDiscriminatorId);
|
|
}
|
|
}
|