0

我试图在一些转换后将 SQL 查询结果加载到新表中。但即使是最简单的脚本也失败了。

   DECLARE @inquery nvarchar(max) = N'
   SELECT TOP 2000000  * from SQL Table'

   DECLARE @Rscript nvarchar(max) = N'

            sqlConnString = "Driver={SQL Server};SERVER='+@@SERVERNAME+N';DATABASE='+DB_NAME()+N';Trusted_Connection=True;"
            outTabName <- "OutputTable"
            outTabDS <- RxSqlServerData(table = outTabName, connectionString = sqlConnString)
          rxDataStep(inData = InputDataSet, outFile = outTabDS, maxRowsByCols = NULL, rowsPerRead = 500000)
   '
   EXEC sp_execute_external_script @language = N'R'
          , @script = @Rscript
          , @input_data_1 = @inquery
   WITH result sets none;

当我用 1M 行运行它时,它运行但无法用 2M 行写入。虽然 RevoScaleR 函数以块的形式处理数据,但为什么有更多的行数是个问题?因为相同的查询 ger 会导致 SQL 服务器。最大内存百分比也分配给 50 个 32 GB RAM。

4

1 回答 1

0

RevoScaleR 函数在使用 RxSqlServerData 等数据源时以块的形式处理数据。在这种情况下,如果您将 RxSqlServerData 用于输入数据而不是数据框,则不应达到内存限制。这是一个例子:

DECLARE @Rscript nvarchar(max) = N'

    sqlConnString = "Driver={SQL Server};SERVER='+@@SERVERNAME+N';DATABASE='+DB_NAME()+N';Trusted_Connection=True;"
    inTabName <- "InputTable"
    outTabName <- "OutputTable"
    inTabDS <- RxSqlServerData(table = inTabName, connectionString = sqlConnString)
    outTabDS <- RxSqlServerData(table = outTabName, connectionString = sqlConnString)
  rxDataStep(inData = inTabDS, outFile = outTabDS, maxRowsByCols = NULL, rowsPerRead = 500000)'
EXEC sp_execute_external_script @language = N'R'
      , @script = @Rscript
WITH result sets none;
于 2018-10-18T21:41:56.720 回答