Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的限制”;选择。。在;pgsql查询_Sql_Postgresql - Fatal编程技术网

“的限制”;选择。。在;pgsql查询

“的限制”;选择。。在;pgsql查询,sql,postgresql,Sql,Postgresql,我有一个.csv文件,其中包含大约14000个objectid。我的目标是检索与这些objectid关联的某些字段。到目前为止,我所做的是将所有objectid连接到一个逗号分隔的列表中,并将其附加到此查询的末尾: SELECT objectName, objectType FROM objectTable WHERE objectID IN 1001, 1002, 1003... 然而,这是非常(非常)缓慢的,因为我的数据库有大约1600万个唯一的objectid。有没有更好的方法来构造这

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

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

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

将objectid加载到一个表中,然后针对该表进行连接

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

将objectid加载到一个表中,然后针对该表进行连接

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

对于16m ObjectId,上传查询字符串可能比实际运行查询字符串花费更长的时间

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

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

内部联接将自动剔除objectTable中任何未联接的内容,并将与IDs表以1:1的关系联接。

w/16m ObjectId,上载查询字符串可能比实际运行查询字符串花费更长的时间

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

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

内部联接将自动剔除objectTable中任何未联接的内容,并将与IDs表以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文件开始,则创建一个临时表,
将数据复制到该表中(非常快),然后
加入到该表中

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
如果您的文件位于不同的计算机上,请改用


您肯定在
objecttable.objectid
上有索引吗?这很关键。

如果您已经有一个包含所有数字的逗号分隔字符串,那么您可以使用一个预先准备好的语句,以及您使用的任何客户端的语法。普通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文件开始,则创建一个临时表,
将数据复制到该表中(非常快),然后
加入到该表中

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
如果您的文件位于不同的计算机上,请改用


您肯定在
objecttable.objectid
上有索引吗?这很关键。

你有objectID索引吗?是的,objectID上有索引。你当前查询的解释计划将真正帮助人们回答这个问题。@andy lester的回答正是我需要的。我的计划只是为objectID列表获取附加字段。你对objectID有索引吗?是的,objectID上有索引。你当前查询的解释计划将真正帮助人们回答这个问题。@andy lester的回答正是我需要的。我的计划只是获取objectid列表的附加字段。