2012-09-27 20 views
0

我有一個包含大約14000個對象ID的.csv文件。我的目標是檢索與這些objectID關聯的某些字段。到目前爲止,我所做的是串接所有的ObjectID到逗號分隔的列表,我追加到該查詢的末尾:「SELECT .. IN」的侷限性pgsql查詢

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

然而,這是很(非常)慢作爲我的數據庫中有大約16萬個獨特的ObjectID 。有沒有更好的方法來構建這樣的查詢?我必須批量運行這個嗎? (我也試過了,但速度太慢了),還是我的整個方法都錯了?

+0

你有objectID的索引嗎? – Kuberchaun

+0

是的,對象ID有一個索引 – emilio

+0

你當前查詢的解釋計劃確實可以幫助人們回答這個問題。 – Kuberchaun

回答

2

將objectID加載到一個表中,然後加入。

SELECT objectName, objectType 
FROM objectTable INNER JOIN objectids ON (objecttable.objectid = objectids.id) 
1

w/16m objectIDs,它可能只是花了很多時間上傳查詢字符串,而不是實際運行它。

從CSV文件中創建一個表格,並預加載所有的objectID。假設你稱這個表爲「objectIDs」,而主行是「id」。現在,你可以說:

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

內連接會自動剔除出objectTable任何未連接的東西,並會在1聯接:你的ID的表1的關係。

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's meta-command \copy代替。

您當然有一個索引objecttable.objectid?這很關鍵。