【发布时间】:2012-06-15 11:02:24
【问题描述】:
我正在尝试使用 Castle ActiveRecord 删除表中的所有行。通常,我会这样做:
DB.ParseError.DeleteAll();
但是,这个表恰好有大约 190 万行。上面的命令会为表格中的每一行发出一个单独的SELECT 和DELETE,看起来像这样:
SELECT page0_.Id as Id29_0_, ... FROM Indexer.Pages page0_ WHERE page0_.Id=:p0;:p0 = b03665aa-37d0-4a2d-a04c-c232ebd94dbc [Type: Guid (0)]
SELECT page0_.Id as Id29_0_, ... FROM Indexer.Pages page0_ WHERE page0_.Id=:p0;:p0 = 11cb69e3-1c6a-4ac1-908b-084dfe859639 [Type: Guid (0)]
--- 1.9 million more of these
DELETE FROM Indexer.ParseErrors WHERE Id = :p0;:p0 = b03665aa-37d0-4a2d-a04c-c232ebd94dbc [Type: Guid (0)]
DELETE FROM Indexer.ParseErrors WHERE Id = :p0;:p0 = 11cb69e3-1c6a-4ac1-908b-084dfe859639 [Type: Guid (0)]
--- 1.9 million more of these
这需要......好吧,我不知道需要多长时间,因为我没有耐心让它真正完成。
我想要它做的是发出一条 SQL 语句;这个:
DELETE FROM Indexer.ParseErrors;
这是我迄今为止尝试过的:
ISessionFactoryHolder holder = ActiveRecordMediator.GetSessionFactoryHolder();
ISession session = holder.CreateSession(typeof(DB.ParseError));
IDbCommand cmd = session.Connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "DELETE FROM Indexer.ParseErrors;";
cmd.CommandTimeout = 600;
cmd.ExecuteNonQuery();
holder.ReleaseSession(session);
这似乎可行,但对我来说似乎是一种 hack,因为它完全避免了模型和 ActiveRecord 框架。另外,这可能不适用于 NHibernate 的任何缓存。
有没有更官方的方式来删除一张表,每行不做2条SQL语句?
【问题讨论】:
标签: c# .net nhibernate castle-activerecord