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(IEnumerable
1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable
1 migrationStatements、DbTransaction 事务、DbInterceptionContext 拦截上下文)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable
1 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](Func
1 操作)在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(操作 操作)在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements, DbTransaction existingTransaction) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable
1 迁移声明)在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable
1 操作, 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' 已断开连接或在服务器上不存在。
【问题讨论】:
【参考方案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