0

我有一个包含大约 14000 个 objectID 的 .csv 文件。我的目标是检索与这些 objectID 关联的某些字段。到目前为止,我所做的是将所有 objectID 连接到一个逗号分隔的列表中,我将其附加到此查询的末尾:

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

然而,这非常(非常)慢,因为我的数据库有大约 1600 万个唯一的 objectID。有没有更好的方法来构建这样的查询?我必须分批运行吗?(我也尝试过,但速度慢得令人难以忍受)还是我的整个方法都错了?

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

w/ 16m objectIDs,上传查询字符串可能比实际运行它需要更长的时间。

从您的 CSV 文件创建一个表,并预加载所有 objectID。假设您将此表称为“objectIDs”,主行是“id”。现在你可以说:

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

内连接会自动剔除 objectTable 中所有未连接的东西,并与你的 IDs 表以 1:1 的关系连接。

于 2012-09-27T01:00:00.173 回答
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 元命令\copy

你肯定有索引objecttable.objectid吗?这很关键。

于 2012-09-27T01:31:00.290 回答