4

開発中の Web アプリにローカル データベースが入力される速度を最適化しようとしています。現在、PHP を使用してデータベースにアクセスし、Javascript を使用してそのデータをローカル データベースに挿入します。

問題は、エントリが2つ以上あると速度が低下することです。これは、すべての行に対して個別のSQLクエリを実行するためだと確信しています。私はトランザクション(コミットとロールバックなど)について調べてきましたが、それは答えのように思えますが、それを実装する方法や場所さえ完全にはわかりません。

以下は、特定のテーブルをロードする関数の 1 つのサンプルです。

function ploadcostcodes()
{
$IPAddress = '';
$User = '';
$Password = '';
$Database = '';
$Company  = '';
$No='';
$Name='';
ploadSQLConnection($IPAddress,$User,$Password,$Database,$Company);

// これは、情報の取得元である実際のデータベースに接続します。

$Login = 'XXXXXXX';
$conn=mssql_connect($IPAddress,$Login,$Password);
 if (!$conn )
{
      die( print_r('Unable to connect to server', true));
}
 mssql_select_db($Database, $conn);

 $indent="        ";

$sql="SELECT Cost_Code_No as No, Description as Name, Unit_of_Measure FROM v_md_allowed_user_cost_codes WHERE Company_No = " . $Company . " and User_No = '" . $User . "'";

 $rs=mssql_query($sql);
 if (!$rs)
 {
   exit("No Data Found");
 }

 while ($row = mssql_fetch_array($rs))
 {
     $No = addslashes($row['No']);
     $Name = addslashes($row['Name']);
     $Name = str_replace("'",'`',$Name);
     $Unit = addslashes($row['Unit_of_Measure']);

  //THIS IS WHERE I SEE THE PROBLEM

     echo $indent."exeSQL(\"INSERT INTO Cost_Codes (Cost_Code_No,Name,Unit_of_Measure) VALUES('".$No."','".$Name."','".$Unit."')\",\"Loading Cost Codes...\"); \r\n";
 }
 mssql_free_result($rs);
 mssql_close($conn);
 return 0;
}

何がトランザクションを必要とするのかわかりません(または、それが実行される必要がある場合でも)。データにアクセスするための MSSQL、データを挿入するための SQLite、および PHP コードを実行する Javascript があります。

4

1 に答える 1

16

プレースホルダーを使用してクエリを準備し、適切な引数を使用して各行に対してクエリを実行します。このようなもの(JS部分のみ、配列ヘルパーにunderscore.jsを使用):

db.transaction(function(tx) {
    var q = 'INSERT INTO Cost_Codes (Cost_Code_No, Name, Unit_Of_Measure) VALUES (?, ?, ?)';
    _(rows).each(function(row) {
        tx.executeSql(q, [row.code, row.name, row.unit]);
    });
});

編集:プレースホルダーを使用したクエリには、主に2つの利点があります。

  1. これにより、DBエンジンがクエリプランをキャッシュして再利用するのがはるかに簡単になります(100回の異なるクエリを1回実行するのではなく、同じクエリを100回実行するため)。
  2. これにより、データのエスケープとSQLインジェクションの回避がはるかに簡単になります。
于 2012-04-05T15:43:01.110 に答える