Azure SQL 数据库 -> 添加索引 -> 对象“/.rem”已断开连接或在服务器上不存在

Posted

技术标签:

【中文标题】Azure SQL 数据库 -> 添加索引 -> 对象“/.rem”已断开连接或在服务器上不存在【英文标题】:Azure SQL Database -> Add Index -> Object '/.rem' has been disconnected or does not exist at the server 【发布时间】: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(IEnumerable1 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' 已断开连接或在服务器上不存在。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Azure SQL 数据库 -> 添加索引 -> 对象“/.rem”已断开连接或在服务器上不存在的主要内容,如果未能解决你的问题,请参考以下文章

将索引从 SQL Server 2008 迁移到 SQL Azure

Azure SQL DB 与 Azure 搜索的自动索引/同步如何工作?

为查询创建优化的 Azure SQL 表

SQL Azure 切换聚集和非聚集索引

Azure SQL、聚集列存储索引、“TOP”性能

Azure SQL Server 空间索引错误无法创建...因为已计算列