2012-01-31 2 views
2

私の上司のために、私はFedExフラットファイルからレコードを抽出し、ERPから注文データを取得する必要があります。私は深刻なボトルネックに遭遇しているため、PHPを実行するとクエリが5秒以上かかることがあります。私は集団に助けを求めています。PHP/PDOでExpotentiallyが長くかかるMSSQLクエリ

アプリOS:LAMPサーバーワット/ 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...)

上記の例では、つかむために必要2,744 ORDER_NOsを有しています。私がWindowsクライアントにジャンプして管理スタジオを使用すると、わずか半分(274995バイト)を超える結果が返されます。私はPHPでそれを行う場合は5.5から6秒かかる。

私は通常、自分のエイリアンデータベースにアクセスするためにPDO dblibを使用しています。私はダイレクトクエリを試して、変更なしで準備を実行しました。私はPHPでmssql関数を組み込んだコードを使用しても効果がありませんでした。

私はこの時間を逃すことができないものがありますか?私の実行計画はデータベースサーバー上でよく見えるので、PHPに問題があることを強く意識しています。

ご協力いただきありがとうございます。皆様のお手伝いをさせていただきます。

+0

PDOのオーバーヘッドはごくわずかです。 5〜6秒のどれが実際にMySQLを待つのに費やされたか、そしてPHPのオーバーヘッドはいくらですか? –

+0

これは間違いなく可能性があります。私はdebugDumpParamsを使用していましたが、私のクエリをマイクロタイミングしていましたが、私はこれを監視できる方法を決定することができませんでした。 – VSack

+0

私の他の考えは、PHPが何らかの理由でINリストにあるときに別の方法でクエリを送信したということでした。 – VSack

答えて

0

まあ、最初のオフ、私はちょうど私がひどいクエリを書いたことに気づきました。

私は複数の条件文の中でINNER JOINを実行していますが、そのうちの1つはこの厄介なリストです。 WHEREのためにANDを入れ替えて、クエリを半減させました。

仲間は、おそらくIN文がdblibドライバによってうまく処理されておらず、非常に長いOR資格のためにそれをスワップすることを推奨しました。それは私の感覚には恐ろしいと感じますが、クエリ結果は1秒以内に戻ります!

だから私はこの問題を解決すると思います...今は?

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 
関連する問題