当我在SQL Server Mgt Studio中执行查询时,我的查询运行速度很快(不到1秒),但当我在PHP中使用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 )
;
4条答案
按热度按时间ryoqjall1#
什么设置是打开的,通常
ARITHABORT
是罪魁祸首,它在SSMS中是打开的,但您可能在关闭它的情况下连接在运行查询的同时,在SSMS中运行此命令,查看从PHP连接的会话的第一列是什么
5lhxktic2#
运行SQL事件探查器,并设置跟踪,查看两次运行之间是否有任何差异。
sc4hvdpw3#
在SQL事件探查器中使用LOGIN EVENT(和EXISTING CONNECTION)和Text列将显示许多重要SET命令的连接设置--Arithabort、Isolation Level、Quoted Identifier等。比较快速连接和慢速连接之间的这些设置,以查看是否有什么突出的地方。
jq6vz3qz4#
SET ARITHABORT ON;
,可能会提高查询性能。https://learn.microsoft.com/en-us/sql/t-sql/statements/set-arithabort-transact-sql?view=sql-server-ver16
在登录会话中始终将ARITHABORT设置为ON.将ARITHABORT设置为OFF可能会对查询优化产生负面影响,从而导致性能问题.