0

約 14000 個のオブジェクト ID を持つ .csv ファイルがあります。私の目標は、これらの objectID に関連付けられた特定のフィールドを取得することです。これまでのところ、すべての objectID をカンマ区切りのリストに連結して、このクエリの最後に追加しました。

SELECT objectName, objectType FROM objectTable WHERE objectID IN 1001, 1002, 1003... 

ただし、私のデータベースには約 1600 万の一意のオブジェクト ID があるため、これは非常に (非常に) 遅くなります。そのようなクエリを構造化するためのより良い方法はありますか? これをバッチで実行する必要がありますか? (私もこれを試しましたが、耐えられないほど遅かったです)または私のアプローチ全体が間違っていますか?

4

3 に答える 3

2

objectID をテーブルにロードし、それに対して結合します。

SELECT objectName, objectType
FROM objectTable INNER JOIN objectids ON (objecttable.objectid = objectids.id)
于 2012-09-27T00:59:53.420 に答える
1

すべての数字を含むコンマ区切りの文字列が既にある場合は、使用するクライアントの構文で準備済みステートメントを使用できます。プレーン SQL の例:

PREPARE myplan (text) AS
    SELECT o.objectname, o.objecttype
    FROM   (SELECT unnest(string_to_array($1, ','))::int AS objectid) x
    JOIN   objecttable o USING (objectid);

EXECUTE myplan('1001, 1002, 1003');

または、データベース サーバー上の有効な CSV ファイルから開始する場合は、一時テーブルを作成し、COPYそこにデータを (COPY非常に高速に)転送してから、一時テーブルに転送しJOINます。

CREATE TEMP TABLE tmp_x (objectid int);

COPY tmp_x FROM '/path/to/my/file.csv';

    SELECT o.objectname, o.objecttype
    FROM   tmp_x
    JOIN   objecttable o USING (objectid);

DROP TABLE tmp_x;   -- optional; dropped automatically at end of session

ファイルが別のマシンにある場合は、代わりにpsqlのメタコマンドを使用してください。\copy

あなたは確かにインデックスを持っていますobjecttable.objectidか?それは非常に重要です。

于 2012-09-27T01:31:00.290 に答える
1

16m のオブジェクト ID を使用すると、クエリ文字列を実際に実行するよりもアップロードするのに時間がかかる可能性があります。

すべての objectID がプリロードされた CSV ファイルからテーブルを作成します。このテーブルを「objectIDs」と呼び、メイン行が「id」であるとします。今、あなたは言うことができます:

SELECT objectName, objectType FROM objectTable
INNER JOIN objectIDs ON objectIDs.objectID=objectTable.objectID

内部結合は、objectTable 内の結合されていないものを自動的に除外し、ID テーブルと 1:1 の関係で結合します。

于 2012-09-27T01:00:00.173 に答える