我有一个包含大约14000个objectID的.csv文件。我的目标是检索与这些objectID关联的某些字段。到目前为止,我所做的是将所有objectID连接成一个以逗号分隔的列表,并附加到此查询的末尾:
SELECT objectName, objectType FROM objectTable WHERE objectID IN 1001, 1002, 1003...
然而,这非常(非常)慢,因为我的数据库有大约1600万个唯一的objectID。有没有更好的方法来构建这样的查询?我必须分批运行吗? (我也试过这个但是速度难以忍受)或者我的整个方法都错了吗?
答案 0 :(得分:2)
将objectID加载到表中,然后加入该表。
SELECT objectName, objectType
FROM objectTable INNER JOIN objectids ON (objecttable.objectid = objectids.id)
答案 1 :(得分:1)
w / 16m objectIDs,上传查询字符串可能需要花费更长的时间而不是实际运行它。
从CSV文件创建一个表,预先加载所有objectID。假设您将此表称为“objectIDs”,主行为“id”。现在你可以说:
SELECT objectName, objectType FROM objectTable
INNER JOIN objectIDs ON objectIDs.objectID=objectTable.objectID
内连接将自动剔除objectTable中任何未连接的东西,并将与您的ID表以1:1的关系加入。
答案 2 :(得分: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
数据({1}非常快),然后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
如果您的文件位于其他计算机上,请改用COPY
。
你肯定有objecttable.objectid
的索引吗?这是至关重要的。