Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL/PHP太慢-重写_Php_Sql_Tsql - Fatal编程技术网

TSQL/PHP太慢-重写

TSQL/PHP太慢-重写,php,sql,tsql,Php,Sql,Tsql,我有一个名为mainevents的表和一个名为subevents的表。对于每个mainevent,我需要3个子事件,它们与subname='$sub_name'和eventid匹配。 当有很多主事件时,脚本速度太慢。缓慢拖动,10秒后加载。当我禁用子事件循环时,脚本会立即加载。我认为可能有一种更短/更快/更简单的方法来写下面的内容。也许是一个问题。我不完全确定 $a=sqlsrv_query($conn, "SELECT eventid,status,name, CONVERT(varc

我有一个名为mainevents的表和一个名为subevents的表。对于每个mainevent,我需要3个子事件,它们与subname='$sub_name'和eventid匹配。 当有很多主事件时,脚本速度太慢。缓慢拖动,10秒后加载。当我禁用子事件循环时,脚本会立即加载。我认为可能有一种更短/更快/更简单的方法来写下面的内容。也许是一个问题。我不完全确定

$a=sqlsrv_query($conn, "SELECT
    eventid,status,name, CONVERT(varchar(100),date,107) AS dt 
    FROM dbo.mainevents WHERE 
    ( date >= '$start_date' AND date <= '$stop_date' ) AND disabled='0'
    ORDER BY category asc");
while($e=sqlsrv_fetch_array($a)){
    $b=sqlsrv_query($conn, "SELECT 
        subid, subname FROM dbo.subevents WHERE
        eventid='$e[eventid]' AND subname='$sub_name' ORDER BY subname");
    while($s=sqlsrv_fetch_array($b)){
        //do stuff
    }
}
$a=sqlsrv\u查询($conn),选择
eventid、状态、名称、转换(varchar(100)、日期、107)为dt
来自dbo.mainevents,其中

(date>=“$start_date”和date为什么不在第一次查询中连接这两个表

在没有子事件的情况下,尽管您需要加入外部联接,否则将无法获得主事件

让SQL server的优化人员决定什么需要循环

SQL应该是这样的:

SELECT m.eventid, m.status, m.name, CONVERT(varchar(100),date,107) AS m.dt, s.subid, s.subname 
FROM dbo.mainevents m, dbo.subevents s
WHERE m.eventId *= s.eventId
AND ( m.date >= '$start_date' AND m.date <= '$stop_date' ) 
AND m.disabled='0'
ORDER BY m.category asc, s.subname asc
选择m.eventid、m.status、m.name、CONVERT(varchar(100)、date、107)作为m.dt、s.subid、s.subname
从dbo.mainevents m、dbo.subevents s
其中m.eventId*=s.eventId

和(m.date>=“$start_date”和m.date您应该使用显式的
左连接
(或
左外连接
,尽管不需要
外部
)语法。为什么?有一个非常好用的速记法,我个人一直觉得左/右外部连接语法过于冗长,让新手感到困惑。出于同样的原因,我建议在Oracle示例中使用
(+)
语法。这是《SQL Server内部》(Soukup,Delaney)一书中推荐的“。您应该将联接条件与筛选条件分开(
WHERE
子句)。这样联接表也可能导致在联接两个以上的表时出错,因为您无法控制它们联接的顺序。最后,它被弃用(在MS SQL Server中)。有关更多信息,请参阅本文:在s.eventId=m.eventId上使用
左连接dbo.subevents s
使用左连接,必须重新编写脚本以正确显示事件,但将加载时间增加到正常值。