如何使用php5.3在MS SQL SERVER中加速插入操作


How to speed up the insert action in MS SQL SERVER with php5.3?

我使用apache2.2、php 5.4和php_sqlsrv_53_nts_vc6.dll,用MS SQL SERVER进行大型插入。

插入操作的速度非常低,这让我很头疼:插入100行,花费28秒!即使我使用

sqlsrv_begin_transaction($conn)sqlsrv_commit($conn)

它仍然需要7到11秒。

然后我尝试了使用MS SQL SERVER的Navicat,使用开始交易;承诺;我可以在6秒内插入8000行。

所以,我想这不是MS SQL SERVER的问题,而是PHP和PHP_sqlsrv_53_nts_vc6.dll的问题。

有人能告诉我如何用MS SQL加快php中的插入操作吗?或者给我看一些代码?

这是我的代码:

在tools.php中:

public static $dbtype = FALSE;
public static function query($sql,$conn){
    if(self::$dbtype==FALSE){
        self::$dbtype = tools::getConfigItem("DB_TYPE");
    }
    $res = FALSE;
    if(self::$dbtype=="mysql"){
        $res = mysql_query($sql,$conn);
    }
    if(self::$dbtype=="mssql"){
        $sql = iconv('UTF-8','GBK',$sql);
        $res = sqlsrv_query($conn,$sql);
    }           
    return $res;
}
public static function transaction($conn){
    if(self::$dbtype=="mysql"){
        mysql_query('START TRANSACTION;',$conn);
    }
    if(self::$dbtype=="mssql"){
        if ( sqlsrv_begin_transaction( $conn ) === false ) {
             die( print_r( sqlsrv_errors(), true ));
        }
    }
}
public static function commit($conn){
    if(self::$dbtype=="mysql"){
        mysql_query('COMMIT;',$conn);
    }
    if(self::$dbtype=="mssql"){
        sqlsrv_commit( $conn );
    }
}

install.php中:

public static function step4_2(){
    $t_return = array("status"=>"2","msg"=>"");
    $sqls = json_decode2($_REQUEST['sqls'],TRUE);
    if(count($sqls)==0){
        return array(
            'status'=>'2'
            ,'msg'=>'wrong request:'.$_REQUEST['sqls']
        );
    }
    $conn = tools::getConn();
    tools::transaction($conn);
    for($i=0;$i<count($sqls);$i++){
        $sqls[$i] = strtolower($sqls[$i]);
        $res = tools::query($sqls[$i],$conn);
    }
    tools::commit($conn);
    $t_return = array("status"=>"1","msg"=>count($sqls)." sql executed ");
    return $t_return;
}   

提前感谢

好吧,我自己找到了解决方案。

    tools::transaction($conn);
    if(tools::$dbtype=="mssql"){
        $str = implode(";",$sqls);
        tools::query($str,$conn);
    }
    else{
        for($i=0;$i<count($sqls);$i++){
            tools::query($sqls[$i], $conn);
        }
    }   
    tools::commit($conn);

发送所有sql,按";"拆分一次性发送所有sql,以加快