TSQL/PHP太慢-重写
我有一个名为mainevents的表和一个名为subevents的表。对于每个mainevent,我需要3个子事件,它们与subname='$sub_name'和eventid匹配。 当有很多主事件时,脚本速度太慢。缓慢拖动,10秒后加载。当我禁用子事件循环时,脚本会立即加载。我认为可能有一种更短/更快/更简单的方法来写下面的内容。也许是一个问题。我不完全确定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
$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
使用左连接,必须重新编写脚本以正确显示事件,但将加载时间增加到正常值。