【问题标题】:SQL insert Or update times out if large date in loop如果循环中的大日期,SQL 插入或更新超时
【发布时间】:2016-04-03 09:11:30
【问题描述】:

我有一些带有用户 ID 和日期的数据。

有时有大数据需要循环更新sql数据库,但数据库超时。

请问有什么更好的方法吗,下面的示例代码。

foreach($time[$re->userid][$today] as $t){

                if(($re->time >= $t->in_from) && ($re->time < $t->in_to)
                    && md5($t->WorkDay."_in".$re->date) != $in){//in

                    $tble = tools::sd("{$t->WorkDay} in");
                }

                if(($re->time >= $t->out_from) && ($re->time < $t->out_to)
                    && md5($t->WorkDay."_out".$re->date) != $out){//out

                    $tble = tools::sd("{$t->WorkDay} out");

                    if($tble =='nout'){
                        $re->date2 = tools::ndate($re->date . "- 1");
                    }
                }

                if(!empty($tble)){ 
                    $q = array(
                         "id" => $re->userid
                        , "dt" => $re->date2
                        , "{$tble}" => $re->time
                    );

                    dump($q); // insert into sql
                }
            }

转储函数:::

function dump($d ='')
{
    if(!empty($d)){
    end($d);  
    $tble = key($d); 
    $d['ld'] = "{$d['dt']} {$d[$tble]}";

        $r = $GLOBALS['mssqldb']->get_results("
            IF NOT EXISTS (select id,ld,dt,{$tble} from clockL 
                WHERE id = '{$d['id']}' 
                AND dt ='{$d['dt']}')
                INSERT INTO clockL (id,ld,dt,{$tble})
                VALUES ('{$d['id']}','{$d['ld']}','{$d['dt']}'
                ,'{$d[$tble]}')
            ELSE IF EXISTS (select id,{$tble} from clockL 
                WHERE id = '{$d['id']}' 
                AND dt ='{$d['dt']}'
                AND {$tble} = 'NOC'
                ) 
                update clockL SET {$tble} ='{$d[$tble]}', ld ='{$d['ld']}' WHERE id = '{$d['id']}' 
                AND dt ='{$d['dt']}' AND {$tble} ='NOC'
            ");

            //print_r($GLOBALS['mssqldb']);
    }
}

谢谢。

【问题讨论】:

  • 在循环中要做很多条件逻辑。另一种方法是将所有内容放入临时表并从临时表写入主表。

标签: php sql sql-server large-data


【解决方案1】:

您知道名为set_time_limit() 的PHP 函数吗?你可以找到详细的文档here

这可以操纵执行时间,默认为30秒。如果设置为0,例如set_time_limit(0),则没有执行时间限制。

【讨论】:

    【解决方案2】:

    可能是循环是超时的原因。 因为当您在循环中执行插入/更新操作时,与数据库的连接将处于打开状态,直到循环终止,这可能会导致超时问题。

    尝试在循环之外执行插入/更新操作。

    【讨论】:

      【解决方案3】:

      在循环外执行插入/更新。将它包含在事务中,这样如果脚本过早终止,您就不会得到不一致的数据库状态。使用一个大查询通常比进行大量小查询要快。您还可以为时间和内存限制设置更高的值,但要注意后果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 2011-07-04
        • 1970-01-01
        • 2016-10-04
        • 2020-07-07
        • 2013-03-20
        • 2015-09-05
        相关资源
        最近更新 更多