База данных SQL Azure -> Добавить индекс -> Объект '/.rem' отключен или не существует на сервере - PullRequest
0 голосов
/ 18 ноября 2018

В моей базе данных довольно большая таблица, текущий размер 2 852,305 MB.Я могу довольно быстро запросить эту базу данных, используя экземпляр localdb на моем компьютере разработчика, около 100 мс.

enter image description here

Однако с точно таким же запросом и данными это занимает колоссальные 70 секунд в базе данных SQL Azure с 20 DTU (S1)!

enter image description here

Я читал об этом, TL; DR : использование индексов для запроса может решить проблему.

http://capesean.co.za/fixing-slow-performance-with-azure-sql-database/

Я использую Entity Framework, поэтому я добавил Index и попытался запустить Update-Database из PMC как обычно.

https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/data-annotations#multiple-column-indexes

Однако индекс не добавлен, я получаю сообщение об ошибке Object '/.rem' has been disconnected or does not exist at the server..Я читал о том же коде ошибки ниже, но, учитывая обстоятельства, я не контролирую время жизни объекта.

«Объект был отключен или не существует на сервере», исключение

Что я могу сделать, чтобы это исправить?

Вероятно, это также не проблема тайм-аута, и у миграции, и у ApplicationDbContext есть тайм-ауты.

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        CommandTimeout = 10000; // migration timeout
    }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        //Log to output
        Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

        //Prevent timeouts
        Database.CommandTimeout = 1800;
    }
    ...

Полная трассировка стека:

System.Runtime.Remoting.RemotingException: объект '/2f49096e_0c2e_49d6_a7a0_7ffbe823cf87/yxyu+vuywlowzb7myk8fhrw4_7932.rem' сервер отключен или не существует в данный момент.в System.Data.Entity.Migrations.Design.ToolingFacade.ToolLogger.Verbose (String sql) в System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql (MigrationStatement migrationStatement, соединение приемного соединения DbConnection, переход DbConnection, переход в DbConnection.Data.Entity.System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal (операция IEnumerable 1 migrationStatements, DbConnection connection) at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass32.<ExecuteStatements>b__30() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func 1) в System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute (операция Action) в System.Data.Entity.Migrations.DbMigrator.Exnte1053 * 1igrationStatements) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements (IEnumerable 1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable 1 операций, IEnumerable 1 systemOperations, Boolean downgrading, Boolean auto)<br> at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1 pendingMigrations, String targetMigrationId, String lastMigrationId)
в System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Uprations1 pendingMingtargetMigrationId, String lastMigrationId)
в System.Data.Entity.Migrations.DbMigrator.UpdateInternal (String targetMigration) в System.Data.Entity.Migrations.DbMigrator. <> c__DisplayClasse.b__d () в System.Data.Entity.Migrations.DbMigrator..Infrastructure.MigratorBase.Update (String targetMigration) в System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore () в System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run () Объект '/2f49096e_0c2e_49d6_a7a0_7ffbe823cf87/yxyu+vuywlowzb7myk8fhrw4_7932.rem' отключен или не существует на сервере.

1 Ответ

0 голосов
/ 18 ноября 2018

Код неудачной миграции выглядел так:

    public override void Up()
    {
        CreateIndex("dbo.MyTable", new[] { "Column1", "Column2", "Column3" }, name: "IX_MyIndex");
    }

Чтобы предотвратить ошибки в Visual Studio, я запустил команду Update-Database -script, скопировал сценарий и запустил его с помощью SQL Management Studio непосредственно для базы данных Azure. Созданный индекс выглядел так:

CREATE INDEX [IX_MyIndex] ON [dbo].[MyTable]([Column1], [Column2], [Column3])

Это добилось цели! Выполнение запроса заняло около 8 минут. Производительность теперь похожа на localdb:

enter image description here

Хорошая вещь о Update-Database -script в том, что вы получаете правильные значения для __MigrationHistory. Я мог бы скопировать их из моего localdb, но я думаю, что это чище.

Запуск любого кода базы данных даст вам эту ошибку, если есть несоответствие:

{"Сообщение": "Произошла ошибка.", "ExceptionMessage": "Модель поддержка контекста ApplicationDbContext изменилась с База данных была создана. Рассмотрите возможность использования Code First Migrations для обновления база данных (http://go.microsoft.com/fwlink/?LinkId=238269)

Отправил этот вопрос в Microsoft, поэтому я надеюсь, что они выпустят исправление для него.

https://twitter.com/Ogglas/status/1063927246245822464

...