时间:2010-05-22 01:38:39

标签: php sql-server

当我在SQL Server Mgt Studio中执行查询时,我有一个快速运行的查询(1秒),但是当我在PHP中运行完全相同的查询时(在同一个db instace上) 使用FreeTDS v8,mssql_query(),需要更长的时间(70秒以上)。

我正在点击的表在我在Where子句中使用的日期字段上有一个索引。

可能是PHP的mssql函数没有使用索引吗?

我也尝试将查询放在存储过程中,然后从PHP执行SP - 同样会导致时间差异。

我还尝试在具有日期索引的表上添加一个WITH(INDEX(..))子句,但也没有运气。

以下是查询:

SELECT
        1 History,
        h.CUSTNMBR CustNmbr,
        CONVERT(VARCHAR(10), h.ORDRDATE, 120 ) OrdDate,
        h.SOPNUMBE OrdNmbr,
        h.SUBTOTAL OrdTotal,
        h.CSTPONBR PONmbr,
        h.SHIPMTHD Shipper,    
        h.VOIDSTTS VoidStatus,
        h.BACHNUMB  BatchNmbr,
        h.MODIFDT ModifDt

  FROM  SOP30200 h
        WITH (INDEX (AK2SOP30200))
  WHERE
        h.SOPTYPE = 2 AND
        h.DOCDATE >= DATEADD(dd, -61, GETDATE()) AND
        h.VOIDSTTS = 0 AND
        h.MODIFDT = CONVERT(VARCHAR(10), DATEADD(dd, -1*@daysAgo, GETDATE()) , 120 )
  ;

3 个答案:

答案 0 :(得分:1)

正在进行什么设置,通常ARITHABORT是罪魁祸首,它在SSMS中是开启的,但您可能正在连接它

在运行查询时在SSMS中运行此命令,并查看从PHP连接的会话的第一列是什么

select arithabort,* from sys.dm_exec_sessions
where session_id > 50

答案 1 :(得分:0)

运行SQL事件探查器,并设置跟踪并查看两次运行之间是否存在任何差异。

答案 2 :(得分:0)

使用SQL事件探查器中的LOGIN EVENT(和EXISTING CONNECTION)和Text列将显示许多重要SET命令的连接设置 - Arithabort,Isolation Level,Quoted Identifier等。在快速和慢速连接之间进行比较和对比,看看是否有什么突出的。