CastleActiveRecordを使用してテーブル内のすべての行を削除しようとしています。通常、私はこれを行います:
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
これには時間がかかります...実際にそれを終了させる忍耐力がないので、どれくらいの時間がかかるかわかりません。
私がやりたいのは、1つの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);
これは機能しているように見えますが、モデルとActiveRecordフレームワークを完全に回避しているため、私にはハックのように見えます。さらに、これはおそらくNHibernateが持っているキャッシングではうまく機能しません。
行ごとに2つのSQLステートメントを実行せずにテーブルを削除するより公式な方法はありますか?