1

一時テーブルについて学習したばかりですが、それらを使用することで、いくつかの大きなクエリで非常に高速になりました。

私が抱えている問題は、テーブルを作成するときに、それを使用する次のクエリの全長にわたって、またはスクリプトが終了するまで、テーブルが持続しないことです。

私はそれを使用して作成しています:

$dbh->exec("CREATE TEMPORARY TABLE _temp_unique_invoice_ref ENGINE = MEMORY AS
        (SELECT jobRef, invoiceRef FROM invoices_out_reference GROUP BY invoiceRef)") ;

その後のクエリは数百行の長さで、サブクエリで一時テーブルを何度も使用しようとしますが、最初のサブクエリに対してのみ機能し、残りのクエリはテーブルが存在しないと言って失敗します。

また、このクエリは多くのユーザーによって10秒ごとに実行される可能性があるため、シナリオはさらに複雑になります。そのため、10秒が経過する前に何度も実行される可能性があります。

TEMPORARYキーワードやドロップなどを使用せずにこれを機能させるにはどうすればよいですか?


次のクエリは、1つの大きなクエリです。同じオブジェクトでPrepareが呼び出されるので、新しい接続が発生する可能性がありますか?大きなクエリの先頭にcreatetable構文を配置し、;で終了すると機能しますか?

4

3 に答える 3

1

一時テーブルは、1つのクエリで複数回使用することはできません。

ただし、データが大きすぎない場合は、次のコマンドでコピーを作成できます。

CREATE TEMPORARY t2 SELECT * FROM t;
CREATE TEMPORARY t3 SELECT * FROM t;
CREATE TEMPORARY t4 SELECT * FROM t;

大きなクエリでそれらを使用します。

于 2012-06-26T09:48:38.050 に答える
0

セットアップに関する十分な情報がありません。だから私は大げさな推測を試みます:クエリごとに新しい接続を作成していて、一時テーブルが接続にバインドされているため、他のテーブルには存在しない可能性がありますか?

于 2012-06-26T09:43:21.283 に答える
0

::を使用できます

Insert into temp_table select from table

テーブルと同じ説明のテーブルが自動的に作成され、完了したらドロップします。

于 2012-06-26T09:43:46.383 に答える