【问题标题】:limitations of "SELECT .. IN" pgsql query“SELECT .. IN” pgsql 查询的限制
【发布时间】:2012-09-27 00:53:25
【问题描述】:

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

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

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

【问题讨论】:

  • 你有objectID的索引吗?
  • 是的,objectID上有一个索引
  • 您当前查询的解释计划确实可以帮助人们回答这个问题。
  • @andy-lester 的回答正是我所需要的。我的计划只是获取 objectID 列表的附加字段。

标签: sql postgresql


【解决方案1】:

将 objectID 加载到表中,然后加入。

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

【讨论】:

    【解决方案2】:

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

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

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

    inner join 会自动剔除 objectTable 中所有未加入的东西,并与你的 IDs 表以 1:1 的关系加入。

    【讨论】:

      【解决方案3】:

      如果您已经有一个包含所有数字的逗号分隔字符串,您可以使用准备好的语句 - 使用您使用的任何客户端的语法。普通 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 的索引吗?这很关键。

      【讨论】:

        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 2012-12-23
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多