From bb654360bf47c0d0b586564fe746ae583a1c8bc0 Mon Sep 17 00:00:00 2001 From: Sven Geusens Date: Wed, 31 Jul 2024 10:35:28 +0200 Subject: [PATCH] Improve migration performance (#16784) * Improve migration performance * Fix PR review comments * Revert tags migration for sql lite as the optimized sql doesn't work properly and sqlLite datasets should not be large anyway --- .../MigrateTagsFromNVarcharToNText.cs | 25 +++++++++++++++++++ .../V_12_0_0/UseNvarcharInsteadOfNText.cs | 16 ++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_10_7_0/MigrateTagsFromNVarcharToNText.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_10_7_0/MigrateTagsFromNVarcharToNText.cs index 9bc9856fe783..318fead2d681 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_10_7_0/MigrateTagsFromNVarcharToNText.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_10_7_0/MigrateTagsFromNVarcharToNText.cs @@ -25,6 +25,18 @@ protected override void Migrate() Database.Execute(updateDbTypeForTagsQuery); // Then migrate the data from "varcharValue" column to "textValue" + if (Database.DatabaseType == DatabaseType.SQLite) + { + MigrateSqlLiteData(); + } + else + { + MigrateSqlServerData(); + } + } + + private void MigrateSqlLiteData() + { Sql tagsDataTypeIdQuery = Database.SqlContext.Sql() .Select(dt => dt.NodeId) .From() @@ -44,4 +56,17 @@ protected override void Migrate() Database.Execute(updatePropertyDataColumnsQuery); } + + private void MigrateSqlServerData() + { + Sql updateTagsValues = Database.SqlContext.Sql() + .Update() + .Append("SET textValue = COALESCE([textValue], [varCharValue]), varcharValue = null") + .From() + .InnerJoin().On((dt, pt) => dt.NodeId == pt.DataTypeId) + .InnerJoin().On((pt, pd) => pt.Id == pd.PropertyTypeId) + .Where(dt => dt.EditorAlias == Constants.PropertyEditors.Aliases.Tags); + + Database.Execute(updateTagsValues); + } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_12_0_0/UseNvarcharInsteadOfNText.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_12_0_0/UseNvarcharInsteadOfNText.cs index e761ccf8c489..aaa2137c61e9 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_12_0_0/UseNvarcharInsteadOfNText.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_12_0_0/UseNvarcharInsteadOfNText.cs @@ -32,6 +32,15 @@ protected override void Migrate() MigrateNtextColumn("textValue", Constants.DatabaseSchema.Tables.PropertyData, x => x.TextValue); } + private void RawMigrateNtextColumn(string columnName, string tableName) + { + var updateTypeSql = @$" +ALTER TABLE {tableName} +ALTER COLUMN {columnName} nvarchar(max)"; + Sql copyDataQuery = Database.SqlContext.Sql(updateTypeSql); + Database.Execute(copyDataQuery); + } + private void MigrateNtextColumn(string columnName, string tableName, Expression> fieldSelector, bool nullable = true) { var columnType = ColumnType(tableName, columnName); @@ -40,6 +49,13 @@ private void MigrateNtextColumn(string columnName, string tableName, Expre return; } + // since it's ntext to nvarchar(max) we should be able to just raw query this without having issues with fallback values on sql server + if (Database.DatabaseType != DatabaseType.SQLite) + { + RawMigrateNtextColumn(columnName, tableName); + return; + } + var oldColumnName = $"Old{columnName}"; // Rename the column so we can create the new one and copy over the data.