MSSQL查询在PHP/PDO中可能需要更长的时间

MSSQL查询在PHP/PDO中可能需要更长的时间,php,sql,sql-server-2008,pdo,Php,Sql,Sql Server 2008,Pdo,我正在为我的老板编写一个小工具,它要求我从联邦快递的平面文件中提取记录,然后从我们的ERP中获取订单数据。我遇到了一个严重的瓶颈,这导致我的查询在通过PHP运行时花费的时间超过5秒,我正在向集合寻求帮助 App OS:LAMP服务器w/PHP5.3.2 DB:MicrosoftSQLServer2008R2 一旦我拿到一张发票,它就会给我所有与发票相关的订单号。这些几乎都是非顺序的,较大的发票最多可以有3000个订单号 例如: 选择o.ORDER_NO、o.TRANSACTION_ID、o.S

我正在为我的老板编写一个小工具,它要求我从联邦快递的平面文件中提取记录,然后从我们的ERP中获取订单数据。我遇到了一个严重的瓶颈,这导致我的查询在通过PHP运行时花费的时间超过5秒,我正在向集合寻求帮助

App OS:LAMP服务器w/PHP5.3.2 DB:MicrosoftSQLServer2008R2

一旦我拿到一张发票,它就会给我所有与发票相关的订单号。这些几乎都是非顺序的,较大的发票最多可以有3000个订单号

例如:

选择o.ORDER_NO、o.TRANSACTION_ID、o.SHIP_DATE、o.SHIP_CHRG、s.TRANSACTION_ID、s.ACTUAL_WGHT、s.PACKER、s.SHIP_DEPARTMENT、s.TRACKER_ID,从o.TRANSACTION_ID=s.TRANSACTION_ID的内部联接中选择o.SHIP_日期、o.SHIP_CHRG、s.TRANSACTION_ID、s.TRANSACTION_ID、s.Action_ID、s.Action_ID、s.Action_ID、s.ACTUAL_实际_Wgh

上面的示例需要获取2744个订单号。如果我跳转到Windows客户端并使用ManagementStudio,它将在半秒多一点(274995字节)的时间内返回结果。如果我用PHP来做,需要5.5到6秒

我通常使用PDO dblib来访问我的外来数据库,并且我尝试了直接查询并准备执行,没有任何更改。我甚至在PHP中使用内置的mssql函数来尝试代码,但没有效果

有什么我错过的,可以让我这次下来吗?我的执行计划在数据库服务器上看起来不错,所以我强烈倾向于认为这是PHP的一个问题


提前感谢你们所有人可能提供的任何帮助

我从未与pdo合作过,但我想你可以试试这个。如果这是唯一正在运行的进程,则在运行搜索查询之前,请将订单列表上载到表中。然后在搜索中加入该表

insert into **order_list**
select 86965
union select 93616
union select 93357
union select 89475

然后


首先,我意识到我写了一个糟糕的查询

我正在对多个条件进行内部连接,其中一个是这个糟糕的列表。将AND替换为WHERE将查询切成两半

一位好友建议,dblib驱动程序可能对IN语句处理不当,并将其替换为非常、非常长的或限定的语句。虽然感觉很糟糕,但查询结果在不到一秒钟的时间内返回


所以我想这就解决了这个问题……现在?

PDO的开销相当小。你有没有考虑过,在这5-6秒钟中,有多少时间是用来等待MySQL的,PHP的开销又有多少?这绝对是可能的。我使用了debugDumpParams并对我的查询进行了微计时,但我不知道如何监控它。我的另一个想法是,当查询位于in列表中时,PHP会以不同的方式发送查询。PHP对SQL一无所知。PDO对SQL也知之甚少,只足以找出占位符在参数化查询中的位置。所有实际的sql处理都是在mysql.mssql中完成的。我完全听到了,但这让我昨晚睡不着觉,所以我在考虑所有理性和非理性的可能性:)
insert into **order_list**
select 86965

insert into **order_list**
select 93616

insert into **order_list**
select 93357
SELECT o.ORDER_NO, o.TRANSACTION_ID, o.SHIP_DATE, o.SHIP_CHRG, s.TRANSACTION_ID,       s.ACTUAL_WGHT, s.PACKER, s.SHIP_DEPARTMENT, s.TRACKER_ID 
FROM o INNER JOIN s ON o.TRANSACTION_ID = s.TRANSACTION_ID 
INNER JOIN order_list oo ON o.ORDER_NO = oo.ORDER_NO