Php 如何分页或批处理对mssql_execute()的调用?

Php 如何分页或批处理对mssql_execute()的调用?,php,sql,sql-server,stored-procedures,Php,Sql,Sql Server,Stored Procedures,例如,当我使用特殊SQL调用MSSQL数据库时,从tablename中选择foo,我可以为该调用提供批处理大小。当我期望返回大量数据时,这非常有用 在我的例子中,我有一个超过2亿行的表,我得到了它们。是的,我有理由成为这样一个口吃的数据狂 我的数据库人员说,嘿,停止使用特设SQL,在这里,使用这个漂亮的SP。它做同样的事情 所以我在mssql_执行函数调用中使用它,但在执行此操作时,无法像mssql_查询那样指定批大小 我不仅要做一个ini设置“内存限制”,“64G”;要使这项工作正常进行,我还

例如,当我使用特殊SQL调用MSSQL数据库时,从tablename中选择foo,我可以为该调用提供批处理大小。当我期望返回大量数据时,这非常有用

在我的例子中,我有一个超过2亿行的表,我得到了它们。是的,我有理由成为这样一个口吃的数据狂

我的数据库人员说,嘿,停止使用特设SQL,在这里,使用这个漂亮的SP。它做同样的事情

所以我在mssql_执行函数调用中使用它,但在执行此操作时,无法像mssql_查询那样指定批大小

我不仅要做一个ini设置“内存限制”,“64G”;要使这项工作正常进行,我还必须努力工作,因为SP呼叫需要运行半小时以上。一旦它运行,我就可以在mssql_fetch_行上执行一个循环,没问题,但最初的调用是一个钉子咬

一旦我完成了,我有一个进程在一个96G的盒子上占用了57G的内存,然后在80%的CPU下花了整整一个小时来放松和垃圾收集。是的,我可以终止这个过程,但那是一个黑客

一定有更好的办法

使用ad-hoc SQL,我调用批量大小为10000行的mssql_查询并处理它们,然后返回以获取更多信息。然后我可以做类似echo的事情是的,事实上,我现在在$I排。。。消除我对一切正常运行的妄想


所以。。。如果我被迫使用数据库人员希望我使用的SP,那么什么是合适的方法呢?

假设表有主键,我建议您让数据库人员向存储过程添加两个参数,一个用于返回的行数,另一个用于起始键值。为初始批传递NULL,并为每个后续批传递返回的最后一个键值。这将提供高效的仅向前分页。例如:

CREATE PROCEDURE dbo.usp_select_tablename
      @NumRows int
    , @StartKey int = NULL
AS 
IF @StartKey IS NULL
BEGIN
    SELECT TOP(@NumRows) foo
    FROM tableName
    ORDER BY StartKey;
END
ELSE
BEGIN
    SELECT TOP(@NumRows) foo
    FROM tableName
    WHERE Key > @StartKey
    ORDER BY StartKey;
END;

你问过你的DB成员他们建议你做什么吗??