【问题标题】:Azure SQL Database -> Add Index -> Object '/.rem' has been disconnected or does not exist at the serverAzure SQL 数据库 -> 添加索引 -> 对象“/.rem”已断开连接或在服务器上不存在
【发布时间】:2018-11-17 22:26:25
【问题描述】:

我的数据库中有一个很大的表,当前大小是2 852,305 MB。我可以在我的开发人员机器上使用localdb 实例快速查询这个数据库,大约需要 100 毫秒。

但是,在具有 20 个 DTU (S1) 的 Azure SQL 数据库上,使用完全相同的查询和数据需要 70 秒

我正在阅读此内容,TL;DR:使用索引进行查询可以解决问题。

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

我正在使用实体框架,所以我添加了一个Index,并尝试像往常一样从PMC 运行Update-Database

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.。我已经阅读了以下相同的错误代码,但考虑到我无法控制对象的生命周期的情况。

"Object has been disconnected or does not exist at the server" exception

我能做些什么来解决这个问题?

这也可能不是超时问题,迁移和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(字符串 sql) 在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement、DbConnection 连接、DbTransaction 事务,DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable1 migrationStatements、DbTransaction 事务、DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements、DbConnection 连接、DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 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](Func1 操作)在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(操作 操作)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements, DbTransaction existingTransaction) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 迁移声明)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable1 操作, IEnumerable1 systemOperations, Boolean downgrading, Boolean auto)
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, 字符串 targetMigrationId, 字符串 lastMigrationId)
在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, 字符串 targetMigrationId, 字符串 lastMigrationId)
在 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(字符串 目标迁移)在 System.Data.Entity.Migrations.DbMigrator.c__DisplayClasse.b__d() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.DbMigrator.Update(字符串 目标迁移)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串 目标迁移)在 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' 已断开连接或在服务器上不存在。

【问题讨论】:

    标签: c# sql-server entity-framework azure azure-sql-database


    【解决方案1】:

    迁移失败的代码如下所示:

        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

    Update-Database -script 的好处是您可以得到正确的 __MigrationHistory 值。我本可以从我的localdb 复制这些内容,但我认为这更干净。

    如果存在不匹配,运行任何数据库代码都会出现此错误:

    {"Message":"发生错误。","ExceptionMessage":"模型 支持“ApplicationDbContext”上下文自 数据库已创建。考虑使用 Code First 迁移来更新 数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)

    将此问题发送给 Microsoft,希望他们能解决此问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多