このソリューションは機能しますが、パフォーマンスは予想よりも低くなります。200K 行を返すクエリには数分かかり、CPU が開発ボックスに固定されます。クエリ アナライザーで同じ*クエリを実行すると、すべての結果が 1 分未満で返されます。
Class MyController {
def index = {...}
...
def csv = {
...
def rs = DomainClass.createCritera().scroll {}
while(rs.next()){
response.getOutputStream().print(rs.getString(1)\n)
}
...
}
DB = 私の開発マシンとは別の専用ボックス上の SQL Server 2005 サーバー。
また、SQL Server Profiler を介して、gorm/hibernate が sp_cursorprepexec と sp_cursorfetch を使用して一度に 128 行の結果を読み取っていることにも気付きました。可能であれば、カーソルを使用しないようにしたいと思います。
それが問題かどうかはわかりませんが、役立つだけです。休止状態では、スクロールを前方のみに設定することは可能ですが、grails で同様の設定を見つけるのに苦労しています。
元の休止状態の問題。
解決策: 休止状態をバイパスします。10分から15秒。
Class MyController {
def DataSource
def index = {...}
...
def csv = {
...
def out = response.getOutoutStream()
Sql sql = new Sql(dataSource)
sql.eachRow("select c1, c2 from t1",{
out.println( it.c1 + "," + it.c2 )
})
...
}
*same = SQL Server プロファイラーからカット アンド ペーストしますが、ラップする sp_cursorprepexec sproc は除外します。