2011-07-06 13 views
0

テーブル(A、B、C、D)が4つあり、empIdが共通しているとします。中間データを保存してSQLクエリ間で共有するにはどうすればよいですか?

いくつかの複雑なクエリを実行した後、私は対象となるempIdsのリストを取得します。

今私はSelect .... from ..... where empId IN LISTを実行する必要があります。

empIdsのリストを変数に保存して、毎回複雑なクエリを実行してempIdsのリストを取得しないようにしたいとします。

empIdsを一時的なスペースに保存するにはどうしますか?

このようにして、このような複雑なクエリを毎回実行することを減らすことができます。

+2

どのデータベースシステムを使用していますか?一時表を使用する構文は、データベースのブランドによって異なります。 – Guffa

+1

リストにはいくつの 'empIds'が含まれていますか?あなたはどのくらいの頻度でリストに質問しますか?どのくらいあなたのリストを保持したいですか?リストはユーザーに共通ですか、特定のユーザーに制限されていますか?基礎となる表のデータはどのくらいの頻度で変更されますか?格納されたリストが古くなったとき何をしたいですか?必要に応じて元のクエリを実行するよりも、キャッシュを管理するのにかかるエネルギーが節約できることを確認するためのベンチマークを行ったことがありますか? – APC

+0

フィードバックをお寄せいただきありがとうございます。次回はご注意ください。 –

答えて

1

の内容にアクセスできますテーブル#tmp。

+1

これは、同じセッションで後続のすべてのクエリを実行する場合にのみ有効です。 – JNK

+0

この構文はOracle 11iで有効ですか? –

1

データベースは結合のために最適化されているため、テーブルまたはビューにempIdsという高価なものを格納してから、そのデータベースに結合する必要があります。

  1. MySQLはここで伝えられるところで「世界で最も人気のあるオープンソースのデータベース」であるので
  2. は無料(または安価なため)のための一時テーブルに参加し、そのテーブルに

を表

  • 挿入IDを作成そのドキュメントからの構文は次のとおりです。

    ステップ1
    http://dev.mysql.com/doc/refman/5.1/en/create-table.html

    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 
        (create_definition,...) 
        [table_options] 
        [partition_options] 
    

    例教訓的使用のためにのみ:のみ教訓的使用のための

    CREATE TABLE expensive_ids (id); 
    

    ステップ2
    http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

    INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] 
        [INTO] tbl_name [(col_name,...)] 
        SELECT ... 
        [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 
    

    例:

    INSERT INTO expensive_ids (id) VALUES (1); 
    

    ステップ3
    http://dev.mysql.com/doc/refman/5.1/en/select.html

    SELECT 
        [ALL | DISTINCT | DISTINCTROW ] 
         [HIGH_PRIORITY] 
         [STRAIGHT_JOIN] 
         [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 
         [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 
        select_expr [, select_expr ...] 
        [FROM table_references 
    

    のみ教訓的使用のための例:あなたは今

    Select field1,field2,...fieldN INTO #tmp FROM SourceTable 
    

    :あなたは構文を使用して、メモリ内のテーブルを作成することができ

    SELECT my_other_table.id, expensive_ids.id 
        FROM my_other_table 
         LEFT JOIN expensive_ids 
         ON expensive_ids.id = my_other_table.id; 
    
  • +0

    私はオラクル11をusngです、empId私のデータが含まれている数千とクエリは非常に頻繁に使用されます。表のデータも非常に頻繁に変更されます。私は、ストアドプロシージャの範囲内でのみデータをキャッシュする必要があります、永遠にそれを保つ必要はありません。そしてempIdのリストは複雑なクエリから来るでしょう。毎回異なるクエリのconstarintsになる可能性があります –