데이터베이스에 저장 프로 시저를 실행하고 약 225 개의 열이있는 큰 레코드 집합을 반환하는 Windows 스크립트 호스트 스크립트가 있습니다 (열 수가 쿼리에 따라 달라 지므로 미래에는 더 커질 수 있습니다.)큰 레코드 집합을 처리 할 때 "메모리 부족"오류가 발생했습니다
var adUseServer = 2;
var adUseClient = 3;
var adOpenForwardOnly = 0;
var adLockReadOnly = 1;
var dbc = new ActiveXObject("ADODB.connection")
dbc.connectionString = "Driver={SQL Server};Server=MYDBSERVER;Database=MYDB;uid=USER;Pwd=PASSWORD;"
dbc.CursorLocation = adUseClient
dbc.connectionTimeout = 3600
dbc.commandTimeout = 3600
dbc.open
// Setup test table
WScript.echo("Setting table...");
dbc.execute("IF OBJECT_ID(N'export_test', N'U') IS NOT NULL DROP TABLE export_test;;");
dbc.execute("create table export_test (channelID int)");
// Changing to 130 works (for me)
for(var n = 1; n < 131; n++)
{
dbc.execute("alter table export_test ADD test_" + n + " NVARCHAR(4000) DEFAULT '0' not null");
}
WScript.echo("Starting query...");
var rsData = serverQuery("Select * from export_test")
WScript.echo("Starting loop...");
var count = 0;
while(rsData.eof == 0)
{
WScript.echo(count++);
rsData.moveNext();
}
WScript.echo("All done");
function serverQuery(sql)
{
var rsData = new ActiveXObject("ADODB.recordset");
rsData.CursorLocation = adUseServer;
rsData.CursorType = adOpenForwardOnly;
rsData.LockType = adLockReadOnly;
rsData.MaxRecords = 1; // This makes no difference
rsData.open(sql, dbc);
return rsData;
}
클라이언트 커서를 사용하여이 쿼리를 실행하면 "메모리 부족"오류가 발생합니다. 서버 커서로 실행하면 "이 작업을 완료하는 데 사용할 수있는 저장소가 부족합니다"오류가 발생합니다.
데이터를 줄이려고 시도했지만 많은 행이 반환되지 않고 문제가 지속됩니다.
나는 결과를 '페이징'하려고했으나 반환 된 행을 줄이려고 시도 했으므로 도움이되지 않는다는 두려움 때문에 도움이되지 않았다. 그래서 많은 수의 열이있을 수 있다고 생각한다. (역동적이고 시간이 지남에 따라 갈수록 점점 커질 수 있습니다)이 문제의 근본 원인입니다.
SO 및 다른 사이트에서 읽은 후 데이터베이스 로그 파일 크기를 "제한되지 않은 성장"으로 변경하려고 시도했지만 '최대 크기 2GB'로 되 돌리지 않을 것입니다.하지만 다른 문제가 있습니다. 생각하다).
누구도 이에 대한 더 많은 아이디어 나 통찰력을 갖고 있지 않습니까?
감사합니다.