0

多くの情報を取得した結果、ページの読み込みに約 22 ~ 24 秒かかりました。コードを最適化するためにできることはありますか?

これが私のコードです:

<?php
$result_rules = $db->query("SELECT source_id, destination_id FROM dbo.rules");

while($row_rules = sqlsrv_fetch_array($result_rules)){
$result_destination = $db->query("SELECT pk_id, project FROM dbo.destination WHERE pk_id=" . $row_rules['destination_id'] . " ORDER by project ASC");
    while($row_destination = sqlsrv_fetch_array($result_destination)){
        echo "Destination project: ";
        echo "<span class='item'>".$row_destination['project']."</span>";
        echo "ID: ".$row_rules['destination_id']."<br>";
        if ($row_rules['source_id'] == null) {
            echo "Source ID for Destination ID".$row_rules['destination_id']." is NULL<br>";
        } else {
            $result_source = $db->query("SELECT pk_id, project FROM dbo.source WHERE pk_id=" . $row_rules['source_id'] . " ORDER by project ASC");
            while($row_source = sqlsrv_fetch_array($result_source)){    
                echo "Source project: ";
                echo $row_source['project'];
                echo " ID: ".$row_rules['source_id']."<br>";
            }
        }
    }
}
?>

私のテーブルは次のようになります。

ソース テーブル: pk_id:int、project:varchar(50)、feature:varchar(50)、milestone:varchar(50)、reviewGroup:varchar(125)、groupId:int

ルール テーブル: pk_id:int、source_id:int、destination_id:int、login:varchar(50)、status:varchar(50)、batchId:int、srcPGroupId:int、dstPGroupId:int

宛先テーブル: pk_id:int、project:varchar(50)、feature:varchar(50)、milestone:varchar(50)、QAAssignedTo:varchar(50)、ValidationAssignedTo:varchar(50)、Priority:varchar(50)、groupId :int

4

6 に答える 6

0
  1. pk_Idのインデックスが作成されていることを確認してください:http ://www.w3schools.com/sql/sql_create_index.asp

  2. select *を使用するのではなく、すべての列が必要でない限り、必要な列のみを返します。

  3. また、SQLコードをサーバーに移動し、ストアドプロシージャを呼び出すことをお勧めします。

  4. バックエンドがmysqlの場合は、LIMITの使用を検討できます:http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

于 2013-03-14T17:26:59.347 に答える
0

else句がコードの速度を低下させていると思います。最初に必要になるすべてのデータを保存してから、else句で配列に再度アクセスすることをお勧めします。基本的に、毎回実行する必要はありません。

$result_destination = $db->query("SELECT * FROM dbo.destination WHERE pk_id=" . $row_rules['destination_id'] . " ORDER by project ASC")

以前にデータを取得し、PHPを使用してデータを反復処理することができます。

$result_destinations = $db->query("SELECT * FROM dbo.destination ORDER by project ASC")

そして、コードの後半でPHPを使用して正しい宛先を決定します。正確に何をしているのかに応じて、ある程度の時間を短縮する必要があります。

于 2013-03-14T17:27:14.823 に答える
0

手始めに、実行するクエリの数を減らしたいと思うでしょう。たとえば、クエリを実行し、それらの結果をループして別のクエリを実行してから、その結果セットをループしてさらにクエリを実行することは、一般的に悪いと見なされます。実行されるクエリの数は指数関数的に増加します。

たとえば、最初のクエリから100行が返され、各サブクエリから10行が返されるとします。最初のクエリは、ループする100行を返します。それらのそれぞれについて、再度クエリを実行します。現在、101のクエリがあります。次に、それらの100のそれぞれについて、それぞれ10行を返す別のクエリを実行します。現在、1001クエリになっています。各クエリは、サーバーにデータ(クエリテキスト)を送信し、応答を待ってデータを取得する必要があります。それはとても時間がかかるものです。

結合を使用して、すべてのテーブルに対して単一のクエリを実行し、単一の結果をループします。

于 2013-03-14T17:30:18.887 に答える
0

クエリの最適化についてサポートが必要な場合は、スキーマの詳細と説明計画の出力を提供してください。

ネストされたループを実行すると、パフォーマンスが低下します。このようにネストされたループ内でクエリを実行すると、パフォーマンスが非常に低下します。選択で「*」を使用すると、パフォーマンスも低下します(特に、これまでにいくつかの列を使用したことがあるだけです)。

PHP を最適化し、クエリをマージすることから始める必要があります。

$result_rules = $db->query(
     "SELECT rule.destination_id, [whatever fields you need from dbo.rules] 
             dest.project AS dest_project,
             src.project AS src_project,
             src.pk_id as src_id
      FROM dbo.rules rule
      INNER JOIN dbo.destination dest
          ON dest.pk_id=rule.destination_id
      LEFT JOIN dbo.source src
          ON src.pk_id=rule.source_id
      ORDER BY rule.destination_id, dest.project, src.project");

$last_dest=false;
$last_src=false;
while($rows = sqlsrv_fetch_array($result)){  
    if ($row['destination_id']!==$last_dest) {
       echo "Destination project: ";
       echo "<span class='item'>".$row['dest_project']."</span>";
       echo "ID: ".$row['destination_id']."<br>";
       $last_dest=$row['destination_id'];
    }
    if (null===$row['src_id']) {
       ... I'll let you sort out the rest.
于 2013-03-14T17:54:17.277 に答える
0

(pk_id, project)クエリに重要なすべてのフィールドが含まれるように、インデックスを追加します。

于 2013-03-14T17:26:44.947 に答える
0

もう 1 つの考慮事項は、php コードによって生成された html をブラウザーがレンダリングするのにかかる時間です。提示するデータが多いほど、時間がかかります。オーディエンスの要件によっては、一度に x レコードだけを表示したい場合があります。

サーバーに戻らずに表示されるレコード数を増やす jquery メソッドがあります。

于 2013-03-14T17:36:13.783 に答える