2012-01-31 62 views
2

我正在爲我的老闆寫一個小工具,要求我從FedEx平面文件中提取記錄,然後從我們的ERP中獲取訂單數據。我遇到了一個嚴重的瓶頸,那就是當我通過PHP運行時,我的查詢花費的時間超過了5秒,我正在向集體尋求幫助。在PHP/PDO中顯着延長MSSQL查詢

應用OS:LAMP服務器W/PHP 5.3.2 DB:的Microsoft SQL Server 2008 R2

一旦我搶的發票,它給了我與發票相關聯的所有的訂單號碼。這些幾乎都是非順序的,而較大的發票可以有多達3,000個訂單號。

實施例: 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 AND o.ORDER_NO IN (86965,93616,93357,89475,90252,90249,93674,94029,88340,93044,89267,87340...)

上面的例子有2744個ORDER_NOs它需要抓住。如果我跳到我的Windows客戶端並使用管理工作室,它會在超過半秒(274995字節)內返回結果。如果我在PHP中執行它,則需要5.5到6秒。

我通常使用PDO dblib來訪問我的外星人數據庫,我試過直接查詢並準備好沒有改變的執行。我甚至在PHP中使用內置的mssql函數嘗試了代碼,沒有任何效果。

有什麼我失蹤,會讓我得到這個時間?我的執行計劃在數據庫服務器上看起來不錯,所以我非常認爲這是PHP的一個問題。

在此先感謝您提供的所有幫助!

+0

PDO的開銷相當小。你有沒有看過那5-6秒的實際花費在等待MySQL和PHP開銷多少? – 2012-01-31 15:34:07

+0

這絕對是一種可能性。我使用了debugDumpParams,並對我的查詢進行了microtiming,但是我不知道該如何監控它。 – VSack 2012-01-31 15:41:17

+0

我的另一個想法是,PHP以某種方式發送不同的查詢,當它在一個IN列表中。 – VSack 2012-01-31 15:41:58

回答

0

嗯,首先我才意識到,我寫了一個可怕的查詢。

我正在做一個INNER JOIN在多個條件之一,這是糟糕的名單。交換一個WHERE的AND會將查詢削減一半。

一位好友建議,可能是一個IN語句被dblib驅動程序糟糕的對待,並將它換出非常非常長的OR資格。儘管感覺很糟糕,但查詢結果還是不到一秒鐘!

所以我想這解決了這個問題......現在呢?

1

我從來沒有與pdo合作,但認爲你可以試試這個。如果這是唯一正在運行的進程,那麼在運行搜索查詢之前,請將訂單列表上載到表中。然後加入到搜索表中。

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

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