2016-11-29 10 views
0

実行中の在庫システムを作成しています。毎日の在庫を含むテーブルにデータを入力する処理時間を短縮する方法の提案を探しています。
1):テーブル内のすべてのエントリを更新する

は、私はこれを行うために使用しています4つのデータベーステーブルを持っています。毎日の使用表
2)。着信商品テーブル(入荷予定)
3)。物理インベントリカウントテーブル(ここで保持される毎月の物理カウント合計)
4)。永久に実行するインベントリテーブル(完全な世界でこれはインベントリが必要なものです)

現在、私は永続的なテーブルで各データを更新しています。計算を行うにはかなり時間がかかります、データベースに接続して情報を更新します。

私の質問は
どのようにこれをスピードアップできますか?一度に配列からすべての情報をアップロードできる方法はありますか?数百回ではなく1回だけデータベースを更新していますか?

75行のコードを残して申し訳ありませんが、何が起こっているのかを簡単に確認できるようにすべてを表示したかったのです。

コードの後ろに私のロジック:
私は配列にすべての4つのテーブルから情報を引っ張って、その後の配列を巡回することから始め。私は2週間前からテーブルの最初の部分(2016年の初め)の代わりに日付関数を使います。日付の割り当てが満たされると、前日の永続的な実行中の在庫を引っ張り、現在の日付の日々の使用量を減算し、現在の日付を追加して現在の日数を永久にします。私は現在の永遠の日があると、永久テーブルをそのデータで更新します。

単純に情報を配列に格納しただけでは、基本的に最後のテーブル全体に書き込むことはできますか?それが可能な場合、これははるかに高速だろうと思っていますか?相続人は、コード

<?php 

    include("connection.php"); 

    /* $rowper below (Row Perpetual) */ 
    $query= "SELECT * FROM perpetual"; 
    $result = mysqli_query($link, $query); 

    /* $rowdaily below  */ 
    $query2= "SELECT * FROM dailyusage"; 
    $result2 = mysqli_query($link, $query2); 

    /* $rowpo below (Row Purchase Order) */ 
    $query3= "SELECT * FROM incomming"; 
    $result3 = mysqli_query($link, $query3); 

    /* $rowinv below (Row Inventory) */ 
    $query4= "SELECT * FROM inventory"; 
    $result4 = mysqli_query($link, $query4); 

    $checkdate = mktime(0, 0, 0, date('n'), date('d')-14, date('y')); 
    $checkdate= date('Y-m-d', $checkdate); 

    $b=1; 

    while (($rowper=mysqli_fetch_array($result)) and ($rowdaily=mysqli_fetch_array($result2)) and ($rowpo=mysqli_fetch_array($result3)) and ($rowinv=mysqli_fetch_array($result4))){ 

     $a=2; 

     if($b == 1){ 

      while($a< mysqli_num_fields($result)) { 
       /* $it holds the item #s from the column */ 
       $it[$a]=$rowper[$a]; 

       $a++; 

      }  
      $a=2; 
     } 

     if($rowper[1]>= $checkdate){  

      if($b>2){ 

       while($a< mysqli_num_fields($result)) { 

        $previnv[$a]; 

        if($rowinv[$a]!=0){ 

         $rowper[$a]=$rowinv[$a]; 

         $previnv[$a]=$rowper[$a]; 

         /* the 'p' is because column name was made by item # + p at end to make valid colum name */ 
         $query="UPDATE perpetual SET ".$it[$a]."p ='".$rowper[$a]."' WHERE date='".$rowper[1]."' LIMIT 1"; 

         mysqli_query($link, $query); 

        }else{ 

         $rowper[$a]=$previnv[$a] - $rowdaily[$a] + $rowpo[$a]; 

         $previnv[$a]=$rowper[$a]; 

         $query="UPDATE perpetual SET ".$it[$a]."p ='".$rowper[$a]."' WHERE date='".$rowper[1]."' LIMIT 1"; 

         mysqli_query($link, $query); 
        } 
        $a++;  
       } 
      } 
     } 
     $b++; 
    } 
?> 
+1

毎日これをやっているなら、あなたのSQLサーバで 'stored procedures'を使うことができます。そうすれば、SQL Server側ですべて完了し、データのクエリとデータのアップロードを待つことはありません。 – atayenel

答えて

1

ストアドプロシージャとユーザー定義関数は、あなたが探しているものです。特定の時間に実行するようにスケジュール設定して、テーブルに対して操作を実行できます。

サイドノートは、ETLの背後にある基本を覚えています。

抽出 - 変換 - ロードの順番で実行します。

+0

私はPHPとMySQLにとって非常に新しく、ストアドプロシージャやユーザ定義関数についてはまだ研究していません。また、まだETLについて学んでいないhavent: -/ – Brandon

+1

mysqlストアドプロシージャを調べます。 PHPはまったく必要ないはずです。 ETL原則を使用すると、次のステップの前に各ステップを個別に実行する方が効率的です。データを移動してからデータを変更し、データを別々に挿入します。 – jacksonecac

+0

これは、上のコードから更新行を削除し、最後に何とかすべてを一度に挿入できるということですか? – Brandon

関連する問題